瀏覽代碼

HUE-9099 [frontend] Add missing options to the Hive EXPLAIN grammar

Johan Ahlen 6 年之前
父節點
當前提交
132e881d46

+ 15 - 16
desktop/core/src/desktop/js/parse/jison/sql/hive/sql.jisonlex

@@ -32,7 +32,6 @@
 'AND'                                { return 'AND'; }
 'ARRAY'                              { return 'ARRAY'; }
 'AS'                                 { return 'AS'; }
-'ASC'                                { return 'ASC'; }
 'AUTHORIZATION'                      { return 'AUTHORIZATION'; }
 'BETWEEN'                            { this.begin('between'); return 'BETWEEN'; }
 'BIGINT'                             { return 'BIGINT'; }
@@ -53,7 +52,6 @@
 'DATE'                               { return 'DATE'; }
 'DECIMAL'                            { return 'DECIMAL'; }
 'DELETE'                             { parser.determineCase(yytext); return 'DELETE'; }
-'DESC'                               { return 'DESC'; }
 'DESCRIBE'                           { parser.determineCase(yytext); return 'DESCRIBE'; }
 'DISTINCT'                           { return 'DISTINCT'; }
 'DIV'                                { return 'ARITHMETIC_OPERATOR'; }
@@ -99,7 +97,6 @@
 'NULLS'                              { return 'NULLS'; }
 'OF'                                 { return 'OF'; }
 'ON'                                 { return 'ON'; }
-'OPTION'                             { return 'OPTION'; }
 'OR'                                 { return 'OR'; }
 'ORDER'                              { return 'ORDER'; }
 'OUT'                                { return 'OUT'; }
@@ -108,7 +105,6 @@
 'PRECEDING'                          { return 'PRECEDING'; }
 'PRECISION'                          { return 'PRECISION'; }
 'PRIMARY'                            { return 'PRIMARY'; }
-'PURGE'                              { return 'PURGE'; }
 'RANGE'                              { return 'RANGE'; }
 'REFERENCES'                         { return 'REFERENCES'; }
 'REGEXP'                             { return 'REGEXP'; }
@@ -118,31 +114,25 @@
 'ROLLUP'                             { return 'ROLLUP'; }
 'ROW'                                { return 'ROW'; }
 'ROWS'                               { return 'ROWS'; }
-'SCHEMA'                             { return 'SCHEMA'; }
 'SELECT'                             { parser.determineCase(yytext); parser.addStatementTypeLocation('SELECT', yylloc); return 'SELECT'; }
 'SEMI'                               { return 'SEMI'; }
 'SET'                                { parser.determineCase(yytext); parser.addStatementTypeLocation('SET', yylloc); return 'SET'; }
-'SHOW'                               { parser.determineCase(yytext); parser.addStatementTypeLocation('SHOW', yylloc); return 'SHOW'; }
 'SMALLINT'                           { return 'SMALLINT'; }
-'STRING'                             { return 'STRING'; }
 'SYNC'                               { return 'SYNC'; }
 'TABLE'                              { return 'TABLE'; }
 'THEN'                               { return 'THEN'; }
 'TIMESTAMP'                          { return 'TIMESTAMP'; }
-'TINYINT'                            { return 'TINYINT'; }
 'TO'                                 { return 'TO'; }
 'TRUE'                               { return 'TRUE'; }
 'TRUNCATE'                           { parser.determineCase(yytext); parser.addStatementTypeLocation('TRUNCATE', yylloc, yy.lexer.upcomingInput()); return 'TRUNCATE'; }
 'UNBOUNDED'                          { return 'UNBOUNDED'; }
 'UNION'                              { return 'UNION'; }
 'UPDATE'                             { parser.determineCase(yytext); return 'UPDATE'; }
-'USE'                                { parser.determineCase(yytext); parser.addStatementTypeLocation('USE', yylloc); return 'USE'; }
 'USER'                               { return 'USER'; }
 'USING'                              { return 'USING'; }
 'UTC_TIMESTAMP'                      { return 'UTC_TIMESTAMP'; }
 'VALUES'                             { return 'VALUES'; }
 'VARCHAR'                            { return 'VARCHAR'; }
-'VIEW'                               { return 'VIEW'; }
 'VIEWS'                              { return 'VIEWS'; }
 'WHEN'                               { return 'WHEN'; }
 'WHERE'                              { return 'WHERE'; }
@@ -156,10 +146,12 @@
 'ANALYZE'                            { parser.determineCase(yytext); return 'ANALYZE'; }
 'ARCHIVE'                            { return 'ARCHIVE'; }
 'ASC'                                { return 'ASC'; }
+'AST'                                { return 'AST'; }
 'AVRO'                               { return 'AVRO'; }
 'BUCKET'                             { return 'BUCKET'; }
 'BUCKETS'                            { return 'BUCKETS'; }
 'CASCADE'                            { return 'CASCADE'; }
+'CBO'                                { return 'CBO'; }
 'CHANGE'                             { return 'CHANGE'; }
 'CHECK'                              { return 'CHECK'; }
 'CLUSTER'                            { return 'CLUSTER'; }
@@ -171,6 +163,7 @@
 'COMPACTIONS'                        { return 'COMPACTIONS'; }
 'COMPUTE'                            { return 'COMPUTE'; }
 'CONCATENATE'                        { return 'CONCATENATE'; }
+'COST'                               { return 'COST'; }
 'CURRENT_DATE'                       { return 'CURRENT_DATE'; }
 'CURRENT_TIMESTAMP'                  { return 'CURRENT_TIMESTAMP'; }
 'CURRENT_USER'                       { return 'CURRENT_USER'; }
@@ -185,6 +178,7 @@
 'DELIMITED'                          { return 'DELIMITED'; }
 'DEPENDENCY'                         { return 'DEPENDENCY'; }
 'DESC'                               { return 'DESC'; }
+'DETAIL'                             { return 'DETAIL'; }
 'DIRECTORY'                          { this.begin('hdfs'); return 'DIRECTORY'; }
 'DISABLE'                            { return 'DISABLE'; }
 'DISTRIBUTE'                         { return 'DISTRIBUTE'; }
@@ -195,13 +189,13 @@ DOUBLE\s+PRECISION                   { return 'DOUBLE_PRECISION'; }
 'EXCHANGE'                           { return 'EXCHANGE'; }
 'EXPLAIN'                            { parser.determineCase(yytext); return 'EXPLAIN'; }
 'EXPORT'                             { parser.determineCase(yytext); return 'EXPORT'; }
+'EXPRESSION'                         { return 'EXPRESSION'; }
 'FIELDS'                             { return 'FIELDS'; }
 'FILE'                               { return 'FILE'; }
 'FILEFORMAT'                         { return 'FILEFORMAT'; }
 'FIRST'                              { return 'FIRST'; }
 'FORMAT'                             { return 'FORMAT'; }
 'FORMATTED'                          { return 'FORMATTED'; }
-'FUNCTION'                           { return 'FUNCTION'; }
 'FUNCTIONS'                          { return 'FUNCTIONS'; }
 'HOUR'                               { return 'HOUR'; }
 'IDXPROPERTIES'                      { return 'IDXPROPERTIES'; }
@@ -211,18 +205,19 @@ DOUBLE\s+PRECISION                   { return 'DOUBLE_PRECISION'; }
 'INPUTFORMAT'                        { return 'INPUTFORMAT'; }
 'ITEMS'                              { return 'ITEMS'; }
 'JAR'                                { return 'JAR'; }
+'JOINCOST'                           { return 'JOINCOST'; }
 'JSONFILE'                           { return 'JSONFILE'; }
 'KEY'                                { return 'KEY'; }
 'KEYS'                               { return 'KEYS'; }
 'LAST'                               { return 'LAST'; }
-'LITERAL'                            { return 'LITERAL'; }
 'LINES'                              { return 'LINES'; }
+'LITERAL'                            { return 'LITERAL'; }
 'LOAD'                               { parser.determineCase(yytext); return 'LOAD'; }
 'LOCATION'                           { this.begin('hdfs'); return 'LOCATION'; }
 'LOCK'                               { return 'LOCK'; }
 'LOCKS'                              { return 'LOCKS'; }
-'MATERIALIZED'                       { return 'MATERIALIZED'; }
 'MATCHED'                            { return 'MATCHED'; }
+'MATERIALIZED'                       { return 'MATERIALIZED'; }
 'MERGE'                              { return 'MERGE'; }
 'METADATA'                           { return 'METADATA'; }
 'MINUTE'                             { return 'MINUTE'; }
@@ -233,6 +228,9 @@ DOUBLE\s+PRECISION                   { return 'DOUBLE_PRECISION'; }
 'NOSCAN'                             { return 'NOSCAN'; }
 'NOVALIDATE'                         { return 'NOVALIDATE'; }
 'OFFLINE'                            { return 'OFFLINE'; }
+'ONLY'                               { return 'ONLY'; }
+'OPERATOR'                           { return 'OPERATOR'; }
+'OPTION'                             { return 'OPTION'; }
 'ORC'                                { return 'ORC'; }
 'OUTPUTFORMAT'                       { return 'OUTPUTFORMAT'; }
 'OVER'                               { return 'OVER'; }
@@ -266,7 +264,7 @@ OVERWRITE\s+DIRECTORY                { this.begin('hdfs'); return 'OVERWRITE_DIR
 'SERDE'                              { return 'SERDE'; }
 'SERDEPROPERTIES'                    { return 'SERDEPROPERTIES'; }
 'SETS'                               { return 'SETS'; }
-'SHOW'                               { parser.determineCase(yytext); return 'SHOW'; }
+'SHOW'                               { parser.determineCase(yytext); parser.addStatementTypeLocation('SHOW', yylloc); return 'SHOW'; }
 'SHOW_DATABASE'                      { return 'SHOW_DATABASE'; }
 'SKEWED LOCATION'                    { return 'SKEWED_LOCATION'; } // Hack to prevent hdfs lexer state
 'SKEWED'                             { return 'SKEWED'; }
@@ -277,6 +275,7 @@ OVERWRITE\s+DIRECTORY                { this.begin('hdfs'); return 'OVERWRITE_DIR
 STORED\s+AS\s+DIRECTORIES            { return 'STORED_AS_DIRECTORIES'; }
 'STRING'                             { return 'STRING'; }
 'STRUCT'                             { return 'STRUCT'; }
+'SUMMARY'                            { return 'SUMMARY'; }
 'TABLES'                             { return 'TABLES'; }
 'TABLESAMPLE'                        { return 'TABLESAMPLE'; }
 'TBLPROPERTIES'                      { return 'TBLPROPERTIES'; }
@@ -290,12 +289,12 @@ STORED\s+AS\s+DIRECTORIES            { return 'STORED_AS_DIRECTORIES'; }
 'UNARCHIVE'                          { return 'UNARCHIVE'; }
 'UNIONTYPE'                          { return 'UNIONTYPE'; }
 'UNIQUE'                             { return 'UNIQUE'; }
-'USE'                                { parser.determineCase(yytext); return 'USE'; }
+'USE'                                { parser.determineCase(yytext); parser.addStatementTypeLocation('USE', yylloc); return 'USE'; }
+'VECTORIZATION'                      { return 'VECTORIZATION'; }
 'VIEW'                               { return 'VIEW'; }
 'WAIT'                               { return 'WAIT'; }
 'WEEK'                               { return 'WEEK'; }
 'WINDOW'                             { return 'WINDOW'; }
-'WITH'                               { parser.determineCase(yytext); parser.addStatementTypeLocation('WITH', yylloc); return 'WITH'; }
 'YEAR'                               { return 'YEAR'; }
 
 '.'                                  { return '.'; }

+ 104 - 0
desktop/core/src/desktop/js/parse/jison/sql/hive/sql_analyze.jison

@@ -22,6 +22,22 @@ DataDefinition_EDIT
  : AnalyzeStatement_EDIT
  ;
 
+SqlStatement
+ : ExplainClause DataDefinition
+ | ExplainClause DataManipulation
+ | ExplainClause QuerySpecification
+ ;
+
+SqlStatement_EDIT
+ : ExplainClause_EDIT
+ | ExplainClause DataDefinition_EDIT
+ | ExplainClause DataManipulation_EDIT
+ | ExplainClause QuerySpecification_EDIT
+ | ExplainClause_EDIT DataDefinition
+ | ExplainClause_EDIT DataManipulation
+ | ExplainClause_EDIT QuerySpecification
+ ;
+
 AnalyzeStatement
  : 'ANALYZE' 'TABLE' SchemaQualifiedTableIdentifier OptionalPartitionSpec 'COMPUTE' 'STATISTICS' OptionalForColumns OptionalCacheMetadata OptionalNoscan
    {
@@ -130,3 +146,91 @@ OptionalNoscan
  :
  | 'NOSCAN'
  ;
+
+ExplainClause
+ : 'EXPLAIN' OptionalExplainTypes
+ ;
+
+ExplainClause_EDIT
+ : 'EXPLAIN' OptionalExplainTypes 'CURSOR'
+   {
+     if (!$2) {
+       parser.suggestDdlAndDmlKeywords([
+         { value: 'AST', weight: 2 },
+         { value: 'AUTHORIZATION', weight: 2 },
+         { value: 'CBO', weight: 2 },
+         { value: 'DEPENDENCY', weight: 2 },
+         { value: 'EXTENDED', weight: 2 },
+         { value: 'FORMATTED CBO', weight: 2 },
+         { value: 'LOCKS', weight: 2 },
+         { value: 'VECTORIZATION', weight: 2 }
+       ]);
+     } else if ($2 && $2.suggestKeywords) {
+       parser.suggestDdlAndDmlKeywords($2.suggestKeywords);
+     } else {
+       parser.suggestDdlAndDmlKeywords();
+     }
+   }
+ | 'EXPLAIN' 'FORMATTED' 'CURSOR'
+   {
+     parser.suggestKeywords(['CBO']);
+   }
+ ;
+
+OptionalExplainTypes
+ :
+ | 'AST'
+ | 'AUTHORIZATION'
+ | 'FORMATTED' 'CBO' OptionalCostOrJoincost
+   {
+     if (!$3) {
+       $$ = { suggestKeywords: ['COST', 'JOINCOST'] };
+     }
+   }
+ | 'CBO' OptionalCostOrJoincost
+   {
+     if (!$2) {
+       $$ = { suggestKeywords: ['COST', 'JOINCOST'] };
+     }
+   }
+ | 'DEPENDENCY'
+ | 'EXTENDED'
+ | 'LOCKS'
+ | 'VECTORIZATION' OptionalOnly OptionalVectorizationTypes
+   {
+     var keywords = [];
+     if (!$3) {
+       keywords = keywords.concat([
+         { weight: 1, value: 'DETAIL' },
+         { weight: 1, value: 'EXPRESSION' },
+         { weight: 1, value: 'OPERATOR' },
+         { weight: 1, value: 'SUMMARY' }
+       ]);
+     }
+     if (!$2) {
+       keywords.push({ weight: 2, value: 'ONLY' });
+     }
+     if (keywords.length) {
+       $$ = { suggestKeywords: keywords };
+     }
+   }
+ ;
+
+OptionalCostOrJoincost
+ :
+ | 'COST'
+ | 'JOINCOST'
+ ;
+
+OptionalOnly
+ :
+ | 'ONLY'
+ ;
+
+OptionalVectorizationTypes
+ :
+ | 'DETAIL'
+ | 'EXPRESSION'
+ | 'OPERATOR'
+ | 'SUMMARY'
+ ;

+ 21 - 36
desktop/core/src/desktop/js/parse/jison/sql/hive/sql_main.jison

@@ -68,9 +68,6 @@ SqlStatement
  : DataDefinition
  | DataManipulation
  | QuerySpecification
- | ExplainClause DataDefinition
- | ExplainClause DataManipulation
- | ExplainClause QuerySpecification
  ;
 
 SqlStatement_EDIT
@@ -82,17 +79,10 @@ SqlStatement_EDIT
    {
      parser.suggestKeywords(['INSERT', 'SELECT']);
    }
- | ExplainClause_EDIT
  | DataDefinition_EDIT
  | DataManipulation_EDIT
  | QuerySpecification_EDIT
  | SetSpecification_EDIT
- | ExplainClause DataDefinition_EDIT
- | ExplainClause DataManipulation_EDIT
- | ExplainClause QuerySpecification_EDIT
- | ExplainClause_EDIT DataDefinition
- | ExplainClause_EDIT DataManipulation
- | ExplainClause_EDIT QuerySpecification
  ;
 
 NonReservedKeyword
@@ -102,10 +92,12 @@ NonReservedKeyword
  | 'AFTER'
  | 'ANALYZE'
  | 'ARCHIVE'
+ | 'AST'
  | 'AVRO'
  | 'BUCKET'
  | 'BUCKETS'
  | 'CASCADE'
+ | 'CBO'
  | 'CHANGE'
  | 'CHECK'
  | 'CLUSTERED'
@@ -116,26 +108,31 @@ NonReservedKeyword
  | 'COMPACTIONS'
  | 'COMPUTE'
  | 'CONCATENATE'
+ | 'COST'
  | 'CURRENT_DATE'
  | 'CURRENT_TIMESTAMP'
  | 'CURRENT_USER'
  | 'DATA'
  | 'DATABASES'
  | 'DAY'
+ | 'DAYOFWEEK'
  | 'DBPROPERTIES'
  | 'DEFAULT'
  | 'DEFERRED'
  | 'DEFINED'
  | 'DELIMITED'
  | 'DEPENDENCY'
+ | 'DETAIL'
  | 'DIRECTORY'
  | 'DISABLE'
+ | 'DISTRIBUTED'
  | 'DOUBLE_PRECISION'
  | 'ENABLE'
  | 'ESCAPED'
  | 'EXCHANGE'
  | 'EXPLAIN'
  | 'EXPORT'
+ | 'EXPRESSION'
  | 'FIELDS'
  | 'FILE'
  | 'FILEFORMAT'
@@ -148,16 +145,18 @@ NonReservedKeyword
  | 'INPUTFORMAT'
  | 'ITEMS'
  | 'JAR'
+ | 'JOINCOST'
  | 'JSONFILE'
  | 'KEY'
  | 'KEYS'
+ | 'LAST'
  | 'LINES'
  | 'LITERAL'
  | 'LOAD'
  | 'LOCATION'
  | 'LOCKS'
- | 'MATERIALIZED'
  | 'MATCHED'
+ | 'MATERIALIZED'
  | 'MERGE'
  | 'METADATA'
  | 'MINUTE'
@@ -168,10 +167,13 @@ NonReservedKeyword
  | 'NOSCAN'
  | 'NOVALIDATE'
  | 'OFFLINE'
+ | 'ONLY'
+ | 'OPERATOR'
  | 'OPTION'
  | 'ORC'
  | 'OUTPUTFORMAT'
  | 'OVERWRITE'
+ | 'OVERWRITE_DIRECTORY'
  | 'OWNER'
  | 'PARQUET'
  | 'PARTITIONED'
@@ -200,18 +202,20 @@ NonReservedKeyword
  | 'SERDEPROPERTIES'
  | 'SETS'
  | 'SHOW'
+ | 'SKEWED_LOCATION'
  | 'SKEWED'
  | 'SORTED'
  | 'STATISTICS'
  | 'STORED'
+ | 'STORED_AS_DIRECTORIES'
  | 'STRING'
  | 'STRUCT'
+ | 'SUMMARY'
  | 'TABLES'
  | 'TBLPROPERTIES'
  | 'TEMPORARY'
  | 'TERMINATED'
  | 'TEXTFILE'
- | 'TIMESTAMP'
  | 'TINYINT'
  | 'TOUCH'
  | 'TRANSACTIONAL'
@@ -220,7 +224,7 @@ NonReservedKeyword
  | 'UNIONTYPE'
  | 'UNIQUE'
  | 'USE'
- | 'USER'
+ | 'VECTORIZATION'
  | 'VIEW'
  | 'WAIT'
  | 'WEEK'
@@ -230,13 +234,16 @@ NonReservedKeyword
 // | 'DESC'
 // | 'DISTRIBUTE'
 // | 'FORMATTED'
-// | 'FUNCTION'
 // | 'INDEX'
 // | 'INDEXES'
 // | 'LOCK'
+// | 'OVER'
 // | 'SCHEMA'
 // | 'SHOW_DATABASE'
 // | 'SORT'
+// | 'TABLESAMPLE'
+// | 'WINDOW'
+// | 'WITH'
  ;
 
 RegularIdentifier
@@ -245,28 +252,6 @@ RegularIdentifier
  | NonReservedKeyword
  ;
 
-ExplainClause
- : 'EXPLAIN' OptionalExplainTypes
- ;
-
-ExplainClause_EDIT
- : 'EXPLAIN' OptionalExplainTypes 'CURSOR'
-   {
-     if (!$2) {
-       parser.suggestDdlAndDmlKeywords([{ value: 'AUTHORIZATION', weight: 2 }, { value: 'DEPENDENCY', weight: 2 }, { value: 'EXTENDED', weight: 2 }]);
-     } else {
-       parser.suggestDdlAndDmlKeywords();
-     }
-   }
- ;
-
-OptionalExplainTypes
- :
- | 'AUTHORIZATION'
- | 'DEPENDENCY'
- | 'EXTENDED'
- ;
-
 // 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

文件差異過大導致無法顯示
+ 0 - 0
desktop/core/src/desktop/js/parse/sql/hive/hiveAutocompleteParser.js


文件差異過大導致無法顯示
+ 0 - 0
desktop/core/src/desktop/js/parse/sql/hive/hiveSyntaxParser.js


+ 114 - 0
desktop/core/src/desktop/js/parse/sql/hive/test/hiveAutocompleteParser.Analyze.test.js

@@ -254,4 +254,118 @@ describe('hiveAutocompleteParser.js ANALYZE statements', () => {
       });
     });
   });
+
+  describe('EXPLAIN', () => {
+    it('should handle "EXPLAIN DEPENDENCY SELECT key, count(1) FROM srcpart WHERE ds IS NOT NULL GROUP BY key;|"', () => {
+      assertAutoComplete({
+        beforeCursor:
+          'EXPLAIN DEPENDENCY SELECT key, count(1) FROM srcpart WHERE ds IS NOT NULL GROUP BY key;',
+        afterCursor: '',
+        noErrors: true,
+        containsKeywords: ['SELECT'],
+        expectedResult: {
+          lowerCase: false
+        }
+      });
+    });
+
+    it('should suggest keywords for "|"', () => {
+      assertAutoComplete({
+        beforeCursor: '',
+        afterCursor: '',
+        containsKeywords: ['EXPLAIN'],
+        expectedResult: {
+          lowerCase: false
+        }
+      });
+    });
+
+    it('should suggest keywords for "EXPLAIN |"', () => {
+      assertAutoComplete({
+        beforeCursor: 'EXPLAIN ',
+        afterCursor: '',
+        containsKeywords: ['AST', 'AUTHORIZATION', 'DEPENDENCY', 'EXTENDED', 'SELECT'],
+        doesNotContainKeywords: ['EXPLAIN'],
+        expectedResult: {
+          lowerCase: false
+        }
+      });
+    });
+
+    it('should suggest keywords for "EXPLAIN AUTHORIZATION |"', () => {
+      assertAutoComplete({
+        beforeCursor: 'EXPLAIN AUTHORIZATION ',
+        afterCursor: '',
+        containsKeywords: ['SELECT'],
+        doesNotContainKeywords: [
+          'AUTHORIZATION',
+          'COST',
+          'DEPENDENCY',
+          'EXTENDED',
+          'EXPLAIN',
+          'JOINCOST'
+        ],
+        expectedResult: {
+          lowerCase: false
+        }
+      });
+    });
+
+    it('should suggest keywords for "EXPLAIN CBO |"', () => {
+      assertAutoComplete({
+        beforeCursor: 'EXPLAIN CBO ',
+        afterCursor: '',
+        containsKeywords: ['SELECT', 'COST', 'JOINCOST'],
+        expectedResult: {
+          lowerCase: false
+        }
+      });
+    });
+
+    it('should suggest keywords for "EXPLAIN FORMATTED |"', () => {
+      assertAutoComplete({
+        beforeCursor: 'EXPLAIN FORMATTED ',
+        afterCursor: '',
+        expectedResult: {
+          lowerCase: false,
+          suggestKeywords: ['CBO']
+        }
+      });
+    });
+
+    it('should suggest keywords for "EXPLAIN VECTORIZATION |"', () => {
+      assertAutoComplete({
+        beforeCursor: 'EXPLAIN VECTORIZATION ',
+        afterCursor: '',
+        containsKeywords: ['ONLY', 'DETAIL', 'SUMMARY'],
+        expectedResult: {
+          lowerCase: false
+        }
+      });
+    });
+
+    it('should suggest keywords for "EXPLAIN VECTORIZATION ONLY |"', () => {
+      assertAutoComplete({
+        beforeCursor: 'EXPLAIN VECTORIZATION ONLY ',
+        afterCursor: '',
+        containsKeywords: ['DETAIL', 'SUMMARY'],
+        doesNotContainKeywords: ['ONLY'],
+        expectedResult: {
+          lowerCase: false
+        }
+      });
+    });
+
+    it('should suggest tables for "EXPLAIN EXTENDED SELECT * FROM |"', () => {
+      assertAutoComplete({
+        beforeCursor: 'EXPLAIN EXTENDED SELECT * FROM ',
+        afterCursor: '',
+        expectedResult: {
+          lowerCase: false,
+          suggestTables: {},
+          suggestDatabases: { appendDot: true }
+        }
+      });
+    });
+  });
 });

+ 0 - 62
desktop/core/src/desktop/js/parse/sql/hive/test/hiveAutocompleteParser.test.js

@@ -212,68 +212,6 @@ describe('hiveAutocompleteParser.js', () => {
     });
   });
 
-  describe('EXPLAIN', () => {
-    it('should handle "EXPLAIN DEPENDENCY SELECT key, count(1) FROM srcpart WHERE ds IS NOT NULL GROUP BY key;|"', () => {
-      assertAutoComplete({
-        beforeCursor:
-          'EXPLAIN DEPENDENCY SELECT key, count(1) FROM srcpart WHERE ds IS NOT NULL GROUP BY key;',
-        afterCursor: '',
-        noErrors: true,
-        containsKeywords: ['SELECT'],
-        expectedResult: {
-          lowerCase: false
-        }
-      });
-    });
-
-    it('should suggest keywords for "|"', () => {
-      assertAutoComplete({
-        beforeCursor: '',
-        afterCursor: '',
-        containsKeywords: ['EXPLAIN'],
-        expectedResult: {
-          lowerCase: false
-        }
-      });
-    });
-
-    it('should suggest keywords for "EXPLAIN |"', () => {
-      assertAutoComplete({
-        beforeCursor: 'EXPLAIN ',
-        afterCursor: '',
-        containsKeywords: ['AUTHORIZATION', 'DEPENDENCY', 'EXTENDED', 'SELECT'],
-        doesNotContainKeywords: ['EXPLAIN'],
-        expectedResult: {
-          lowerCase: false
-        }
-      });
-    });
-
-    it('should suggest keywords for "EXPLAIN AUTHORIZATION |"', () => {
-      assertAutoComplete({
-        beforeCursor: 'EXPLAIN AUTHORIZATION ',
-        afterCursor: '',
-        containsKeywords: ['SELECT'],
-        doesNotContainKeywords: ['AUTHORIZATION', 'DEPENDENCY', 'EXTENDED', 'EXPLAIN'],
-        expectedResult: {
-          lowerCase: false
-        }
-      });
-    });
-
-    it('should suggest tables for "EXPLAIN EXTENDED SELECT * FROM |"', () => {
-      assertAutoComplete({
-        beforeCursor: 'EXPLAIN EXTENDED SELECT * FROM ',
-        afterCursor: '',
-        expectedResult: {
-          lowerCase: false,
-          suggestTables: {},
-          suggestDatabases: { appendDot: true }
-        }
-      });
-    });
-  });
-
   describe('SET', () => {
     it('should handle "set hive.exec.compress.output=true;|"', () => {
       assertAutoComplete({

部分文件因文件數量過多而無法顯示