瀏覽代碼

HUE-6835 [autocomplete] Add support for the Impala UPSERT statement

Johan Ahlen 8 年之前
父節點
當前提交
095d2b8

File diff suppressed because it is too large
+ 0 - 0
desktop/core/src/desktop/static/desktop/js/ace/mode-impala.js


+ 1 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql.jisonlex

@@ -276,6 +276,7 @@
 <impala>'TEXTFILE'                         { return '<impala>TEXTFILE'; }
 <impala>'UNCACHED'                         { return '<impala>UNCACHED'; }
 <impala>'UPDATE_FN'                        { return '<impala>UPDATE_FN'; }
+<impala>'UPSERT'                           { parser.determineCase(yytext); return '<impala>UPSERT'; }
 <impala>'URI'                              { return '<impala>URI'; }
 <impala>'USING'                            { return '<impala>USING'; }
 <impala>PARTITION\s+VALUE\s                { return '<impala>PARTITION_VALUE'; }

+ 73 - 20
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql_insert.jison

@@ -21,25 +21,25 @@ DataManipulation
 InsertStatement
  : HiveInsertStatement
  | InsertValuesStatement
- | ImpalaInsertStatement
+ | ImpalaInsertOrUpsertStatement
  | CommonTableExpression HiveInsertStatement
- | CommonTableExpression ImpalaInsertStatement
+ | CommonTableExpression ImpalaInsertOrUpsertStatement
  ;
 
 DataManipulation_EDIT
  : HiveInsertStatement_EDIT
  | InsertValuesStatement_EDIT
- | ImpalaInsertStatement_EDIT
+ | ImpalaInsertOrUpsertStatement_EDIT
  | CommonTableExpression HiveInsertStatement_EDIT
    {
      parser.addCommonTableExpressions($1);
    }
  | CommonTableExpression_EDIT HiveInsertStatement
- | CommonTableExpression ImpalaInsertStatement_EDIT
+ | CommonTableExpression ImpalaInsertOrUpsertStatement_EDIT
    {
      parser.addCommonTableExpressions($1);
    }
- | CommonTableExpression_EDIT ImpalaInsertStatement
+ | CommonTableExpression_EDIT ImpalaInsertOrUpsertStatement
  ;
 
 HiveInsertStatement
@@ -365,22 +365,22 @@ OptionalHiveTable
  | '<hive>TABLE'
  ;
 
-ImpalaInsertStatement
- : ImpalaInsertStatementWithoutCTE
+ImpalaInsertOrUpsertStatement
+ : ImpalaInsertOrUpsertStatementWithoutCTE
  ;
 
-ImpalaInsertStatement_EDIT
- : ImpalaInsertStatementWithoutCTE_EDIT
+ImpalaInsertOrUpsertStatement_EDIT
+ : ImpalaInsertOrUpsertStatementWithoutCTE_EDIT
  ;
 
-ImpalaInsertStatementWithoutCTE
- : ImpalaInsertLeftPart OptionalImpalaShuffleOrNoShuffle SelectStatement OptionalUnions
- | ImpalaInsertLeftPart 'VALUES' ImpalaRowValuesLists
+ImpalaInsertOrUpsertStatementWithoutCTE
+ : ImpalaInsertOrUpsertLeftPart OptionalImpalaShuffleOrNoShuffle SelectStatement OptionalUnions
+ | ImpalaInsertOrUpsertLeftPart 'VALUES' ImpalaRowValuesLists
  ;
 
-ImpalaInsertStatementWithoutCTE_EDIT
- : ImpalaInsertLeftPart_EDIT
- | ImpalaInsertLeftPart OptionalImpalaShuffleOrNoShuffle 'CURSOR'
+ImpalaInsertOrUpsertStatementWithoutCTE_EDIT
+ : ImpalaInsertOrUpsertLeftPart_EDIT
+ | ImpalaInsertOrUpsertLeftPart OptionalImpalaShuffleOrNoShuffle 'CURSOR'
    {
      var keywords = $1.suggestKeywords && !$2 ? parser.createWeightedKeywords($1.suggestKeywords, 2) : [];
      if (!$2) {
@@ -390,13 +390,64 @@ ImpalaInsertStatementWithoutCTE_EDIT
      }
      parser.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
+ | ImpalaInsertOrUpsertLeftPart_EDIT OptionalImpalaShuffleOrNoShuffle SelectStatement OptionalUnions
+ | ImpalaInsertOrUpsertLeftPart OptionalImpalaShuffleOrNoShuffle SelectStatement_EDIT OptionalUnions
+ | ImpalaInsertOrUpsertLeftPart OptionalImpalaShuffleOrNoShuffle SelectStatement OptionalUnions_EDIT
+ | ImpalaInsertOrUpsertLeftPart_EDIT 'VALUES' ImpalaRowValuesLists
+ | ImpalaInsertOrUpsertLeftPart 'VALUES' ImpalaRowValuesLists_EDIT
  ;
 
+ImpalaInsertOrUpsertLeftPart
+ : ImpalaUpsertStatementLeftPart
+ | ImpalaInsertLeftPart
+ ;
+
+ImpalaInsertOrUpsertLeftPart_EDIT
+ : ImpalaUpsertStatementLeftPart_EDIT
+ | ImpalaInsertLeftPart_EDIT
+ ;
+
+ImpalaUpsertStatementLeftPart
+ : '<impala>UPSERT' 'INTO' OptionalImpalaTable SchemaQualifiedTableIdentifier OptionalParenthesizedColumnList
+   {
+     $4.owner = 'upsert';
+     parser.addTablePrimary($4);
+   }
+ ;
+
+ImpalaUpsertStatementLeftPart_EDIT
+ : '<impala>UPSERT' 'CURSOR'
+   {
+     parser.suggestKeywords(['INTO']);
+   }
+ | '<impala>UPSERT' 'INTO' OptionalImpalaTable 'CURSOR'
+   {
+     if (!$3) {
+       parser.suggestKeywords(['TABLE']);
+     }
+     parser.suggestTables();
+     parser.suggestDatabases({ appendDot: true });
+   }
+ | '<impala>UPSERT' 'INTO' OptionalImpalaTable 'CURSOR' SchemaQualifiedTableIdentifier OptionalParenthesizedColumnList
+   {
+     if (!$3) {
+       parser.suggestKeywords(['TABLE']);
+     }
+     $5.owner = 'upsert';
+     parser.addTablePrimary($5);
+   }
+ | '<impala>UPSERT' 'INTO' OptionalImpalaTable SchemaQualifiedTableIdentifier_EDIT OptionalParenthesizedColumnList
+ | '<impala>UPSERT' 'INTO' OptionalImpalaTable SchemaQualifiedTableIdentifier OptionalParenthesizedColumnList_EDIT
+   {
+     $4.owner = 'upsert';
+     parser.addTablePrimary($4);
+     if (parser.yy.result.suggestColumns) {
+       parser.yy.result.suggestColumns.owner = 'upsert';
+     }
+   }
+ ;
+
+
 ImpalaInsertLeftPart
  : '<impala>INSERT' IntoOrOverwrite OptionalImpalaTable SchemaQualifiedTableIdentifier OptionalParenthesizedColumnList OptionalPartitionSpec
    {
@@ -426,6 +477,8 @@ ImpalaInsertLeftPart_EDIT
      if (!$3) {
        parser.suggestKeywords(['TABLE']);
      }
+     $5.owner = 'insert';
+     parser.addTablePrimary($5);
    }
  | '<impala>INSERT' IntoOrOverwrite OptionalImpalaTable SchemaQualifiedTableIdentifier_EDIT OptionalParenthesizedColumnList OptionalPartitionSpec
  | '<impala>INSERT' IntoOrOverwrite OptionalImpalaTable SchemaQualifiedTableIdentifier OptionalParenthesizedColumnList_EDIT OptionalPartitionSpec

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

@@ -310,7 +310,7 @@ OptionalHiveExplainTypes
 NonStartingToken
  : '<hive>ADMIN' | '<hive>ALL' | '<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>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>LOCK' | '<hive>MACRO' | '<hive>OVERWRITE' | '<hive>PARTITION' | '<hive>PRIVILEGES' | '<hive>REBUILD' | '<hive>REPAIR' | '<hive>REPLICATION' |'<hive>ROLLUP' | '<hive>SETS' | '<hive>STATISTICS' | '<hive>SHOW_DATABASE' | '<hive>TABLE' | '<hive>TIMESTAMP' |'<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>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>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>CASCADE' | '<impala>CLOSE_FN' | '<impala>COLUMN' | '<impala>COMMENT' | '<impala>DATA' | '<impala>DATABASES' | '<impala>DELETE' | '<impala>DELIMITED' | '<impala>ESCAPED' | '<impala>EXTENDED' |'<impala>EXTERNAL' | '<impala>FIELDS' | '<impala>FINALIZE_FN' | '<impala>FIRST' | '<impala>FORMAT' | '<impala>FORMATTED' | '<impala>FUNCTION' | '<impala>FUNCTIONS' | '<impala>GROUP' | '<impala>HASH' | '<impala>ILIKE' | '<impala>INCREMENTAL' | '<impala>INTERMEDIATE' | '<impala>INTERVAL' | '<impala>INIT_FN' | '<impala>INPATH' | '<impala>IREGEXP' | '<impala>KEY' | '<impala>KUDU' | '<impala>LAST' | '<impala>LIMIT' | '<impala>LINES' | '<impala>LOCATION' | '<impala>MERGE_FN' | '<impala>NULLS' | '<impala>PARTITIONS' | '<impala>PREPARE_FN' | '<impala>PRIMARY' | '<impala>RANGE' | '<impala>REAL' | '<impala>RECOVER' | '<impala>REPLICATION' | '<impala>RESTRICT' | '<impala>RETURNS' | '<impala>SCHEMAS' | '<impala>SERIALIZE_FN' | '<impala>SERVER' | '<impala>SORT' | '<impala>STATS' | '<impala>STRAIGHT_JOIN' | '<impala>SYMBOL' | '<impala>TABLE' | '<impala>TABLES' | '<impala>URI' | '<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' | 'ARRAY' | 'AS' | 'ASC' | 'BETWEEN' | 'BIGINT' | 'BOOLEAN' | 'BY' | 'CASE' | 'CHAR' | 'CROSS' | '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' | 'MAP' | 'NOT' | 'NULL' | 'ON' | 'OPTION' | 'ORDER' | 'OUTER' | 'OVER' | 'PARTITION' | 'PRECEDING' | 'PURGE' | 'RANGE' | 'REGEXP' | 'RIGHT' | 'RLIKE' | 'ROW' | 'ROWS' | 'SCHEMA' | 'SEMI' | 'SET' | 'SMALLINT' | 'STRING' | 'STRUCT' | 'TABLE' | 'THEN' | 'TIMESTAMP' | 'TINYINT' | 'TRUE' | 'UNION' | 'VALUES' | 'VARCHAR' | 'WHEN' | 'WHERE' | 'WITH' | 'ROLE'
+ | 'ALL' | 'ARRAY' | 'AS' | 'ASC' | 'BETWEEN' | 'BIGINT' | 'BOOLEAN' | 'BY' | 'CASE' | 'CHAR' | 'CROSS' | 'CURRENT' | 'DATABASE' | 'DECIMAL' | 'DISTINCT' | 'DOUBLE' | 'DESC' | 'ELSE' | 'END' | 'EXISTS' | 'FALSE' | 'FLOAT' | 'FOLLOWING' | 'FROM' | 'FULL' | 'GROUP' | 'HAVING' | 'IF' | 'IN' | 'INNER' | 'INT' | 'INTO' | 'IS' | 'JOIN' | 'LEFT' | 'LIKE' | 'LIMIT' | 'MAP' | 'NOT' | 'NULL' | 'ON' | 'OPTION' | 'ORDER' | 'OUTER' | 'OVER' | 'PARTITION' | 'PRECEDING' | 'PURGE' | 'RANGE' | 'REGEXP' | 'RIGHT' | 'RLIKE' | 'ROW' | 'ROWS' | 'SCHEMA' | 'SEMI' | 'SET' | 'SMALLINT' | 'STRING' | 'STRUCT' | '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>DAY' | '<hive>DAYOFWEEK' | '<hive>HISTOGRAM_NUMERIC' | '<hive>HOUR' | '<hive>MINUTE' | '<hive>MONTH' | '<hive>NTILE' | '<hive>PERCENTILE' | '<hive>PERCENTILE_APPROX' | '<hive>QUARTER' | '<hive>SECOND' | '<hive>WEEK' | '<hive>YEAR'
  | '<impala>APPX_MEDIAN' | '<impala>EXTRACT' | '<impala>GROUP_CONCAT' | '<impala>STDDEV' | '<impala>VARIANCE_POP' | '<impala>VARIANCE_SAMP'

+ 1 - 1
desktop/core/src/desktop/static/desktop/js/autocomplete/spec/sqlSpec.js

@@ -409,7 +409,7 @@
             lowerCase: false,
             suggestKeywords: ['ALTER', 'COMPUTE', 'CREATE', 'DELETE', 'DESCRIBE',
               'DROP', 'EXPLAIN', 'GRANT', 'INSERT', 'INVALIDATE METADATA', 'LOAD', 'REFRESH',
-              'REVOKE', 'SELECT', 'SET', 'SHOW', 'TRUNCATE', 'UPDATE', 'USE', 'WITH']
+              'REVOKE', 'SELECT', 'SET', 'SHOW', 'TRUNCATE', 'UPDATE', 'UPSERT', 'USE', 'WITH']
           }
         });
       });

+ 135 - 3
desktop/core/src/desktop/static/desktop/js/autocomplete/spec/sqlSpecInsert.js

@@ -907,6 +907,58 @@
     });
 
     describe('Impala specific', function () {
+      it('should suggest keywords for "|"', function() {
+        assertAutoComplete({
+          beforeCursor: '',
+          afterCursor: '',
+          dialect: 'impala',
+          containsKeywords: ['UPSERT'],
+          noErrors: true,
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should handle "UPSERT INTO TABLE boo.baa (a, b) VALUES (1, 2);|"', function() {
+        assertAutoComplete({
+          beforeCursor: 'UPSERT INTO TABLE boo.baa (a, b) VALUES (1, 2);',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should handle "UPSERT INTO production_table SELECT * FROM staging_table WHERE c1 IS NOT NULL AND c2 > 0;|"', function() {
+        assertAutoComplete({
+          beforeCursor: 'UPSERT INTO production_table SELECT * FROM staging_table WHERE c1 IS NOT NULL AND c2 > 0;',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should handle "UPSERT INTO boo.baa [SHUFFLE] SELECT * FROM bla;|"', function() {
+        assertAutoComplete({
+          beforeCursor: 'UPSERT INTO boo.baa [SHUFFLE] SELECT * FROM bla;',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
       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);',
@@ -959,6 +1011,86 @@
         });
       });
 
+      it('should suggest keywords for "UPSERT |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'UPSERT ',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          expectedResult: {
+            lowerCase: false,
+            suggestKeywords: ['INTO']
+          }
+        });
+      });
+
+      it('should suggest tables for "UPSERT INTO |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'UPSERT INTO ',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          expectedResult: {
+            lowerCase: false,
+            suggestTables: {},
+            suggestDatabases: { appendDot: true },
+            suggestKeywords: ['TABLE' ]
+          }
+        });
+      });
+
+      it('should suggest tables for "UPSERT INTO boo.|"', function() {
+        assertAutoComplete({
+          beforeCursor: 'UPSERT INTO boo.',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          expectedResult: {
+            lowerCase: false,
+            suggestTables: { identifierChain: [{ name: 'boo' }] }
+          }
+        });
+      });
+
+      it('should suggest keywords for "UPSERT INTO baa |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'UPSERT INTO baa ',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          expectedResult: {
+            lowerCase: false,
+            suggestKeywords: ['[NOSHUFFLE]', '[SHUFFLE]', 'SELECT', 'VALUES']
+          }
+        });
+      });
+
+      it('should suggest tables for "UPSERT INTO baa [SHUFFLE] SELECT * FROM |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'UPSERT INTO baa [SHUFFLE] SELECT * FROM ',
+          afterCursor: '',
+          dialect: 'impala',
+          noErrors: true,
+          expectedResult: {
+            lowerCase: false,
+            suggestTables: {},
+            suggestDatabases: { appendDot: true }
+          }
+        });
+      });
+
+      it('should suggest columns for "UPSERT INTO TABLE boo.baa (|"', function() {
+        assertAutoComplete({
+          beforeCursor: 'UPSERT INTO boo.baa (',
+          afterCursor: '',
+          dialect: 'impala',
+          expectedResult: {
+            lowerCase: false,
+            suggestColumns: { tables: [{ identifierChain: [{ name: 'boo' }, { name: 'baa' }] }] }
+          }
+        });
+      });
+
       it('should suggest keywords for "INSERT |"', function() {
         assertAutoComplete({
           beforeCursor: 'INSERT ',
@@ -1040,7 +1172,7 @@
         });
       });
 
-      it('should suggest tables for "INSERT INTO TABLE boo.baa (|"', function() {
+      it('should suggest columns for "INSERT INTO TABLE boo.baa (|"', function() {
         assertAutoComplete({
           beforeCursor: 'INSERT INTO boo.baa (',
           afterCursor: '',
@@ -1052,7 +1184,7 @@
         });
       });
 
-      it('should suggest tables for "INSERT INTO TABLE boo.baa (a, |"', function() {
+      it('should suggest columns for "INSERT INTO TABLE boo.baa (a, |"', function() {
         assertAutoComplete({
           beforeCursor: 'INSERT INTO boo.baa (a, ',
           afterCursor: '',
@@ -1092,7 +1224,7 @@
 
       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) |',
+          beforeCursor: 'INSERT INTO TABLE boo.baa (a, b) VALUES (1, 2) ',
           afterCursor: '',
           dialect: 'impala',
           expectedResult: {

+ 1 - 1
desktop/core/src/desktop/static/desktop/js/autocomplete/spec/sqlSyntaxParserSpec.js

@@ -150,7 +150,7 @@
       it('should suggest expected words for "SLELECT "', function() {
         var result = sqlSyntaxParser.parseSyntax('SLELECT ', '', 'impala');
         expect(result).toBeTruthy();
-        expect(expectedToStrings(result.expected)).toEqual(['SELECT', 'DELETE', 'SET', 'ALTER', 'INSERT', 'CREATE', 'EXPLAIN', 'GRANT', 'LOAD', 'REFRESH', 'REVOKE', 'SHOW', 'USE', 'COMPUTE', 'DROP', 'FROM', 'TRUNCATE', 'UPDATE', 'WITH', 'DESCRIBE', 'INVALIDATE']);
+        expect(expectedToStrings(result.expected)).toEqual(['SELECT', 'DELETE', 'SET', 'ALTER', 'INSERT', 'UPSERT', 'CREATE', 'EXPLAIN', 'GRANT', 'LOAD', 'REFRESH', 'REVOKE', 'SHOW', 'USE', 'COMPUTE', 'DROP', 'FROM', 'TRUNCATE', 'UPDATE', 'WITH', 'DESCRIBE', 'INVALIDATE']);
       });
     })
 

File diff suppressed because it is too large
+ 0 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/sqlAutocompleteParser.js


+ 1 - 1
desktop/core/src/desktop/static/desktop/js/autocomplete/sqlParseSupport.js

@@ -1077,7 +1077,7 @@ var SqlParseSupport = (function () {
       }
 
       if (parser.isImpala()) {
-        keywords = keywords.concat(['COMPUTE', 'DELETE', 'INVALIDATE METADATA', 'LOAD', 'REFRESH']);
+        keywords = keywords.concat(['COMPUTE', 'DELETE', 'INVALIDATE METADATA', 'LOAD', 'REFRESH', 'UPSERT']);
       }
 
       parser.suggestKeywords(keywords);

File diff suppressed because it is too large
+ 0 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/sqlSyntaxParser.js


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

@@ -42,7 +42,7 @@ var SqlUtils = (function () {
     INIT_FN: true, INNER: true, INPATH: true, INSERT: true, INT: true, INTEGER: true, INTERMEDIATE: true, INTERVAL: true, INTO: true, INVALIDATE: true, IS: true, JOIN: true, KEY: true, KUDU: true, LAST: true, LEFT: true, LIKE: true, LIMIT: true, LINES: true, LOAD: true, LOCATION: true, MAP: true, MERGE_FN: true, METADATA: true,
     NOT: true, NULL: true, NULLS: true, OFFSET: true, ON: true, OR: true, ORDER: true, OUTER: true, OVERWRITE: true, PARQUET: true, PARQUETFILE: true, PARTITION: true, PARTITIONED: true, PARTITIONS: true, PREPARE_FN: true, PRIMARY: true, PRODUCED: true, PURGE: true, RCFILE: true, REAL: true, REFRESH: true, REGEXP: true, RENAME: true,
     REPLACE: true, RETURNS: true, RIGHT: true, RLIKE: true, ROW: true, SCHEMA: true, SCHEMAS: true, SELECT: true, SEMI: true, SEQUENCEFILE: true, SERDEPROPERTIES: true, SERIALIZE_FN: true, SET: true, SHOW: true, SMALLINT: true, SORT: true, STATS: true, STORED: true, STRAIGHT_JOIN: true, STRING: true, STRUCT: true, SYMBOL: true, TABLE: true,
-    TABLES: true, TBLPROPERTIES: true, TERMINATED: true, TEXTFILE: true, THEN: true, TIMESTAMP: true, TINYINT: true, TO: true, TRUE: true, UNCACHED: true, UNION: true, UPDATE_FN: true, USE: true, USING: true, VALUES: true, VIEW: true, WHEN: true, WHERE: true, WITH: true
+    TABLES: true, TBLPROPERTIES: true, TERMINATED: true, TEXTFILE: true, THEN: true, TIMESTAMP: true, TINYINT: true, TO: true, TRUE: true, UNCACHED: true, UNION: true, UPDATE_FN: true, UPSERT: true, USE: true, USING: true, VALUES: true, VIEW: true, WHEN: true, WHERE: true, WITH: true
   };
 
   return {

+ 1 - 1
tools/ace-editor/lib/ace/mode/impala_highlight_rules.js

@@ -25,7 +25,7 @@ define(function (require, exports, module) {
     // regexps are ordered -> the first match is used
 
     var keywords = (
-        "ADD|AGGREGATE|ALL|ALTER|ANALYTIC|AND|ANTI|API_VERSION|AS|ASC|AVRO|BETWEEN|BINARY|BLOCK_SIZE|BY|CACHED|CASCADE|CASE|CAST|CHANGE|CLASS|CLOSE_FN|COLUMN|COLUMNS|COMMENT|COMPRESSION|COMPUTE|CREATE|CROSS|CURRENT|DATA|DATABASE|DATABASES|DATE|DATETIME|DEFAULT|DELETE|DELIMITED|DESC|DESCRIBE|DISTINCT|DIV|DROP|ELSE|ENCODING|END|ESCAPED|EXISTS|EXPLAIN|EXTENDED|EXTERNAL|FIELDS|FILEFORMAT|FINALIZE_FN|FIRST|FOLLOWING|FOR|FORMAT|FORMATTED|FROM|FULL|FUNCTION|FUNCTIONS|GRANT|GROUP|HASH|HAVING|IF|ILIKE|IN|INCREMENTAL|INIT_FN|INNER|INPATH|IREGEXP|INSERT|INTEGER|INTERMEDIATE|INTERVAL|INTO|INVALIDATE|IS|JOIN|KEY|LAST|LEFT|LIKE|LIMIT|LINES|LOAD|LOCATION|MERGE_FN|METADATA|NOT|NULLS|OFFSET|ON|OR|ORDER|OUTER|OVER|OVERWRITE|PARQUET|PARTITION|PARTITIONED|PARTITIONS|PRECEDING|PREPARE_FN|PRIMARY|PRODUCED|PURGE|RANGE|RECOVER|REFRESH|REGEXP|RENAME|RESTRICT|REPLACE|REPLICATION|RETURNS|REVOKE|RIGHT|RLIKE|ROLE|ROLES|ROW|ROWS|SCHEMA|SCHEMAS|SELECT|SEMI|SERDEPROPERTIES|SERIALIZE_FN|SET|SHOW|SORT|STATS|STORED|STRAIGHT_JOIN|SYMBOL|TABLE|TABLES|TBLPROPERTIES|TERMINATED|THEN|TO|UNBOUNDED|UNCACHED|UNION|UPDATE|UPDATE_FN|USE|USING|VALUES|VIEW|WHEN|WHERE|WITH"
+        "ADD|AGGREGATE|ALL|ALTER|ANALYTIC|AND|ANTI|API_VERSION|AS|ASC|AVRO|BETWEEN|BINARY|BLOCK_SIZE|BY|CACHED|CASCADE|CASE|CAST|CHANGE|CLASS|CLOSE_FN|COLUMN|COLUMNS|COMMENT|COMPRESSION|COMPUTE|CREATE|CROSS|CURRENT|DATA|DATABASE|DATABASES|DATE|DATETIME|DEFAULT|DELETE|DELIMITED|DESC|DESCRIBE|DISTINCT|DIV|DROP|ELSE|ENCODING|END|ESCAPED|EXISTS|EXPLAIN|EXTENDED|EXTERNAL|FIELDS|FILEFORMAT|FINALIZE_FN|FIRST|FOLLOWING|FOR|FORMAT|FORMATTED|FROM|FULL|FUNCTION|FUNCTIONS|GRANT|GROUP|HASH|HAVING|IF|ILIKE|IN|INCREMENTAL|INIT_FN|INNER|INPATH|IREGEXP|INSERT|INTEGER|INTERMEDIATE|INTERVAL|INTO|INVALIDATE|IS|JOIN|KEY|LAST|LEFT|LIKE|LIMIT|LINES|LOAD|LOCATION|MERGE_FN|METADATA|NOT|NULLS|OFFSET|ON|OR|ORDER|OUTER|OVER|OVERWRITE|PARQUET|PARTITION|PARTITIONED|PARTITIONS|PRECEDING|PREPARE_FN|PRIMARY|PRODUCED|PURGE|RANGE|RECOVER|REFRESH|REGEXP|RENAME|RESTRICT|REPLACE|REPLICATION|RETURNS|REVOKE|RIGHT|RLIKE|ROLE|ROLES|ROW|ROWS|SCHEMA|SCHEMAS|SELECT|SEMI|SERDEPROPERTIES|SERIALIZE_FN|SET|SHOW|SORT|STATS|STORED|STRAIGHT_JOIN|SYMBOL|TABLE|TABLES|TBLPROPERTIES|TERMINATED|THEN|TO|UNBOUNDED|UNCACHED|UNION|UPDATE|UPDATE_FN|UPSERT|USE|USING|VALUES|VIEW|WHEN|WHERE|WITH"
     );
 
     var builtinConstants = (

Some files were not shown because too many files changed in this diff