浏览代码

HUE-4335 [editor] New autocompleter should handle date types

- Added Impala INTERVAL
- Added missing keywords around value expressions
- Fixed issue with escaping of quoted strings
- Added precision and length to some primitive types
Johan Ahlen 9 年之前
父节点
当前提交
e5e8f80

+ 4 - 2
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql.jisonlex

@@ -173,6 +173,7 @@
 <impala>'FUNCTIONS'                        { return '<impala>FUNCTIONS'; }
 <impala>'GROUP'                            { return '<impala>GROUP'; }
 <impala>'INCREMENTAL'                      { return '<impala>INCREMENTAL'; }
+<impala>'INTERVAL'                         { return '<impala>INTERVAL'; }
 <impala>'INIT_FN'                          { return '<impala>INIT_FN'; }
 <impala>'INPATH'                           { this.begin('hdfs'); return '<impala>INPATH'; }
 <impala>'LAST'                             { return '<impala>LAST'; }
@@ -347,6 +348,7 @@
 <hive>'PERCENT_RANK'                       { addFunctionLocation(yylloc, 'variance_samp'); return 'ANALYTIC'; }
 
 [0-9]+                                     { return 'UNSIGNED_INTEGER'; }
+[0-9]+(?:[YSL]|BD)?                        { return 'UNSIGNED_INTEGER'; }
 [0-9]+E                                    { return 'UNSIGNED_INTEGER_E'; }
 [A-Za-z][A-Za-z0-9_]*                      { return 'REGULAR_IDENTIFIER'; }
 
@@ -412,7 +414,7 @@
 <backtickedValue>\`                        { this.popState(); return 'BACKTICK'; }
 
 \'                                         { this.begin('singleQuotedValue'); return 'SINGLE_QUOTE'; }
-<singleQuotedValue>[^']+                   {
+<singleQuotedValue>(?:\\[']|[^'])+         {
                                              if (yytext.indexOf('\u2020') !== -1 || yytext.indexOf('\u2021') !== -1) {
                                                this.popState();
                                                return 'PARTIAL_VALUE';
@@ -422,7 +424,7 @@
 <singleQuotedValue>\'                      { this.popState(); return 'SINGLE_QUOTE'; }
 
 \"                                         { this.begin('doubleQuotedValue'); return 'DOUBLE_QUOTE'; }
-<doubleQuotedValue>[^"]+                   { return 'VALUE'; }
+<doubleQuotedValue>(?:\\["]|[^"])+         { return 'VALUE'; }
 <doubleQuotedValue>\"                      { this.popState(); return 'DOUBLE_QUOTE'; }
 
 <<EOF>>                                    { return 'EOF'; }

+ 39 - 6
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql_main.jison

@@ -107,13 +107,16 @@ NonReservedKeyword
  | '<hive>USE'
  | '<hive>VIEW'
 // | '<hive>ASC'      // These cause conflicts, we could use a separate lexer state for DESCRIBE, ALTER and SHOW
+// | '<hive>CLUSTER'
 // | '<hive>DESC'
+// | '<hive>DISTRIBUTE'
 // | '<hive>FORMATTED'
 // | '<hive>FUNCTION'
 // | '<hive>INDEX'
 // | '<hive>INDEXES'
 // | '<hive>LIMIT'
 // | '<hive>SCHEMA'
+// | '<hive>SORT'
  ;
 
 NonReservedKeyword
@@ -187,9 +190,9 @@ SqlStatement_EDIT
 // This is a work-around for error handling when a statement starts with some token that the parser can understand but
 // it's not a valid statement (see ErrorStatement). It contains everything except valid starting tokens ('SELECT', 'USE' etc.)
 NonStartingToken
- : '<hive>ALL' | '<hive>ARRAY' | '<hive>AVRO' | '<hive>BINARY' | '<hive>BUCKETS' | '<hive>AS' | '<hive>CLUSTERED' | '<hive>COLLECTION' | '<hive>CONF' | '<hive>CROSS' | '<hive>CURRENT' | '<hive>DATE' | '<hive>DEFERRED' | '<hive>DELIMITED' | '<hive>ESCAPED' | '<hive>EXTENDED' | '<hive>EXTERNAL' | '<hive>FIELDS' | '<hive>FILE' | '<hive>FORMAT' | '<hive>FUNCTION' | '<hive>GRANT' | '<hive>IDXPROPERTIES' | '<hive>LATERAL' | '<hive>MACRO' | '<hive>PARTITION' | '<hive>REBUILD' | '<hive>TABLE' | '<hive>USER' | '<hive>ASC' | '<hive>COLUMNS' | '<hive>COMMENT' | '<hive>COMPACTIONS' | '<hive>DATA' | '<hive>DATABASES' | '<hive>DEFINED' | '<hive>DESC' | '<hive>STORED_AS_DIRECTORIES' | '<hive>FORMATTED' | '<hive>FUNCTIONS' | '<hive>INDEX' | '<hive>INDEXES' | '<hive>INPATH' | '<hive>INPUTFORMAT' | '<hive>ITEMS' | '<hive>JAR' | '<hive>LIMIT' | '<hive>KEYS' | '<hive>LINES' | '<hive>LOCATION' | '<hive>LOCKS' | '<hive>MAP' | '<hive>ORC' | '<hive>OUTPUTFORMAT' | '<hive>PARQUET' | '<hive>PARTITIONED' | '<hive>PARTITIONS' | '<hive>RCFILE' | '<hive>ROLE' | '<hive>ROLES' | '<hive>SCHEMA' | '<hive>SCHEMAS' | '<hive>SEQUENCEFILE' | '<hive>SERDE' | '<hive>SERDEPROPERTIES' | '<hive>SKEWED' | '<hive>SORTED' | '<hive>STORED' | '<hive>STRING' | '<hive>STRUCT' | '<hive>TABLES' | '<hive>TBLPROPERTIES' | '<hive>TEMPORARY' | '<hive>TERMINATED' | '<hive>TEXTFILE' | '<hive>TINYINT' | '<hive>TRANSACTIONS' | '<hive>UNIONTYPE' | '<hive>USING' | '<hive>VIEW' | '<hive>WINDOW' | '<hive>.' | '<hive>[' | '<hive>]'
- | '<impala>AGGREGATE' | '<impala>AVRO' | '<impala>CACHED' | '<impala>CLOSE_FN' | '<impala>COLUMN' | '<impala>COMMENT' | '<impala>DATA' | '<impala>DATABASES' | '<impala>DELIMITED' | '<impala>ESCAPED' | '<impala>EXTERNAL' | '<impala>FIELDS' | '<impala>FINALIZE_FN' | '<impala>FIRST' | '<impala>FORMAT' | '<impala>FORMATTED' | '<impala>FUNCTION' | '<impala>FUNCTIONS' | '<impala>GROUP' | '<impala>INCREMENTAL' | '<impala>INIT_FN' | '<impala>INPATH' | '<impala>LAST' | '<impala>LINES' | '<impala>LOCATION' | '<impala>MERGE_FN' | '<impala>NULLS' | '<impala>PARTITIONS' | '<impala>PREPARE_FN' | '<impala>REAL' | '<impala>RETURNS' | '<impala>SCHEMAS' | '<impala>SERIALIZE_FN' | '<impala>STATS' | '<impala>SYMBOL' | '<impala>TABLE' | '<impala>TABLES' | '<impala>USING' | '<impala>ANALYTIC' | '<impala>ANTI' | '<impala>CURRENT' | '<impala>GRANT' | '<impala>PARQUET' | '<impala>PARTITIONED' | '<impala>RCFILE' | '<impala>ROLE' | '<impala>ROLES' | '<impala>SEQUENCEFILE' | '<impala>SERDEPROPERTIES' | '<impala>SHUFFLE' | '<impala>STORED' | '<impala>TBLPROPERTIES' | '<impala>TERMINATED' | '<impala>TEXTFILE' | '<impala>UPDATE_FN' | '<impala>BROADCAST' | '<impala>...' | '<impala>.' | '<impala>[' | '<impala>]'
- | 'ALL' | 'AS' | 'ASC' | 'BETWEEN' | 'BIGINT' | 'BOOLEAN' | 'BY' | 'CASE' | 'CHAR' | 'CURRENT' | 'DATABASE' | 'DECIMAL' | 'DISTINCT' | 'DOUBLE' | 'DESC' | 'ELSE' | 'END' | 'EXISTS' | 'FALSE' | 'FLOAT' | 'FOLLOWING' | 'FROM' | 'FULL' | 'GROUP' | 'GROUPING' | 'IF' | 'IN' | 'INNER' | 'INT' | 'INTO' | 'IS' | 'JOIN' | 'LEFT' | 'LIKE' | 'LIMIT' | 'NOT' | 'NULL' | 'ON' | 'ORDER' | 'OUTER' | 'OVER' | 'PARTITION' | 'PRECEDING' | 'RANGE' | 'REGEXP' | 'RIGHT' | 'RLIKE' | 'ROW' | 'ROWS' | 'SCHEMA' | 'SEMI' | 'SET' | 'SMALLINT' | 'STRING' | 'TABLE' | 'THEN' | 'TIMESTAMP' | 'TINYINT' | 'TRUE' | 'UNION' | 'VARCHAR' | 'WHEN' | 'WHERE' | 'WITH' | 'ROLE'
+ : '<hive>ALL' | '<hive>ARRAY' | '<hive>AVRO' | '<hive>BINARY' | '<hive>BUCKETS' | '<hive>AS' | '<hive>CLUSTER' | '<hive>CLUSTERED' | '<hive>COLLECTION' | '<hive>CONF' | '<hive>CROSS' | '<hive>CURRENT' | '<hive>DATE' | '<hive>DEFERRED' | '<hive>DELIMITED' | '<hive>DISTRIBUTE' | '<hive>DISTRIBUTED' | '<hive>ESCAPED' | '<hive>EXTENDED' | '<hive>EXTERNAL' | '<hive>FIELDS' | '<hive>FILE' | '<hive>FORMAT' | '<hive>FUNCTION' | '<hive>GRANT' | '<hive>IDXPROPERTIES' | '<hive>LATERAL' | '<hive>MACRO' | '<hive>PARTITION' | '<hive>REBUILD' | '<hive>TABLE' | '<hive>USER' | '<hive>ASC' | '<hive>COLUMNS' | '<hive>COMMENT' | '<hive>COMPACTIONS' | '<hive>DATA' | '<hive>DATABASES' | '<hive>DEFINED' | '<hive>DESC' | '<hive>STORED_AS_DIRECTORIES' | '<hive>FORMATTED' | '<hive>FUNCTIONS' | '<hive>INDEX' | '<hive>INDEXES' | '<hive>INPATH' | '<hive>INPUTFORMAT' | '<hive>ITEMS' | '<hive>JAR' | '<hive>LIMIT' | '<hive>KEYS' | '<hive>LINES' | '<hive>LOCATION' | '<hive>LOCKS' | '<hive>MAP' | '<hive>ORC' | '<hive>OUTPUTFORMAT' | '<hive>PARQUET' | '<hive>PARTITIONED' | '<hive>PARTITIONS' | '<hive>RCFILE' | '<hive>ROLE' | '<hive>ROLES' | '<hive>SCHEMA' | '<hive>SCHEMAS' | '<hive>SEQUENCEFILE' | '<hive>SERDE' | '<hive>SERDEPROPERTIES' | '<hive>SKEWED' | '<hive>SORTED' | '<hive>STORED' | '<hive>STRING' | '<hive>STRUCT' | '<hive>TABLES' | '<hive>TBLPROPERTIES' | '<hive>TEMPORARY' | '<hive>TERMINATED' | '<hive>TEXTFILE' | '<hive>TINYINT' | '<hive>TRANSACTIONS' | '<hive>UNIONTYPE' | '<hive>USING' | '<hive>VIEW' | '<hive>WINDOW' | '<hive>.' | '<hive>[' | '<hive>]'
+ | '<impala>AGGREGATE' | '<impala>AVRO' | '<impala>CACHED' | '<impala>CLOSE_FN' | '<impala>COLUMN' | '<impala>COMMENT' | '<impala>DATA' | '<impala>DATABASES' | '<impala>DELIMITED' | '<impala>ESCAPED' | '<impala>EXTERNAL' | '<impala>FIELDS' | '<impala>FINALIZE_FN' | '<impala>FIRST' | '<impala>FORMAT' | '<impala>FORMATTED' | '<impala>FUNCTION' | '<impala>FUNCTIONS' | '<impala>GROUP' | '<impala>INCREMENTAL' | '<impala>INTERVAL' | '<impala>INIT_FN' | '<impala>INPATH' | '<impala>LAST' | '<impala>LINES' | '<impala>LOCATION' | '<impala>MERGE_FN' | '<impala>NULLS' | '<impala>PARTITIONS' | '<impala>PREPARE_FN' | '<impala>REAL' | '<impala>RETURNS' | '<impala>SCHEMAS' | '<impala>SERIALIZE_FN' | '<impala>STATS' | '<impala>SYMBOL' | '<impala>TABLE' | '<impala>TABLES' | '<impala>USING' | '<impala>ANALYTIC' | '<impala>ANTI' | '<impala>CURRENT' | '<impala>GRANT' | '<impala>PARQUET' | '<impala>PARTITIONED' | '<impala>RCFILE' | '<impala>ROLE' | '<impala>ROLES' | '<impala>SEQUENCEFILE' | '<impala>SERDEPROPERTIES' | '<impala>SHUFFLE' | '<impala>STORED' | '<impala>TBLPROPERTIES' | '<impala>TERMINATED' | '<impala>TEXTFILE' | '<impala>UPDATE_FN' | '<impala>BROADCAST' | '<impala>...' | '<impala>.' | '<impala>[' | '<impala>]'
+ | 'ALL' | 'AS' | 'ASC' | 'BETWEEN' | 'BIGINT' | 'BOOLEAN' | 'BY' | 'CASE' | 'CHAR' | 'CURRENT' | 'DATABASE' | 'DECIMAL' | 'DISTINCT' | 'DOUBLE' | 'DESC' | 'ELSE' | 'END' | 'EXISTS' | 'FALSE' | 'FLOAT' | 'FOLLOWING' | 'FROM' | 'FULL' | 'GROUP' | 'GROUPING' | 'HAVING' | 'IF' | 'IN' | 'INNER' | 'INT' | 'INTO' | 'IS' | 'JOIN' | 'LEFT' | 'LIKE' | 'LIMIT' | 'NOT' | 'NULL' | 'ON' | 'ORDER' | 'OUTER' | 'OVER' | 'PARTITION' | 'PRECEDING' | 'RANGE' | 'REGEXP' | 'RIGHT' | 'RLIKE' | 'ROW' | 'ROWS' | 'SCHEMA' | 'SEMI' | 'SET' | 'SMALLINT' | 'STRING' | 'TABLE' | 'THEN' | 'TIMESTAMP' | 'TINYINT' | 'TRUE' | 'UNION' | 'VARCHAR' | 'WHEN' | 'WHERE' | 'WITH' | 'ROLE'
  | 'AVG' | 'CAST' | 'COUNT' | 'MAX' | 'MIN' | 'STDDEV_POP' | 'STDDEV_SAMP' | 'SUM' | 'VARIANCE' | 'VAR_POP' | 'VAR_SAMP'
  | '<hive>COLLECT_SET' | '<hive>COLLECT_LIST' | '<hive>CORR' | '<hive>COVAR_POP' | '<hive>COVAR_SAMP' | '<hive>HISTOGRAM_NUMERIC' | '<hive>NTILE' | '<hive>PERCENTILE' | '<hive>PERCENTILE_APPROX'
  | '<impala>APPX_MEDIAN' | '<impala>EXTRACT' | '<impala>GROUP_CONCAT' | '<impala>STDDEV' | '<impala>VARIANCE_POP' | '<impala>VARIANCE_SAMP'
@@ -899,14 +902,25 @@ PrimitiveType
  | '<impala>REAL'
  | 'STRING'
  | '<hive>STRING'
- | 'DECIMAL'
- | 'CHAR'
- | 'VARCHAR'
+ | 'DECIMAL' OptionalTypePrecision
+ | 'CHAR' OptionalTypeLength
+ | 'VARCHAR' OptionalTypeLength
  | 'TIMESTAMP'
  | '<hive>BINARY'
  | '<hive>DATE'
  ;
 
+OptionalTypeLength
+ :
+ | '(' 'UNSIGNED_INTEGER' ')'
+ ;
+
+OptionalTypePrecision
+ :
+ | '(' 'UNSIGNED_INTEGER' ')'
+ | '(' 'UNSIGNED_INTEGER' ',' 'UNSIGNED_INTEGER' ')'
+ ;
+
 // ===================================== DESCRIBE statement =====================================
 
 DescribeStatement
@@ -1785,6 +1799,7 @@ NonParenthesizedValueExpressionPrimary
  | ColumnReference             -> { types: ['COLREF'], columnReference: $1 }
  | UserDefinedFunction
  | 'NULL'                      -> { types: [ 'NULL' ] }
+ | ImpalaInterval              -> { types: [ 'TIMESTAMP' ] }
  ;
 
 NonParenthesizedValueExpressionPrimary_EDIT
@@ -1797,6 +1812,24 @@ NonParenthesizedValueExpressionPrimary_EDIT
      }
    }
  | UserDefinedFunction_EDIT
+ | ImpalaInterval_EDIT
+ ;
+
+ImpalaInterval
+ : '<impala>INTERVAL' SignedInteger RegularIdentifier
+ ;
+
+ImpalaInterval_EDIT
+ : '<impala>INTERVAL' SignedInteger 'CURSOR'
+   {
+     suggestKeywords(['DAYS', 'HOURS', 'MICROSECONDS', 'MILLISECONDS', 'MINUTES', 'MONTHS', 'NANOSECONDS', 'SECONDS', 'WEEKS', 'YEARS']);
+   }
+ ;
+
+SignedInteger
+ : UnsignedNumericLiteral
+ | '-' UnsignedNumericLiteral
+ | '+' UnsignedNumericLiteral
  ;
 
 UnsignedValueSpecification

+ 27 - 27
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql_valueExpression.jison

@@ -119,25 +119,25 @@ ValueExpression
 ValueExpression_EDIT
  : 'CURSOR' '=' ValueExpression
    {
-     valueExpressionSuggest($3);
+     valueExpressionSuggest($3, $2);
      applyTypeToSuggestions($3.types);
      $$ = { types: [ 'BOOLEAN' ] };
    }
  | 'CURSOR' '<' ValueExpression
    {
-     valueExpressionSuggest($3);
+     valueExpressionSuggest($3, $2);
      applyTypeToSuggestions($3.types);
      $$ = { types: [ 'BOOLEAN' ] };
    }
  | 'CURSOR' '>' ValueExpression
    {
-     valueExpressionSuggest($3);
+     valueExpressionSuggest($3, $2);
      applyTypeToSuggestions($3.types);
      $$ = { types: [ 'BOOLEAN' ] };
    }
  | 'CURSOR' 'COMPARISON_OPERATOR' ValueExpression
    {
-     valueExpressionSuggest($3);
+     valueExpressionSuggest($3, $2);
      applyTypeToSuggestions($3.types);
      $$ = { types: [ 'BOOLEAN' ] };
    }
@@ -167,25 +167,25 @@ ValueExpression_EDIT
    }
  | ValueExpression '=' PartialBacktickedOrAnyCursor
    {
-     valueExpressionSuggest($1);
+     valueExpressionSuggest($1, $2);
      applyTypeToSuggestions($1.types);
      $$ = { types: [ 'BOOLEAN' ] };
    }
  | ValueExpression '<' PartialBacktickedOrAnyCursor
    {
-     valueExpressionSuggest($1);
+     valueExpressionSuggest($1, $2);
      applyTypeToSuggestions($1.types);
      $$ = { types: [ 'BOOLEAN' ] };
    }
  | ValueExpression '>' PartialBacktickedOrAnyCursor
    {
-     valueExpressionSuggest($1);
+     valueExpressionSuggest($1, $2);
      applyTypeToSuggestions($1.types);
      $$ = { types: [ 'BOOLEAN' ] };
    }
  | ValueExpression 'COMPARISON_OPERATOR' PartialBacktickedOrAnyCursor
    {
-     valueExpressionSuggest($1);
+     valueExpressionSuggest($1, $2);
      applyTypeToSuggestions($1.types);
      $$ = { types: [ 'BOOLEAN' ] };
    }
@@ -229,7 +229,7 @@ ValueExpression_EDIT
  : ValueExpression 'NOT' 'IN' ValueExpressionInSecondPart_EDIT
    {
      if ($4.inValueEdit) {
-       valueExpressionSuggest($1);
+       valueExpressionSuggest($1, $2 + ' ' + $3);
        applyTypeToSuggestions($1.types);
      }
      if ($4.cursorAtStart) {
@@ -240,7 +240,7 @@ ValueExpression_EDIT
  | ValueExpression 'IN' ValueExpressionInSecondPart_EDIT
    {
      if ($3.inValueEdit) {
-       valueExpressionSuggest($1);
+       valueExpressionSuggest($1, $2);
        applyTypeToSuggestions($1.types);
      }
      if ($3.cursorAtStart) {
@@ -291,7 +291,7 @@ ValueExpression_EDIT
    }
  | ValueExpression 'NOT' 'BETWEEN' ValueExpression 'BETWEEN_AND' 'CURSOR'
    {
-     valueExpressionSuggest($1);
+     valueExpressionSuggest($1, $5);
      $$ = { types: [ 'BOOLEAN' ] };
    }
  | ValueExpression 'NOT' 'BETWEEN' ValueExpression 'CURSOR'
@@ -301,7 +301,7 @@ ValueExpression_EDIT
    }
  | ValueExpression 'NOT' 'BETWEEN' 'CURSOR'
    {
-     valueExpressionSuggest($1);
+     valueExpressionSuggest($1, $2 + ' ' + $3);
      $$ = { types: [ 'BOOLEAN' ] };
    }
  | ValueExpression_EDIT 'BETWEEN' ValueExpression 'BETWEEN_AND' ValueExpression
@@ -327,7 +327,7 @@ ValueExpression_EDIT
    }
  | ValueExpression 'BETWEEN' ValueExpression 'BETWEEN_AND' 'CURSOR'
    {
-     valueExpressionSuggest($1);
+     valueExpressionSuggest($1, $4);
      applyTypeToSuggestions($1.types);
      $$ = { types: [ 'BOOLEAN' ] };
    }
@@ -338,7 +338,7 @@ ValueExpression_EDIT
    }
  | ValueExpression 'BETWEEN' 'CURSOR'
    {
-     valueExpressionSuggest($1);
+     valueExpressionSuggest($1, $2);
      applyTypeToSuggestions($1.types);
      $$ = { types: [ 'BOOLEAN' ] };
    }
@@ -364,7 +364,7 @@ ValueExpression
 ValueExpression_EDIT
  : 'CURSOR' 'OR' ValueExpression
    {
-     valueExpressionSuggest();
+     valueExpressionSuggest(undefined, $2);
      $$ = { types: [ 'BOOLEAN' ] };
    }
  | ValueExpression_EDIT 'OR' ValueExpression
@@ -374,7 +374,7 @@ ValueExpression_EDIT
    }
  | ValueExpression 'OR' PartialBacktickedOrAnyCursor
    {
-     valueExpressionSuggest();
+     valueExpressionSuggest(undefined, $2);
      $$ = { types: [ 'BOOLEAN' ] };
    }
  | ValueExpression 'OR' ValueExpression_EDIT
@@ -384,7 +384,7 @@ ValueExpression_EDIT
    }
  | 'CURSOR' 'AND' ValueExpression
    {
-     valueExpressionSuggest();
+     valueExpressionSuggest(undefined, $2);
      $$ = { types: [ 'BOOLEAN' ] };
    }
  | ValueExpression_EDIT 'AND' ValueExpression
@@ -394,7 +394,7 @@ ValueExpression_EDIT
    }
  | ValueExpression 'AND' PartialBacktickedOrAnyCursor
    {
-     valueExpressionSuggest();
+     valueExpressionSuggest(undefined, $2);
      $$ = { types: [ 'BOOLEAN' ] };
    }
  | ValueExpression 'AND' ValueExpression_EDIT
@@ -430,13 +430,13 @@ ValueExpression
 ValueExpression_EDIT
  : 'CURSOR' '*' ValueExpression
    {
-     valueExpressionSuggest();
+     valueExpressionSuggest(undefined, $2);
      applyTypeToSuggestions([ 'NUMBER' ]);
      $$ = { types: [ 'NUMBER' ] };
    }
  | 'CURSOR' 'ARITHMETIC_OPERATOR' ValueExpression
    {
-     valueExpressionSuggest();
+     valueExpressionSuggest(undefined, $2);
      applyTypeToSuggestions([ 'NUMBER' ]);
      $$ = { types: [ 'NUMBER' ] };
    }
@@ -460,19 +460,19 @@ ValueExpression_EDIT
    }
  | ValueExpression '-' PartialBacktickedOrAnyCursor
    {
-     valueExpressionSuggest();
+     valueExpressionSuggest(undefined, $2);
      applyTypeToSuggestions(['NUMBER']);
      $$ = { types: [ 'NUMBER' ] };
    }
  | ValueExpression '*' PartialBacktickedOrAnyCursor
    {
-     valueExpressionSuggest();
+     valueExpressionSuggest(undefined, $2);
      applyTypeToSuggestions(['NUMBER']);
      $$ = { types: [ 'NUMBER' ] };
    }
  | ValueExpression 'ARITHMETIC_OPERATOR' PartialBacktickedOrAnyCursor
    {
-     valueExpressionSuggest();
+     valueExpressionSuggest(undefined, $2);
      applyTypeToSuggestions(['NUMBER']);
      $$ = { types: [ 'NUMBER' ] };
    }
@@ -532,25 +532,25 @@ ValueExpression_EDIT
  | ValueExpression 'REGEXP' ValueExpression_EDIT             -> { types: [ 'BOOLEAN' ] }
  | 'CURSOR' 'NOT' 'LIKE' ValueExpression
    {
-     valueExpressionSuggest();
+     valueExpressionSuggest(undefined, $2 + ' ' + $3);
      applyTypeToSuggestions([ 'STRING' ]);
      $$ = { types: [ 'BOOLEAN' ] };
    }
  | 'CURSOR' 'LIKE' ValueExpression
    {
-     valueExpressionSuggest();
+     valueExpressionSuggest(undefined, $2);
      applyTypeToSuggestions([ 'STRING' ]);
      $$ = { types: [ 'BOOLEAN' ] };
    }
  | 'CURSOR' 'RLIKE' ValueExpression
    {
-     valueExpressionSuggest();
+     valueExpressionSuggest(undefined, $2);
      applyTypeToSuggestions([ 'STRING' ]);
      $$ = { types: [ 'BOOLEAN' ] };
    }
  | 'CURSOR' 'REGEXP' ValueExpression
    {
-     valueExpressionSuggest();
+     valueExpressionSuggest(undefined, $2);
      applyTypeToSuggestions([ 'STRING' ]);
      $$ = { types: [ 'BOOLEAN' ] };
    }

文件差异内容过多而无法显示
+ 0 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/sql.js


+ 9 - 1
desktop/core/src/desktop/static/desktop/js/autocomplete/sql_support.js

@@ -147,16 +147,23 @@ var addColRefIfExists = function (valueExpression) {
   }
 };
 
-var valueExpressionSuggest = function (oppositeValueExpression) {
+var valueExpressionSuggest = function (oppositeValueExpression, operator) {
   if (oppositeValueExpression && oppositeValueExpression.columnReference) {
     suggestValues();
     parser.yy.result.colRef = {identifierChain: oppositeValueExpression.columnReference};
   }
   suggestColumns();
   suggestFunctions();
+  var keywords = ['CASE'];
+  if (isHive() || typeof oppositeValueExpression === 'undefined' || typeof operator === 'undefined') {
+    keywords = keywords.concat(['EXISTS', 'NOT']);
+  }
   if (oppositeValueExpression && oppositeValueExpression.types[0] === 'NUMBER') {
     applyTypeToSuggestions(['NUMBER']);
+  } else if (isImpala() && (typeof operator === 'undefined' || operator === '-' || operator === '+')) {
+    keywords.push('INTERVAL');
   }
+  suggestKeywords(keywords);
 };
 
 var applyTypeToSuggestions = function (types) {
@@ -196,6 +203,7 @@ var applyArgumentTypesToSuggestions = function (functionName, position) {
     delete parser.yy.result.suggestValues;
     delete parser.yy.result.suggestFunctions;
     delete parser.yy.result.suggestIdentifiers;
+    delete parser.yy.result.suggestKeywords;
   } else {
     applyTypeToSuggestions(foundArguments);
   }

+ 1 - 1
desktop/core/src/desktop/static/desktop/js/sqlAutocompleter2.js

@@ -488,7 +488,7 @@
   };
 
   var extraHiveReservedKeywords = {
-    ASC: true, DESC: true, FORMATTED: true, FUNCTION: true, INDEX: true, INDEXES: true, LIMIT: true, SCHEMA: true
+    ASC: true, CLUSTER: true, DESC: true, DISTRIBUTE: true, FORMATTED: true, FUNCTION: true, INDEX: true, INDEXES: true, LIMIT: true, SCHEMA: true, SORT: true
   };
 
   var impalaReservedKeywords = {

+ 13 - 0
desktop/core/src/desktop/static/desktop/spec/autocomplete/sqlSpecCreate.js

@@ -620,6 +620,19 @@ define([
             }
           });
         });
+
+        it('should handle "create table four_k as select 4096 as x;|"', function () {
+          assertAutoComplete({
+            beforeCursor: 'create table four_k as select 4096 as x;',
+            afterCursor: '',
+            dialect: 'impala',
+            containsKeywords: ['SELECT'],
+            noErrors: true,
+            expectedResult: {
+              lowerCase: true
+            }
+          });
+        });
       });
 
       describe('Hive specific', function () {

文件差异内容过多而无法显示
+ 313 - 0
desktop/core/src/desktop/static/desktop/spec/autocomplete/sqlSpecSelect.js


+ 2 - 0
desktop/core/src/desktop/static/desktop/spec/autocomplete/sqlSpecUpdate.js

@@ -200,6 +200,7 @@ define([
       assertAutoComplete({
         beforeCursor: 'UPDATE bar.foo SET bla = \'foo\' WHERE id = ',
         afterCursor: '',
+        containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
           suggestFunctions: { types: ['COLREF'] },
@@ -225,6 +226,7 @@ define([
       assertAutoComplete({
         beforeCursor: 'UPDATE bar.foo SET bla = \'foo\' WHERE id = 1 AND ',
         afterCursor: '',
+        containsKeywords: ['CASE'],
         expectedResult: {
           lowerCase: false,
           suggestFunctions: {},

+ 0 - 1
desktop/core/src/desktop/static/desktop/spec/sqlAutocompleter2Spec.js

@@ -56,7 +56,6 @@ define([
     
     it('should not backtick non-reserved keywords', function () {
       expect(hiveSubject.backTickIfNeeded('transactions')).toEqual('transactions');
-      expect(hiveSubject.backTickIfNeeded('sort')).toEqual('sort');
       expect(impalaSubject.backTickIfNeeded('role')).toEqual('role');
     });
 

部分文件因为文件数量过多而无法显示