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

[incubator-doris] branch master updated: [Mysql Compatibility] Support convert() and signed/unsigned interger cast (#4364)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new f218327  [Mysql Compatibility] Support convert() and signed/unsigned interger cast (#4364)
f218327 is described below

commit f218327dd97c10691b649e6fde7ad6f9fa14beaa
Author: Mingyu Chen <mo...@gmail.com>
AuthorDate: Thu Aug 27 12:07:58 2020 +0800

    [Mysql Compatibility] Support convert() and signed/unsigned interger cast (#4364)
    
    1. Support convert(expr, target_type) function, which is same as CastExpr
    2. Support cast (expr as signed/unsigned int)
       This is just for compatibility, the signed/unsigned specification is meaningless.
---
 .../exec/schema_scanner/schema_columns_scanner.cpp |  3 +++
 fe/fe-core/src/main/cup/sql_parser.cup             | 23 +++++++++++++++++++---
 .../java/org/apache/doris/catalog/SchemaTable.java |  4 ++++
 fe/fe-core/src/main/jflex/sql_scanner.flex         |  2 ++
 4 files changed, 29 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 c96c986..640f7bd 100644
--- a/be/src/exec/schema_scanner/schema_columns_scanner.cpp
+++ b/be/src/exec/schema_scanner/schema_columns_scanner.cpp
@@ -39,6 +39,7 @@ SchemaScanner::ColumnDesc SchemaColumnsScanner::_s_col_columns[] = {
     { "CHARACTER_OCTET_LENGTH",     TYPE_BIGINT, sizeof(int64_t), true },
     { "NUMERIC_PRECISION",          TYPE_BIGINT, sizeof(int64_t), true },
     { "NUMERIC_SCALE",              TYPE_BIGINT, sizeof(int64_t), true },
+    { "DATETIME_PRECISION",         TYPE_BIGINT, sizeof(int64_t), true },
     { "CHARACTER_SET_NAME", TYPE_VARCHAR, sizeof(StringValue),   true  },
     { "COLLATION_NAME",     TYPE_VARCHAR, sizeof(StringValue),   true  },
     { "COLUMN_TYPE",        TYPE_VARCHAR, sizeof(StringValue),   false },
@@ -48,6 +49,8 @@ SchemaScanner::ColumnDesc SchemaColumnsScanner::_s_col_columns[] = {
     { "COLUMN_COMMENT",     TYPE_VARCHAR, sizeof(StringValue),   false },
     { "COLUMN_SIZE",        TYPE_BIGINT,  sizeof(int64_t),   true },
     { "DECIMAL_DIGITS",     TYPE_BIGINT,  sizeof(int64_t),   true },
+    { "GENERATION_EXPRESSION",     TYPE_VARCHAR, sizeof(StringValue),   true },
+    { "SRS_ID",             TYPE_BIGINT,  sizeof(int64_t),   true },
 };
 
 SchemaColumnsScanner::SchemaColumnsScanner() : 
diff --git a/fe/fe-core/src/main/cup/sql_parser.cup b/fe/fe-core/src/main/cup/sql_parser.cup
index 5ae323c..fcd265a 100644
--- a/fe/fe-core/src/main/cup/sql_parser.cup
+++ b/fe/fe-core/src/main/cup/sql_parser.cup
@@ -231,7 +231,7 @@ terminal String KW_ADD, KW_ADMIN, KW_AFTER, KW_AGGREGATE, KW_ALL, KW_ALTER, KW_A
     KW_BACKEND, KW_BACKUP, KW_BETWEEN, KW_BEGIN, KW_BIGINT, KW_BITMAP, KW_BITMAP_UNION, KW_BOOLEAN, KW_BOTH, KW_BROKER, KW_BACKENDS, KW_BY, KW_BUILTIN,
     KW_CANCEL, KW_CASE, KW_CAST, KW_CHAIN, KW_CHAR, KW_CHARSET, KW_CHECK, KW_CLUSTER, KW_CLUSTERS,
     KW_COLLATE, KW_COLLATION, KW_COLUMN, KW_COLUMNS, KW_COMMENT, KW_COMMIT, KW_COMMITTED,
-    KW_CONFIG, KW_CONNECTION, KW_CONNECTION_ID, KW_CONSISTENT, KW_COUNT, KW_CREATE, KW_CROSS, KW_CUBE, KW_CURRENT, KW_CURRENT_USER,
+    KW_CONFIG, KW_CONNECTION, KW_CONNECTION_ID, KW_CONSISTENT, KW_CONVERT, KW_COUNT, KW_CREATE, KW_CROSS, KW_CUBE, KW_CURRENT, KW_CURRENT_USER,
     KW_DATA, KW_DATABASE, KW_DATABASES, KW_DATE, KW_DATETIME, KW_DAY, KW_DECIMAL, KW_DECOMMISSION, KW_DEFAULT, KW_DESC, KW_DESCRIBE,
     KW_DELETE, KW_DISTINCT, KW_DISTINCTPC, KW_DISTINCTPCSA, KW_DISTRIBUTED, KW_DISTRIBUTION, KW_DYNAMIC, KW_BUCKETS, KW_DIV, KW_DOUBLE, KW_DROP, KW_DROPP, KW_DUPLICATE,
     KW_ELSE, KW_ENABLE, KW_END, KW_ENGINE, KW_ENGINES, KW_ENTER, KW_ERRORS, KW_EVENTS, KW_EXCEPT, KW_EXISTS, KW_EXPORT, KW_EXTERNAL, KW_EXTRACT,
@@ -255,7 +255,7 @@ terminal String KW_ADD, KW_ADMIN, KW_AFTER, KW_AGGREGATE, KW_ALL, KW_ALTER, KW_A
     KW_RANDOM, KW_RANGE, KW_READ, KW_RECOVER, KW_REGEXP, KW_RELEASE, KW_RENAME,
     KW_REPAIR, KW_REPEATABLE, KW_REPOSITORY, KW_REPOSITORIES, KW_REPLACE, KW_REPLACE_IF_NOT_NULL, KW_REPLICA, KW_RESOURCE, KW_RESOURCES, KW_RESTORE, KW_RETURNS, KW_RESUME, KW_REVOKE,
     KW_RIGHT, KW_ROLE, KW_ROLES, KW_ROLLBACK, KW_ROLLUP, KW_ROUTINE, KW_ROW, KW_ROWS,
-    KW_SCHEMA, KW_SCHEMAS, KW_SECOND, KW_SELECT, KW_SEMI, KW_SERIALIZABLE, KW_SESSION, KW_SET, KW_SETS, KW_SHOW,
+    KW_SCHEMA, KW_SCHEMAS, KW_SECOND, KW_SELECT, KW_SEMI, KW_SERIALIZABLE, KW_SESSION, KW_SET, KW_SETS, KW_SHOW, KW_SIGNED,
     KW_SMALLINT, KW_SNAPSHOT, KW_SONAME, KW_SPLIT, KW_START, KW_STATUS, KW_STOP, KW_STORAGE, KW_STRING,
     KW_SUM, KW_SUPERUSER, KW_SYNC, KW_SYSTEM,
     KW_TABLE, KW_TABLES, KW_TABLET, KW_TASK, KW_TEMPORARY, KW_TERMINATED, KW_THAN, KW_TIME, KW_THEN, KW_TIMESTAMP, KW_TINYINT,
@@ -478,6 +478,8 @@ nonterminal Boolean opt_tmp;
 nonterminal OutFileClause opt_outfile;
 nonterminal RoutineLoadDataSourceProperties opt_datasource_properties;
 
+nonterminal Boolean opt_signed_unsigned;
+
 precedence nonassoc COMMA;
 precedence nonassoc STRING_LITERAL;
 precedence nonassoc KW_COLUMNS;
@@ -3788,7 +3790,7 @@ type ::=
   {: RESULT = Type.TINYINT; :}
   | KW_SMALLINT opt_field_length
   {: RESULT = Type.SMALLINT; :}
-  | KW_INT opt_field_length
+  | opt_signed_unsigned KW_INT opt_field_length
   {: RESULT = Type.INT; :}
   | KW_BIGINT opt_field_length
   {: RESULT = Type.BIGINT; :}
@@ -3844,6 +3846,17 @@ opt_field_length ::=
   {: RESULT = null; :}
   ;
 
+// signed and unsigned is meaningless for Doris.
+// This is just for MySQL compatibility now.
+opt_signed_unsigned ::=
+  /* empty */
+  {: RESULT = true; :}
+  | KW_SIGNED
+  {: RESULT = true; :}
+  | KW_UNSIGNED
+  {: RESULT = false; :}
+  ;
+
 type_def ::=
   type:t
   {: RESULT = new TypeDef(t); :}
@@ -4034,6 +4047,8 @@ non_pred_expr ::=
   {: RESULT = new BoolLiteral(true); :}
   | KW_NULL KW_IS KW_NOT KW_NULL
   {: RESULT = new BoolLiteral(false); :}
+  | KW_CONVERT LPAREN expr:e COMMA type_def:targetType RPAREN
+  {: RESULT = new CastExpr(targetType, e); :}
   ;
 
 expr_pipe_list ::=
@@ -4563,6 +4578,8 @@ keyword ::=
     {: RESULT = id; :}
     | KW_CONNECTION_ID:id
     {: RESULT = id; :}
+    | KW_CONVERT:id
+    {: RESULT = id; :}
     | KW_DATA:id
     {: RESULT = id; :}
     | KW_DATE:id
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/SchemaTable.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/SchemaTable.java
index 83ceebd..a3788e2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/SchemaTable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/SchemaTable.java
@@ -221,6 +221,7 @@ public class SchemaTable extends Table {
                                             ScalarType.createType(PrimitiveType.BIGINT))
                                     .column("NUMERIC_PRECISION", ScalarType.createType(PrimitiveType.BIGINT))
                                     .column("NUMERIC_SCALE", ScalarType.createType(PrimitiveType.BIGINT))
+                                    .column("DATETIME_PRECISION", ScalarType.createType(PrimitiveType.BIGINT))
                                     .column("CHARACTER_SET_NAME", ScalarType.createVarchar(32))
                                     .column("COLLATION_NAME", ScalarType.createVarchar(32))
                                     .column("COLUMN_TYPE", ScalarType.createVarchar(32))
@@ -230,6 +231,8 @@ public class SchemaTable extends Table {
                                     .column("COLUMN_COMMENT", ScalarType.createVarchar(255))
                                     .column("COLUMN_SIZE", ScalarType.createType(PrimitiveType.BIGINT))
                                     .column("DECIMAL_DIGITS", ScalarType.createType(PrimitiveType.BIGINT))
+                                    .column("GENERATION_EXPRESSION", ScalarType.createVarchar(64))
+                                    .column("SRS_ID", ScalarType.createType(PrimitiveType.BIGINT))
                                     .build()))
                     .put("character_sets", new SchemaTable(
                             SystemIdGenerator.getNextId(),
@@ -307,3 +310,4 @@ public class SchemaTable extends Table {
         return tTableDescriptor;
     }
 }
+
diff --git a/fe/fe-core/src/main/jflex/sql_scanner.flex b/fe/fe-core/src/main/jflex/sql_scanner.flex
index 564e514..21371ec 100644
--- a/fe/fe-core/src/main/jflex/sql_scanner.flex
+++ b/fe/fe-core/src/main/jflex/sql_scanner.flex
@@ -135,6 +135,7 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("connection", new Integer(SqlParserSymbols.KW_CONNECTION));
         keywordMap.put("connection_id", new Integer(SqlParserSymbols.KW_CONNECTION_ID));
         keywordMap.put("consistent", new Integer(SqlParserSymbols.KW_CONSISTENT));
+        keywordMap.put("convert", new Integer(SqlParserSymbols.KW_CONVERT));
         keywordMap.put("count", new Integer(SqlParserSymbols.KW_COUNT));
         keywordMap.put("create", new Integer(SqlParserSymbols.KW_CREATE));
         keywordMap.put("cross", new Integer(SqlParserSymbols.KW_CROSS));
@@ -328,6 +329,7 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("set", new Integer(SqlParserSymbols.KW_SET));
         keywordMap.put("sets", new Integer(SqlParserSymbols.KW_SETS));
         keywordMap.put("show", new Integer(SqlParserSymbols.KW_SHOW));
+        keywordMap.put("signed", new Integer(SqlParserSymbols.KW_SIGNED));
         keywordMap.put("smallint", new Integer(SqlParserSymbols.KW_SMALLINT));
         keywordMap.put("snapshot", new Integer(SqlParserSymbols.KW_SNAPSHOT));
         keywordMap.put("soname", new Integer(SqlParserSymbols.KW_SONAME));


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