[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.
This commit is contained in:
Mingyu Chen
2020-08-27 12:07:58 +08:00
committed by GitHub
parent 8b0b120aca
commit f218327dd9
4 changed files with 29 additions and 3 deletions

View File

@ -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

View File

@ -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;
}
}

View File

@ -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));