You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2022/07/27 04:22:22 UTC

[doris] branch master updated: [Improvement] information_schema.columns support COLUMN KEY (#11228)

This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 4f3b4c7efc [Improvement] information_schema.columns support COLUMN KEY (#11228)
4f3b4c7efc is described below

commit 4f3b4c7efc0c8dfd10651698c010553b7be48f7a
Author: Stalary <st...@163.com>
AuthorDate: Wed Jul 27 12:22:17 2022 +0800

    [Improvement] information_schema.columns support COLUMN KEY (#11228)
---
 .../exec/schema_scanner/schema_columns_scanner.cpp | 14 +++++++--
 .../java/org/apache/doris/catalog/KeysType.java    | 33 ++++++++++++++++++++++
 .../apache/doris/service/FrontendServiceImpl.java  |  5 ++++
 gensrc/thrift/FrontendService.thrift               |  1 +
 .../data/account/test_information_schema.out       |  3 ++
 .../suites/account/test_information_schema.groovy  |  3 ++
 6 files changed, 56 insertions(+), 3 deletions(-)

diff --git a/be/src/exec/schema_scanner/schema_columns_scanner.cpp b/be/src/exec/schema_scanner/schema_columns_scanner.cpp
index bfa2c93e24..6102e128af 100644
--- a/be/src/exec/schema_scanner/schema_columns_scanner.cpp
+++ b/be/src/exec/schema_scanner/schema_columns_scanner.cpp
@@ -343,9 +343,17 @@ Status SchemaColumnsScanner::fill_one_row(Tuple* tuple, MemPool* pool) {
     {
         void* slot = tuple->get_slot(_tuple_desc->slots()[16]->tuple_offset());
         StringValue* str_slot = reinterpret_cast<StringValue*>(slot);
-        str_slot->len = strlen("") + 1;
-        str_slot->ptr = (char*)pool->allocate(str_slot->len);
-        memcpy(str_slot->ptr, "", str_slot->len);
+        if (_desc_result.columns[_column_index].columnDesc.__isset.columnKey) {
+            str_slot->len = _desc_result.columns[_column_index].columnDesc.columnKey.length();
+            str_slot->ptr = (char*)pool->allocate(
+                    _desc_result.columns[_column_index].columnDesc.columnKey.length());
+            memcpy(str_slot->ptr, _desc_result.columns[_column_index].columnDesc.columnKey.c_str(),
+                   str_slot->len);
+        } else {
+            str_slot->len = strlen("") + 1;
+            str_slot->ptr = (char*)pool->allocate(str_slot->len);
+            memcpy(str_slot->ptr, "", str_slot->len);
+        }
     }
     // EXTRA
     {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/KeysType.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/KeysType.java
index cd2d1011e6..c280c522c3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/KeysType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/KeysType.java
@@ -19,12 +19,18 @@ package org.apache.doris.catalog;
 
 import org.apache.doris.thrift.TKeysType;
 
+/**
+ * Olap Table key type.
+ **/
 public enum KeysType {
     PRIMARY_KEYS,
     DUP_KEYS,
     UNIQUE_KEYS,
     AGG_KEYS;
 
+    /**
+     * Determine whether it is an aggregation type.
+     **/
     public boolean isAggregationFamily() {
         switch (this) {
             case AGG_KEYS:
@@ -35,6 +41,9 @@ public enum KeysType {
         }
     }
 
+    /**
+     * Type convert to thrift.
+     **/
     public TKeysType toThrift() {
         switch (this) {
             case PRIMARY_KEYS:
@@ -50,6 +59,9 @@ public enum KeysType {
         }
     }
 
+    /**
+     * Type convert from thrift
+     **/
     public static KeysType fromThrift(TKeysType tKeysType) {
         switch (tKeysType) {
             case PRIMARY_KEYS:
@@ -65,6 +77,9 @@ public enum KeysType {
         }
     }
 
+    /**
+     * Type convert to sql.
+     **/
     public String toSql() {
         switch (this) {
             case PRIMARY_KEYS:
@@ -79,4 +94,22 @@ public enum KeysType {
                 return null;
         }
     }
+
+    /**
+     * Type convert to information_schema, try to be compatible with mysql.
+     **/
+    public String toMetadata() {
+        switch (this) {
+            case PRIMARY_KEYS:
+                return "PRI";
+            case DUP_KEYS:
+                return "DUP";
+            case UNIQUE_KEYS:
+                return "UNI";
+            case AGG_KEYS:
+                return "AGG";
+            default:
+                return "";
+        }
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
index 55f49bd53a..48627907aa 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
@@ -427,6 +427,11 @@ public class FrontendServiceImpl implements FrontendService.Iface {
                         if (comment != null) {
                             colDef.setComment(comment);
                         }
+                        if (column.isKey()) {
+                            if (table instanceof OlapTable) {
+                                desc.setColumnKey(((OlapTable) table).getKeysType().toMetadata());
+                            }
+                        }
                         columns.add(colDef);
                     }
                 } finally {
diff --git a/gensrc/thrift/FrontendService.thrift b/gensrc/thrift/FrontendService.thrift
index a21452a5ab..5765e87da1 100644
--- a/gensrc/thrift/FrontendService.thrift
+++ b/gensrc/thrift/FrontendService.thrift
@@ -49,6 +49,7 @@ struct TColumnDesc {
   4: optional i32 columnPrecision
   5: optional i32 columnScale
   6: optional bool isAllowNull
+  7: optional string columnKey
 }
 
 // A column definition; used by CREATE TABLE and DESCRIBE <table> statements. A column
diff --git a/regression-test/data/account/test_information_schema.out b/regression-test/data/account/test_information_schema.out
index 1e6a3994f3..a5d980bc08 100644
--- a/regression-test/data/account/test_information_schema.out
+++ b/regression-test/data/account/test_information_schema.out
@@ -29,3 +29,6 @@
 -- !sql --
 476
 
+-- !sql --
+DUP
+
diff --git a/regression-test/suites/account/test_information_schema.groovy b/regression-test/suites/account/test_information_schema.groovy
index 71c89c6f58..6483e38616 100644
--- a/regression-test/suites/account/test_information_schema.groovy
+++ b/regression-test/suites/account/test_information_schema.groovy
@@ -88,6 +88,9 @@ suite("test_information_schema", "columns") {
         qt_sql "SELECT COUNT(*) FROM `columns` WHERE TABLE_SCHEMA='${dbName}'"
     }
 
+    sql "USE information_schema"
+    qt_sql "SELECT COLUMN_KEY FROM `columns` WHERE TABLE_SCHEMA='db_test_schema_1' and TABLE_NAME='tb_test_schema_1' and COLUMN_NAME='aaa'"
+
     for (int i = 1; i <= 5; i++) {
         def dbName = dbPrefix + i.toString()
         sql "DROP DATABASE `${dbName}`"


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org