소스 검색

HUE-4579 [editor] The new autocompleter should support Impala INSERT statements

Johan Ahlen 9 년 전
부모
커밋
a0c5034

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

@@ -199,6 +199,7 @@
 <impala>'FUNCTIONS'                        { return '<impala>FUNCTIONS'; }
 <impala>'GROUP'                            { return '<impala>GROUP'; }
 <impala>'INCREMENTAL'                      { return '<impala>INCREMENTAL'; }
+<impala>'INSERT'                           { determineCase(yytext); return '<impala>INSERT'; }
 <impala>'INTERVAL'                         { return '<impala>INTERVAL'; }
 <impala>'INIT_FN'                          { return '<impala>INIT_FN'; }
 <impala>'INPATH'                           { this.begin('hdfs'); return '<impala>INPATH'; }
@@ -245,9 +246,10 @@
 <impala>'GRANT'                            { return '<impala>GRANT'; }
 <impala>'ROLE'                             { return '<impala>ROLE'; }
 <impala>'ROLES'                            { return '<impala>ROLES'; }
-
-<impala>\[SHUFFLE\]                        { return '<impala>SHUFFLE'; }
 <impala>\[BROADCAST\]                      { return '<impala>BROADCAST'; }
+<impala>\[NOSHUFFLE\]                      { return '<impala>NOSHUFFLE'; }
+<impala>\[SHUFFLE\]                        { return '<impala>SHUFFLE'; }
+
 <impala>'...'                              { return '<impala>...'; }
 <impala>'.'                                { return '<impala>.'; }
 <impala>'['                                { return '<impala>['; }

+ 136 - 2
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql_insert.jison

@@ -21,11 +21,25 @@ DataManipulation
 InsertStatement
  : HiveInsertStatement
  | InsertValuesStatement
+ | ImpalaInsertStatement
+ | CommonTableExpression HiveInsertStatement
+ | CommonTableExpression ImpalaInsertStatement
  ;
 
 DataManipulation_EDIT
  : HiveInsertStatement_EDIT
  | InsertValuesStatement_EDIT
+ | ImpalaInsertStatement_EDIT
+ | CommonTableExpression HiveInsertStatement_EDIT
+   {
+     addCommonTableExpressions($1);
+   }
+ | CommonTableExpression_EDIT HiveInsertStatement
+ | CommonTableExpression ImpalaInsertStatement_EDIT
+   {
+     addCommonTableExpressions($1);
+   }
+ | CommonTableExpression_EDIT ImpalaInsertStatement
  ;
 
 HiveInsertStatement
@@ -202,6 +216,7 @@ HiveInserts_EDIT
  | HiveInserts HiveInsert_EDIT HiveInserts
  ;
 
+// TODO: Verify Hive unions in insert
 HiveInsert
  : HiveInsertWithoutQuery SelectWithoutTableExpression OptionalSelectConditions
  ;
@@ -233,7 +248,6 @@ HiveInsert_EDIT
  | HiveInsertWithoutQuery SelectWithoutTableExpression OptionalSelectConditions_EDIT
  ;
 
-// Also for Impala
 InsertValuesStatement
  : '<hive>INSERT' 'INTO' OptionalHiveTable SchemaQualifiedTableIdentifier OptionalPartitionSpec 'VALUES' InsertValuesList
    {
@@ -281,7 +295,6 @@ ParenthesizedRowValuesList
 
 OptionalTable
  :
- | '<impala>TABLE'
  | 'TABLE'
  ;
 
@@ -366,4 +379,125 @@ SelectWithoutTableExpression_EDIT
 OptionalHiveTable
  :
  | '<hive>TABLE'
+ ;
+
+ImpalaInsertStatement
+ : ImpalaInsertStatementWithoutCTE
+ ;
+
+ImpalaInsertStatement_EDIT
+ : ImpalaInsertStatementWithoutCTE_EDIT
+ ;
+
+ImpalaInsertStatementWithoutCTE
+ : ImpalaInsertLeftPart OptionalImpalaShuffleOrNoShuffle SelectStatement OptionalUnions
+ | ImpalaInsertLeftPart 'VALUES' ImpalaRowValuesLists
+ ;
+
+ImpalaInsertStatementWithoutCTE_EDIT
+ : ImpalaInsertLeftPart_EDIT
+ | ImpalaInsertLeftPart OptionalImpalaShuffleOrNoShuffle 'CURSOR'
+   {
+     var keywords = $1.suggestKeywords && !$2 ? createWeightedKeywords($1.suggestKeywords, 2) : [];
+     if (!$2) {
+       keywords = keywords.concat(['[NOSHUFFLE]', '[SHUFFLE]', 'SELECT', 'VALUES'])
+     } else {
+       keywords = keywords.concat(['SELECT'])
+     }
+     suggestKeywords(keywords);
+   }
+ | ImpalaInsertLeftPart_EDIT OptionalImpalaShuffleOrNoShuffle SelectStatement OptionalUnions
+ | ImpalaInsertLeftPart OptionalImpalaShuffleOrNoShuffle SelectStatement_EDIT OptionalUnions
+ | ImpalaInsertLeftPart OptionalImpalaShuffleOrNoShuffle SelectStatement OptionalUnions_EDIT
+ | ImpalaInsertLeftPart_EDIT 'VALUES' ImpalaRowValuesLists
+ | ImpalaInsertLeftPart 'VALUES' ImpalaRowValuesLists_EDIT
+ ;
+
+ImpalaInsertLeftPart
+ : '<impala>INSERT' IntoOrOverwrite OptionalImpalaTable SchemaQualifiedTableIdentifier OptionalParenthesizedColumnList OptionalPartitionSpec
+   {
+     $4.owner = 'insert';
+     addTablePrimary($4);
+     if (!$6) {
+       $$ = { suggestKeywords: ['PARTITION'] };
+     }
+   }
+ ;
+
+ImpalaInsertLeftPart_EDIT
+ : '<impala>INSERT' 'CURSOR'
+   {
+     suggestKeywords(['INTO', 'OVERWRITE']);
+   }
+ | '<impala>INSERT' IntoOrOverwrite OptionalImpalaTable 'CURSOR'
+   {
+     if (!$3) {
+       suggestKeywords(['TABLE']);
+     }
+     suggestTables();
+     suggestDatabases({ appendDot: true });
+   }
+ | '<impala>INSERT' IntoOrOverwrite OptionalImpalaTable 'CURSOR' SchemaQualifiedTableIdentifier OptionalParenthesizedColumnList OptionalPartitionSpec
+   {
+     if (!$3) {
+       suggestKeywords(['TABLE']);
+     }
+   }
+ | '<impala>INSERT' IntoOrOverwrite OptionalImpalaTable SchemaQualifiedTableIdentifier_EDIT OptionalParenthesizedColumnList OptionalPartitionSpec
+ | '<impala>INSERT' IntoOrOverwrite OptionalImpalaTable SchemaQualifiedTableIdentifier OptionalParenthesizedColumnList_EDIT OptionalPartitionSpec
+   {
+     $4.owner = 'insert';
+     addTablePrimary($4);
+     if (parser.yy.result.suggestColumns) {
+       parser.yy.result.suggestColumns.owner = 'insert';
+     }
+   }
+ | '<impala>INSERT' IntoOrOverwrite OptionalImpalaTable SchemaQualifiedTableIdentifier OptionalParenthesizedColumnList OptionalPartitionSpec_EDIT
+   {
+     $4.owner = 'insert';
+     addTablePrimary($4);
+     if (parser.yy.result.suggestColumns) {
+       parser.yy.result.suggestColumns.owner = 'insert';
+     }
+   }
+ ;
+
+IntoOrOverwrite
+ : 'INTO'
+ | '<impala>OVERWRITE'
+ ;
+
+OptionalImpalaTable
+ :
+ | '<impala>TABLE'
+ ;
+
+OptionalImpalaShuffleOrNoShuffle
+ :
+ | '<impala>SHUFFLE'
+ | '<impala>NOSHUFFLE'
+ ;
+
+ImpalaRowValuesLists
+ : ParenthesizedImpalaRowValuesList
+ | ImpalaRowValuesLists ',' ParenthesizedImpalaRowValuesList
+ ;
+
+ImpalaRowValuesLists_EDIT
+ : ParenthesizedImpalaRowValuesList_EDIT
+ | ImpalaRowValuesLists ',' ParenthesizedImpalaRowValuesList_EDIT
+ | ImpalaRowValuesLists ',' ParenthesizedImpalaRowValuesList_EDIT ',' ImpalaRowValuesLists
+ | ParenthesizedImpalaRowValuesList_EDIT ',' ImpalaRowValuesLists
+ ;
+
+ParenthesizedImpalaRowValuesList
+ : '(' ValueExpressionList ')'
+ ;
+
+ParenthesizedImpalaRowValuesList_EDIT
+ : '(' AnyCursor RightParenthesisOrError
+   {
+     suggestFunctions();
+   }
+ | '(' ValueExpressionList_EDIT RightParenthesisOrError
  ;

+ 12 - 5
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql_main.jison

@@ -140,6 +140,9 @@ NonReservedKeyword
  | '<impala>GRANT'
  | '<impala>ROLE'
  | '<impala>ROLES'
+// | '<impala>BROADCAST'
+// | '<impala>NOSHUFFLE'
+// | '<impala>SHUFFLE'
  ;
 
 NonReservedKeyword
@@ -199,6 +202,14 @@ SqlStatement_EDIT
        suggestDdlAndDmlKeywords();
      }
    }
+ | CommonTableExpression 'CURSOR'
+   {
+     if (isHive() || isImpala()) {
+       suggestKeywords(['INSERT', 'SELECT']);
+     } else {
+       suggestKeywords(['SELECT']);
+     }
+   }
  | ExplainClause_EDIT
  | DataDefinition_EDIT
  | DataManipulation_EDIT
@@ -242,7 +253,7 @@ OptionalHiveExplainTypes
 // it's not a valid statement (see ErrorStatement). It contains everything except valid starting tokens ('SELECT', 'USE' etc.)
 NonStartingToken
  : '<hive>ALL' | '<hive>ARRAY' | '<hive>AS' | '<hive>AUTHORIZATION' | '<hive>AVRO' | '<hive>BINARY' | '<hive>BUCKET' | '<hive>BUCKETS' | '<hive>CACHE' | '<hive>CLUSTER' | '<hive>CLUSTERED' | '<hive>COLLECTION' | '<hive>COMPUTE' | '<hive>CONF' | '<hive>CROSS' | '<hive>CUBE' | '<hive>CURRENT' | '<hive>DATE' | '<hive>DEFERRED' | '<hive>DELIMITED' | '<hive>DEPENDENCY' | '<hive>DIRECTORY' | '<hive>DISTRIBUTE' | '<hive>DISTRIBUTED' | '<hive>ESCAPED' | '<hive>EXTENDED' | '<hive>EXTERNAL' | '<hive>FIELDS' | '<hive>FILE' | '<hive>FOR' | '<hive>FORMAT' | '<hive>FUNCTION' | '<hive>GRANT' | '<hive>GROUPING' | '<hive>IDXPROPERTIES' | '<hive>LATERAL' | '<hive>LOCAL' | '<hive>MACRO' | '<hive>OVERWRITE' | '<hive>PARTITION' | '<hive>REBUILD' | '<hive>REPAIR' | '<hive>ROLLUP' | '<hive>SETS' | '<hive>STATISTICS' | '<hive>TABLE' | '<hive>USER' | '<hive>ASC' | '<hive>COLUMNS' | '<hive>COMMENT' | '<hive>COMPACTIONS' | '<hive>DATA' | '<hive>DATABASES' | '<hive>DEFINED' | '<hive>DESC' |  '<hive>FORMATTED' | '<hive>FUNCTIONS' | '<hive>INDEX' | '<hive>INDEXES' | '<hive>INPATH' | '<hive>INPUTFORMAT' | '<hive>ITEMS' | '<hive>JAR' | '<hive>KEYS' | '<hive>LINES' | '<hive>LOCATION' | '<hive>LOCKS' | '<hive>MAP' | '<hive>METADATA' | '<hive>NONE' | '<hive>NOSCAN' | '<hive>OF' | '<hive>ORC' | '<hive>OUT' | '<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>STORED_AS_DIRECTORIES' | '<hive>STRING' | '<hive>STRUCT' | '<hive>TABLES' | '<hive>TABLESAMPLE' | '<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>LIMIT' | '<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>STRAIGHT_JOIN' | '<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>]'
+ | '<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>LIMIT' | '<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>STRAIGHT_JOIN' | '<impala>SYMBOL' | '<impala>TABLE' | '<impala>TABLES' | '<impala>USING' | '<impala>ANALYTIC' | '<impala>ANTI' | '<impala>CURRENT' | '<impala>GRANT' | '<impala>NOSHUFFLE' | '<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' | 'HAVING' | 'IF' | 'IN' | 'INNER' | 'INSERT' | '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' | 'VALUES' | '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'
@@ -1068,10 +1079,6 @@ QuerySpecification
 QuerySpecification_EDIT
  : SelectStatement_EDIT OptionalUnions
  | SelectStatement OptionalUnions_EDIT
- | CommonTableExpression 'CURSOR'
-   {
-     suggestKeywords(['SELECT']); // TODO: Move up for more statement types
-   }
  | CommonTableExpression '(' QuerySpecification_EDIT ')'
    {
      addCommonTableExpressions($1);

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/sql.js


+ 266 - 0
desktop/core/src/desktop/static/desktop/spec/autocomplete/sqlSpecInsert.js

@@ -217,6 +217,19 @@ define([
         });
       });
 
+      it('should suggest keywords for "WITH t1 as (select 1), t2 as (select 2) |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'WITH t1 as (select 1), t2 as (select 2) ',
+          afterCursor: '',
+          dialect: 'hive',
+          noErrors: true,
+          containsKeywords: ['INSERT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
       it('should suggest tables for "FROM |"', function() {
         assertAutoComplete({
           beforeCursor: 'FROM ',
@@ -858,6 +871,259 @@ define([
           }
         });
       });
+
+      it('should suggest identifier for "WITH t1 AS (SELECT 1), t2 AS (SELECT 2) INSERT INTO tab SELECT * FROM |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'WITH t1 AS (SELECT 1), t2 AS (SELECT 2) INSERT INTO tab SELECT * FROM ',
+          afterCursor: '',
+          dialect: 'hive',
+          noErrors: true,
+          hasLocations: true,
+          expectedResult: {
+            lowerCase: false,
+            suggestTables: {},
+            suggestDatabases: { appendDot: true},
+            suggestCommonTableExpressions: [{ name: 't1' },{ name: 't2' }]
+          }
+        });
+      });
+    });
+
+    describe('Impala specific', function () {
+      it('should handle "INSERT INTO TABLE boo.baa (a, b) PARTITION (a=1) VALUES (1, 2);|"', function() {
+        assertAutoComplete({
+          beforeCursor: 'INSERT INTO TABLE boo.baa (a, b) PARTITION (a=1) VALUES (1, 2);',
+          afterCursor: '',
+          dialect: 'impala',
+          hasLocations: true,
+          noErrors: true,
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should handle "INSERT OVERWRITE boo.baa [SHUFFLE] SELECT * FROM bla;|"', function() {
+        assertAutoComplete({
+          beforeCursor: 'INSERT OVERWRITE boo.baa [SHUFFLE] SELECT * FROM bla;',
+          afterCursor: '',
+          dialect: 'impala',
+          hasLocations: true,
+          noErrors: true,
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should handle "WITH t1 AS (SELECT 1), t2 AS (SELECT 2) INSERT OVERWRITE tab SELECT * FROM t1, t2;|"', function() {
+        assertAutoComplete({
+          beforeCursor: 'WITH t1 AS (SELECT 1), t2 AS (SELECT 2) INSERT OVERWRITE tab SELECT * FROM t1, t2;',
+          afterCursor: '',
+          dialect: 'impala',
+          hasLocations: true,
+          noErrors: true,
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should suggest keywords for "WITH t1 as (select 1), t2 as (select 2) |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'WITH t1 as (select 1), t2 as (select 2) ',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          containsKeywords: ['INSERT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should suggest keywords for "INSERT |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'INSERT ',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          expectedResult: {
+            lowerCase: false,
+            suggestKeywords: ['INTO', 'OVERWRITE' ]
+          }
+        });
+      });
+
+      it('should suggest tables for "INSERT INTO |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'INSERT INTO ',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          expectedResult: {
+            lowerCase: false,
+            suggestTables: {},
+            suggestDatabases: { appendDot: true },
+            suggestKeywords: ['TABLE' ]
+          }
+        });
+      });
+
+      it('should suggest tables for "INSERT INTO boo.|"', function() {
+        assertAutoComplete({
+          beforeCursor: 'INSERT INTO boo.',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          expectedResult: {
+            lowerCase: false,
+            suggestTables: { database: 'boo' }
+          }
+        });
+      });
+
+      it('should suggest keywords for "INSERT INTO baa |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'INSERT INTO baa ',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          hasLocations: true,
+          expectedResult: {
+            lowerCase: false,
+            suggestKeywords: ['PARTITION', '[NOSHUFFLE]', '[SHUFFLE]', 'SELECT', 'VALUES']
+          }
+        });
+      });
+
+      it('should suggest keywords for "INSERT INTO baa [SHUFFLE] |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'INSERT INTO baa [SHUFFLE] ',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          hasLocations: true,
+          expectedResult: {
+            lowerCase: false,
+            suggestKeywords: ['SELECT']
+          }
+        });
+      });
+
+      it('should suggest tables for "INSERT INTO baa [SHUFFLE] SELECT * FROM |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'INSERT INTO baa [SHUFFLE] SELECT * FROM ',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          hasLocations: true,
+          expectedResult: {
+            lowerCase: false,
+            suggestTables: {},
+            suggestDatabases: { appendDot: true }
+          }
+        });
+      });
+
+      it('should suggest tables for "INSERT INTO TABLE boo.baa (|"', function() {
+        assertAutoComplete({
+          beforeCursor: 'INSERT INTO boo.baa (',
+          afterCursor: '',
+          dialect: 'impala',
+          hasLocations: true,
+          expectedResult: {
+            lowerCase: false,
+            suggestColumns: { tables: [{ database: 'boo', table: 'baa' }] }
+          }
+        });
+      });
+
+      it('should suggest tables for "INSERT INTO TABLE boo.baa (a, |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'INSERT INTO boo.baa (a, ',
+          afterCursor: '',
+          dialect: 'impala',
+          hasLocations: true,
+          expectedResult: {
+            lowerCase: false,
+            suggestColumns: { tables: [{ database: 'boo', table: 'baa' }] }
+          }
+        });
+      });
+
+      it('should suggest keywords for "WITH t1 as (select 1), t2 as (select 2) INSERT INTO baa (a, b) |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'WITH t1 as (select 1), t2 as (select 2) INSERT INTO baa ',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          hasLocations: true,
+          expectedResult: {
+            lowerCase: false,
+            suggestKeywords: ['PARTITION', '[NOSHUFFLE]', '[SHUFFLE]', 'SELECT', 'VALUES']
+          }
+        });
+      });
+
+      it('should suggest columns for "INSERT INTO TABLE boo.baa (a, b) PARTITION(a = 1, |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'INSERT INTO TABLE boo.baa (a, b) PARTITION(a = 1, ',
+          afterCursor: '',
+          dialect: 'impala',
+          hasLocations: true,
+          expectedResult: {
+            lowerCase: false,
+            suggestColumns: { tables: [{ database: 'boo', table: 'baa' }] }
+          }
+        });
+      });
+
+      it('should not suggest keywords for "INSERT INTO TABLE boo.baa (a, b) VALUES (1, 2) |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'INSERT INTO TABLE boo.baa (a, b) VALUES (1, 2) |',
+          afterCursor: '',
+          dialect: 'impala',
+          hasLocations: true,
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should suggest tables for "INSERT OVERWRITE |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'INSERT OVERWRITE ',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          expectedResult: {
+            lowerCase: false,
+            suggestTables: {},
+            suggestDatabases: { appendDot: true },
+            suggestKeywords: ['TABLE' ]
+          }
+        });
+      });
+
+      it('should suggest identifier for "with t1 as (select 1), t2 as (select 2) insert into tab select * from |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'with t1 as (select 1), t2 as (select 2) insert into tab select * from ',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          hasLocations: true,
+          expectedResult: {
+            lowerCase: true,
+            suggestTables: {},
+            suggestDatabases: { appendDot: true},
+            suggestCommonTableExpressions: [{ name: 't1' },{ name: 't2' }]
+          }
+        });
+      });
     });
   });
 });

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

@@ -5876,9 +5876,9 @@ define([
           beforeCursor: 'WITH t1 AS (SELECT * FROM boo) ',
           afterCursor: '',
           hasLocations: true,
+          containsKeywords: ['SELECT'],
           expectedResult: {
-            lowerCase: false,
-            suggestKeywords: ['SELECT']
+            lowerCase: false
           }
         });
       });

+ 2 - 2
desktop/core/src/desktop/static/desktop/spec/autocompleterTestUtils.js

@@ -133,8 +133,8 @@ define([
               pass: jasmine.matchersUtil.equals(actualResponse, testDefinition.expectedResult),
               message: '\n        Statement: ' + testDefinition.beforeCursor + '|' + testDefinition.afterCursor + '\n' +
                          '          Dialect: ' + testDefinition.dialect + '\n' +
-                         'Expected response: ' + JSON.stringify(testDefinition.expectedResult) + '\n' +
-                         '  Parser response: ' + JSON.stringify(actualResponse) +   '\n'
+                         'Expected response: ' + JSON.stringify(testDefinition.expectedResult).replace(/["]/g, '\'') + '\n' +
+                         '  Parser response: ' + JSON.stringify(actualResponse).replace(/["]/g, '\'') +   '\n'
             };
           }
         }

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.