소스 검색

HUE-8577 [autocomplete] Add support for Impala ALTER TABLE/VIEW SET OWNER

Johan Ahlen 7 년 전
부모
커밋
c5a3e7e

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

@@ -498,6 +498,7 @@
 <impala>'UPDATE_FN'                        { return '<impala>UPDATE_FN'; }
 <impala>'UPDATE_FN'                        { return '<impala>UPDATE_FN'; }
 <impala>'UPSERT'                           { parser.determineCase(yytext); parser.addStatementTypeLocation('UPSERT', yylloc); return '<impala>UPSERT'; }
 <impala>'UPSERT'                           { parser.determineCase(yytext); parser.addStatementTypeLocation('UPSERT', yylloc); return '<impala>UPSERT'; }
 <impala>'URI'                              { return '<impala>URI'; }
 <impala>'URI'                              { return '<impala>URI'; }
+<impala>'USER'                             { return '<impala>USER'; }
 <impala>'USING'                            { return '<impala>USING'; }
 <impala>'USING'                            { return '<impala>USING'; }
 <impala>'VALUE_OF'                         { return '<impala>VALUE_OF'; }
 <impala>'VALUE_OF'                         { return '<impala>VALUE_OF'; }
 <impala>'VARBINARY'                        { return '<impala>VARBINARY'; }
 <impala>'VARBINARY'                        { return '<impala>VARBINARY'; }
@@ -514,6 +515,7 @@
 <impala>'ARRAY'                            { return 'ARRAY'; }
 <impala>'ARRAY'                            { return 'ARRAY'; }
 <impala>'DEFAULT'                          { return '<impala>DEFAULT'; }
 <impala>'DEFAULT'                          { return '<impala>DEFAULT'; }
 <impala>'MAP'                              { return 'MAP'; }
 <impala>'MAP'                              { return 'MAP'; }
+<impala>'OWNER'                            { return '<impala>OWNER'; }
 <impala>'STRUCT'                           { return 'STRUCT'; }
 <impala>'STRUCT'                           { return 'STRUCT'; }
 <impala>\[BROADCAST\]                      { return '<impala>BROADCAST'; }
 <impala>\[BROADCAST\]                      { return '<impala>BROADCAST'; }
 <impala>\[NOSHUFFLE\]                      { return '<impala>NOSHUFFLE'; }
 <impala>\[NOSHUFFLE\]                      { return '<impala>NOSHUFFLE'; }

+ 18 - 4
desktop/core/src/desktop/static/desktop/js/autocomplete/jison/sql_alter.jison

@@ -236,8 +236,8 @@ AlterTable_EDIT
      } else if (parser.isImpala()) {
      } else if (parser.isImpala()) {
        parser.suggestKeywords(['ADD COLUMNS', 'ADD PARTITION', 'ADD RANGE PARTITION', 'ALTER', 'ALTER COLUMN', 'CHANGE',
        parser.suggestKeywords(['ADD COLUMNS', 'ADD PARTITION', 'ADD RANGE PARTITION', 'ALTER', 'ALTER COLUMN', 'CHANGE',
          'DROP COLUMN', 'DROP PARTITION', 'DROP RANGE PARTITION', 'PARTITION', 'RECOVER PARTITIONS', 'RENAME TO',
          'DROP COLUMN', 'DROP PARTITION', 'DROP RANGE PARTITION', 'PARTITION', 'RECOVER PARTITIONS', 'RENAME TO',
-         'REPLACE COLUMNS', 'SET CACHED IN', 'SET COLUMN STATS', 'SET FILEFORMAT', 'SET LOCATION', 'SET ROW FORMAT',
-         'SET SERDEPROPERTIES', 'SET TBLPROPERTIES', 'SET UNCACHED']);
+         'REPLACE COLUMNS', 'SET CACHED IN', 'SET COLUMN STATS', 'SET FILEFORMAT', 'SET LOCATION', 'SET OWNER',
+         'SET ROW FORMAT', 'SET SERDEPROPERTIES', 'SET TBLPROPERTIES', 'SET UNCACHED']);
      }
      }
    }
    }
  | AlterTableLeftSide PartitionSpec 'CURSOR'
  | AlterTableLeftSide PartitionSpec 'CURSOR'
@@ -268,7 +268,7 @@ AlterTable_EDIT
      if (parser.isHive()) {
      if (parser.isHive()) {
        parser.suggestKeywords(['FILEFORMAT', 'LOCATION', 'OWNER', 'SERDE', 'SERDEPROPERTIES', 'SKEWED LOCATION', 'TBLPROPERTIES']);
        parser.suggestKeywords(['FILEFORMAT', 'LOCATION', 'OWNER', 'SERDE', 'SERDEPROPERTIES', 'SKEWED LOCATION', 'TBLPROPERTIES']);
      } else if (parser.isImpala()) {
      } else if (parser.isImpala()) {
-       parser.suggestKeywords(['CACHED IN', 'COLUMN STATS', 'FILEFORMAT', 'LOCATION', 'ROW FORMAT', 'SERDEPROPERTIES', 'TBLPROPERTIES', 'UNCACHED']);
+       parser.suggestKeywords(['CACHED IN', 'COLUMN STATS', 'FILEFORMAT', 'LOCATION', 'OWNER ROLE', 'OWNER USER', 'ROW FORMAT', 'SERDEPROPERTIES', 'TBLPROPERTIES', 'UNCACHED']);
      }
      }
    }
    }
  | AlterTableLeftSide PartitionSpec OptionalPartitionOperations_EDIT
  | AlterTableLeftSide PartitionSpec OptionalPartitionOperations_EDIT
@@ -382,6 +382,7 @@ ImpalaSpecificOperations
    {
    {
      parser.addColumnLocation($4.location, [ $4.identifier ]);
      parser.addColumnLocation($4.location, [ $4.identifier ]);
    }
    }
+ | 'SET' '<impala>OWNER' ImpalaRoleOrUser RegularOrBacktickedIdentifier
  ;
  ;
 
 
 ImpalaSpecificOperations_EDIT
 ImpalaSpecificOperations_EDIT
@@ -436,6 +437,11 @@ ImpalaSpecificOperations_EDIT
    {
    {
      parser.addColumnLocation($4.location, [ $4.identifier ]);
      parser.addColumnLocation($4.location, [ $4.identifier ]);
    }
    }
+ | 'SET' '<impala>OWNER' 'CURSOR'
+   {
+     parser.suggestKeywords(['ROLE', 'USER']);
+   }
+ | 'SET' '<impala>OWNER' ImpalaRoleOrUser 'CURSOR'
  ;
  ;
 
 
 KuduStorageAttribute
 KuduStorageAttribute
@@ -962,6 +968,7 @@ OptionalStoredAsDirectories_EDIT
 
 
 AlterView
 AlterView
  : AlterViewLeftSide 'SET' '<hive>TBLPROPERTIES' ParenthesizedPropertyAssignmentList
  : AlterViewLeftSide 'SET' '<hive>TBLPROPERTIES' ParenthesizedPropertyAssignmentList
+ | AlterViewLeftSide 'SET' '<impala>OWNER' ImpalaRoleOrUser RegularOrBacktickedIdentifier
  | AlterViewLeftSide AnyAs QuerySpecification
  | AlterViewLeftSide AnyAs QuerySpecification
  | AlterViewLeftSide '<impala>RENAME' 'TO' RegularOrBacktickedIdentifier
  | AlterViewLeftSide '<impala>RENAME' 'TO' RegularOrBacktickedIdentifier
  | AlterViewLeftSide '<impala>RENAME' 'TO' RegularOrBacktickedIdentifier '<impala>.' RegularOrBacktickedIdentifier
  | AlterViewLeftSide '<impala>RENAME' 'TO' RegularOrBacktickedIdentifier '<impala>.' RegularOrBacktickedIdentifier
@@ -974,7 +981,7 @@ AlterView_EDIT
      if (parser.isHive()) {
      if (parser.isHive()) {
        parser.suggestKeywords(['AS', 'SET TBLPROPERTIES']);
        parser.suggestKeywords(['AS', 'SET TBLPROPERTIES']);
      } else if (parser.isImpala()) {
      } else if (parser.isImpala()) {
-       parser.suggestKeywords(['AS', 'RENAME TO']);
+       parser.suggestKeywords(['AS', 'RENAME TO', 'SET OWNER']);
      } else {
      } else {
        parser.suggestKeywords(['AS']);
        parser.suggestKeywords(['AS']);
      }
      }
@@ -983,8 +990,15 @@ AlterView_EDIT
    {
    {
      if (parser.isHive()) {
      if (parser.isHive()) {
        parser.suggestKeywords(['TBLPROPERTIES']);
        parser.suggestKeywords(['TBLPROPERTIES']);
+     } else if (parser.isImpala()) {
+       parser.suggestKeywords(['OWNER ROLE', 'OWNER USER']);
      }
      }
    }
    }
+ | AlterViewLeftSide 'SET' '<impala>OWNER' 'CURSOR'
+   {
+     parser.suggestKeywords(['ROLE', 'USER']);
+   }
+ | AlterViewLeftSide 'SET' '<impala>OWNER' ImpalaRoleOrUser 'CURSOR'
  | AlterViewLeftSide AnyAs 'CURSOR'
  | AlterViewLeftSide AnyAs 'CURSOR'
    {
    {
      parser.suggestKeywords(['SELECT']);
      parser.suggestKeywords(['SELECT']);

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

@@ -237,13 +237,11 @@ NonReservedKeyword
  ;
  ;
 
 
 NonReservedKeyword
 NonReservedKeyword
- : '<impala>URI'
- | '<impala>SERVER'
-// | '<impala>BROADCAST'
-// | '<impala>NOSHUFFLE'
-// | '<impala>SHUFFLE'
- | '<impala>DEFAULT'
+ : '<impala>DEFAULT'
  | '<impala>KEY'
  | '<impala>KEY'
+ | '<impala>OWNER'
+ | '<impala>SERVER'
+ | '<impala>URI'
  ;
  ;
 
 
 NonReservedKeyword
 NonReservedKeyword
@@ -605,6 +603,7 @@ NonStartingToken
  | '<impala>OVER'
  | '<impala>OVER'
  | '<impala>OVERLAPS'
  | '<impala>OVERLAPS'
  | '<impala>OVERLAY'
  | '<impala>OVERLAY'
+ | '<impala>OWNER'
  | '<impala>PARQUET'
  | '<impala>PARQUET'
  | '<impala>PARTITIONED'
  | '<impala>PARTITIONED'
  | '<impala>PARTITIONS'
  | '<impala>PARTITIONS'
@@ -702,6 +701,7 @@ NonStartingToken
  | '<impala>UNNEST'
  | '<impala>UNNEST'
  | '<impala>UPDATE_FN'
  | '<impala>UPDATE_FN'
  | '<impala>URI'
  | '<impala>URI'
+ | '<impala>USER'
  | '<impala>USING'
  | '<impala>USING'
  | '<impala>VALUE_OF'
  | '<impala>VALUE_OF'
  | '<impala>VARBINARY'
  | '<impala>VARBINARY'
@@ -988,6 +988,11 @@ HiveRoleOrUser
  | '<hive>USER'
  | '<hive>USER'
  ;
  ;
 
 
+ImpalaRoleOrUser
+ : '<impala>ROLE'
+ | '<impala>USER'
+ ;
+
 SingleQuotedValue
 SingleQuotedValue
  : 'SINGLE_QUOTE' 'VALUE' 'SINGLE_QUOTE'  -> $2
  : 'SINGLE_QUOTE' 'VALUE' 'SINGLE_QUOTE'  -> $2
  | 'SINGLE_QUOTE' 'SINGLE_QUOTE'          -> ''
  | 'SINGLE_QUOTE' 'SINGLE_QUOTE'          -> ''
@@ -3817,6 +3822,7 @@ ArbitraryFunctionName
  | 'MAP'
  | 'MAP'
  | '<impala>REPLACE'
  | '<impala>REPLACE'
  | 'TRUNCATE'
  | 'TRUNCATE'
+ | '<impala>USER'
  ;
  ;
 
 
 ArbitraryFunctionRightPart
 ArbitraryFunctionRightPart

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

@@ -56,7 +56,7 @@ ShowStatement_EDIT
      if (parser.isHive()) {
      if (parser.isHive()) {
        parser.suggestKeywords(['COLUMNS', 'COMPACTIONS', 'CONF', 'CREATE TABLE', 'CURRENT ROLES', 'DATABASES', 'FORMATTED', 'FUNCTIONS', 'GRANT', 'INDEX', 'INDEXES', 'LOCKS', 'PARTITIONS', 'PRINCIPALS', 'ROLE GRANT', 'ROLES', 'SCHEMAS', 'TABLE EXTENDED', 'TABLES', 'TBLPROPERTIES', 'TRANSACTIONS', 'VIEWS']);
        parser.suggestKeywords(['COLUMNS', 'COMPACTIONS', 'CONF', 'CREATE TABLE', 'CURRENT ROLES', 'DATABASES', 'FORMATTED', 'FUNCTIONS', 'GRANT', 'INDEX', 'INDEXES', 'LOCKS', 'PARTITIONS', 'PRINCIPALS', 'ROLE GRANT', 'ROLES', 'SCHEMAS', 'TABLE EXTENDED', 'TABLES', 'TBLPROPERTIES', 'TRANSACTIONS', 'VIEWS']);
      } else if (parser.isImpala()) {
      } else if (parser.isImpala()) {
-       parser.suggestKeywords(['AGGREGATE FUNCTIONS', 'ANALYTIC FUNCTIONS', 'COLUMN STATS', 'CREATE TABLE', 'CURRENT ROLES', 'DATABASES', 'FILES IN', 'FUNCTIONS', 'GRANT ROLE', 'PARTITIONS', 'RANGE PARTITIONS', 'ROLE GRANT GROUP', 'ROLES', 'SCHEMAS', 'TABLE STATS', 'TABLES']);
+       parser.suggestKeywords(['AGGREGATE FUNCTIONS', 'ANALYTIC FUNCTIONS', 'COLUMN STATS', 'CREATE TABLE', 'CURRENT ROLES', 'CREATE VIEW', 'DATABASES', 'FILES IN', 'FUNCTIONS', 'GRANT ROLE', 'PARTITIONS', 'RANGE PARTITIONS', 'ROLE GRANT GROUP', 'ROLES', 'SCHEMAS', 'TABLE STATS', 'TABLES']);
      } else {
      } else {
        parser.suggestKeywords(['COLUMNS', 'DATABASES', 'TABLES']);
        parser.suggestKeywords(['COLUMNS', 'DATABASES', 'TABLES']);
      }
      }
@@ -70,7 +70,7 @@ ShowStatement_EDIT
      } else {
      } else {
        parser.addTablePrimary($3);
        parser.addTablePrimary($3);
        if (parser.isImpala()) {
        if (parser.isImpala()) {
-         parser.suggestKeywords(['COLUMN STATS', 'CREATE TABLE', 'FILES IN', 'PARTITIONS', 'RANGE PARTITIONS', 'TABLE STATS']);
+         parser.suggestKeywords(['COLUMN STATS', 'CREATE TABLE', 'CREATE VIEW', 'FILES IN', 'PARTITIONS', 'RANGE PARTITIONS', 'TABLE STATS']);
        }
        }
      }
      }
    }
    }

+ 65 - 3
desktop/core/src/desktop/static/desktop/js/autocomplete/spec/sqlSpecAlter.js

@@ -1638,6 +1638,19 @@
           });
           });
         });
         });
 
 
+        it('should handle "ALTER TABLE db.tbl SET OWNER USER boo; |"', function () {
+          assertAutoComplete({
+            beforeCursor: 'ALTER TABLE db.tbl SET OWNER USER boo; ',
+            afterCursor: '',
+            dialect: 'impala',
+            noErrors: true,
+            containsKeywords: ['SELECT'],
+            expectedResult: {
+              lowerCase: false
+            }
+          });
+        });
+
         it('should suggest databases for "ALTER TABLE db.tbl RENAME TO |"', function() {
         it('should suggest databases for "ALTER TABLE db.tbl RENAME TO |"', function() {
           assertAutoComplete({
           assertAutoComplete({
             beforeCursor: 'ALTER TABLE db.tbl RENAME TO  ',
             beforeCursor: 'ALTER TABLE db.tbl RENAME TO  ',
@@ -1708,7 +1721,7 @@
               suggestKeywords: ['ADD COLUMNS', 'ADD PARTITION', 'ADD RANGE PARTITION', 'ALTER', 'ALTER COLUMN',
               suggestKeywords: ['ADD COLUMNS', 'ADD PARTITION', 'ADD RANGE PARTITION', 'ALTER', 'ALTER COLUMN',
                 'CHANGE', 'DROP COLUMN', 'DROP PARTITION', 'DROP RANGE PARTITION', 'PARTITION', 'RECOVER PARTITIONS',
                 'CHANGE', 'DROP COLUMN', 'DROP PARTITION', 'DROP RANGE PARTITION', 'PARTITION', 'RECOVER PARTITIONS',
                 'RENAME TO', 'REPLACE COLUMNS', 'SET CACHED IN', 'SET COLUMN STATS', 'SET FILEFORMAT', 'SET LOCATION',
                 'RENAME TO', 'REPLACE COLUMNS', 'SET CACHED IN', 'SET COLUMN STATS', 'SET FILEFORMAT', 'SET LOCATION',
-                'SET ROW FORMAT', 'SET SERDEPROPERTIES', 'SET TBLPROPERTIES', 'SET UNCACHED' ]
+                'SET OWNER', 'SET ROW FORMAT', 'SET SERDEPROPERTIES', 'SET TBLPROPERTIES', 'SET UNCACHED' ]
             }
             }
           });
           });
         });
         });
@@ -1720,7 +1733,7 @@
             dialect: 'impala',
             dialect: 'impala',
             expectedResult: {
             expectedResult: {
               lowerCase: false,
               lowerCase: false,
-              suggestKeywords: ['CACHED IN', 'COLUMN STATS', 'FILEFORMAT', 'LOCATION', 'ROW FORMAT', 'SERDEPROPERTIES', 'TBLPROPERTIES', 'UNCACHED']
+              suggestKeywords: ['CACHED IN', 'COLUMN STATS', 'FILEFORMAT', 'LOCATION', 'OWNER ROLE', 'OWNER USER', 'ROW FORMAT', 'SERDEPROPERTIES', 'TBLPROPERTIES', 'UNCACHED']
             }
             }
           });
           });
         });
         });
@@ -2247,6 +2260,18 @@
           });
           });
         });
         });
 
 
+        it('should suggest keywords for "ALTER TABLE bar SET OWNER |"', function() {
+          assertAutoComplete({
+            beforeCursor: 'ALTER TABLE bar SET OWNER ',
+            afterCursor: '',
+            dialect: 'impala',
+            expectedResult: {
+              lowerCase: false,
+              suggestKeywords: ['ROLE', 'USER']
+            }
+          });
+        });
+
         it('should suggest keywords for "ALTER TABLE bar SET ROW |"', function() {
         it('should suggest keywords for "ALTER TABLE bar SET ROW |"', function() {
          assertAutoComplete({
          assertAutoComplete({
            beforeCursor: 'ALTER TABLE bar SET ROW ',
            beforeCursor: 'ALTER TABLE bar SET ROW ',
@@ -2481,6 +2506,19 @@
           });
           });
         });
         });
 
 
+        it('should handle "ALTER VIEW db.foo SET OWNER ROLE boo; |"', function () {
+          assertAutoComplete({
+            beforeCursor: 'ALTER VIEW db.tbl SET OWNER ROLE boo; ',
+            afterCursor: '',
+            dialect: 'impala',
+            noErrors: true,
+            containsKeywords: ['SELECT'],
+            expectedResult: {
+              lowerCase: false
+            }
+          });
+        });
+
         it('should suggest keywords for "ALTER VIEW boo |"', function() {
         it('should suggest keywords for "ALTER VIEW boo |"', function() {
           assertAutoComplete({
           assertAutoComplete({
             beforeCursor: 'ALTER VIEW boo ',
             beforeCursor: 'ALTER VIEW boo ',
@@ -2488,7 +2526,7 @@
             dialect: 'impala',
             dialect: 'impala',
             expectedResult: {
             expectedResult: {
               lowerCase: false,
               lowerCase: false,
-              suggestKeywords: ['AS', 'RENAME TO']
+              suggestKeywords: ['AS', 'RENAME TO', 'SET OWNER']
             }
             }
           });
           });
         });
         });
@@ -2516,6 +2554,30 @@
             }
             }
           });
           });
         });
         });
+
+        it('should suggest keywords for "ALTER VIEW boo SET |"', function() {
+          assertAutoComplete({
+            beforeCursor: 'ALTER VIEW boo SET ',
+            afterCursor: '',
+            dialect: 'impala',
+            expectedResult: {
+              lowerCase: false,
+              suggestKeywords: ['OWNER ROLE', 'OWNER USER']
+            }
+          });
+        });
+
+        it('should suggest keywords for "ALTER VIEW db.boo SET OWNER|"', function() {
+          assertAutoComplete({
+            beforeCursor: 'ALTER VIEW db.boo SET OWNER ',
+            afterCursor: '',
+            dialect: 'impala',
+            expectedResult: {
+              lowerCase: false,
+              suggestKeywords: ['ROLE', 'USER']
+            }
+          });
+        });
       });
       });
     });
     });
 
 

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

@@ -1185,7 +1185,7 @@
           dialect: 'impala',
           dialect: 'impala',
           expectedResult: {
           expectedResult: {
             lowerCase: false,
             lowerCase: false,
-            suggestKeywords: ['AGGREGATE FUNCTIONS', 'ANALYTIC FUNCTIONS', 'COLUMN STATS', 'CREATE TABLE', 'CURRENT ROLES', 'DATABASES', 'FILES IN', 'FUNCTIONS', 'GRANT ROLE', 'PARTITIONS', 'RANGE PARTITIONS', 'ROLE GRANT GROUP', 'ROLES', 'SCHEMAS', 'TABLE STATS', 'TABLES']
+            suggestKeywords: ['AGGREGATE FUNCTIONS', 'ANALYTIC FUNCTIONS', 'COLUMN STATS', 'CREATE TABLE', 'CREATE VIEW', 'CURRENT ROLES', 'DATABASES', 'FILES IN', 'FUNCTIONS', 'GRANT ROLE', 'PARTITIONS', 'RANGE PARTITIONS', 'ROLE GRANT GROUP', 'ROLES', 'SCHEMAS', 'TABLE STATS', 'TABLES']
           }
           }
         });
         });
       });
       });

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


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


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

@@ -68,8 +68,8 @@ var SqlUtils = (function () {
     SYSTEM_TIME: true, SYSTEM_USER: true, TABLE: true, TABLES: true, TABLESAMPLE: true, TBLPROPERTIES: true, TERMINATED: true, TEXTFILE: true, THEN: true, TIMESTAMP: true,
     SYSTEM_TIME: true, SYSTEM_USER: true, TABLE: true, TABLES: true, TABLESAMPLE: true, TBLPROPERTIES: true, TERMINATED: true, TEXTFILE: true, THEN: true, TIMESTAMP: true,
     TIMEZONE_HOUR: true, TIMEZONE_MINUTE: true, TINYINT: true, TO: true, TRAILING: true, TRANSLATE_REGEX: true, TRANSLATION: true, TREAT: true, TRIGGER: true, TRIM_ARRAY: true,
     TIMEZONE_HOUR: true, TIMEZONE_MINUTE: true, TINYINT: true, TO: true, TRAILING: true, TRANSLATE_REGEX: true, TRANSLATION: true, TREAT: true, TRIGGER: true, TRIM_ARRAY: true,
     TRUE: true, TRUNCATE: true, UESCAPE: true, UNBOUNDED: true, UNCACHED: true, UNION: true, UNIQUE: true, UNKNOWN: true, UNNEST: true, UPDATE: true, UPDATE_FN: true, UPSERT: true,
     TRUE: true, TRUNCATE: true, UESCAPE: true, UNBOUNDED: true, UNCACHED: true, UNION: true, UNIQUE: true, UNKNOWN: true, UNNEST: true, UPDATE: true, UPDATE_FN: true, UPSERT: true,
-    USE: true, USING: true, VALUE_OF: true, VALUES: true, VARBINARY: true, VARCHAR: true, VARYING: true, VERSIONING: true, VIEW: true, WHEN: true, WHENEVER: true, WHERE: true,
-    WIDTH_BUCKET: true, WINDOW: true, WITH: true, WITHIN: true, WITHOUT: true
+    USE: true, USER: true, USING: true, VALUE_OF: true, VALUES: true, VARBINARY: true, VARCHAR: true, VARYING: true, VERSIONING: true, VIEW: true, WHEN: true, WHENEVER: true,
+    WHERE: true, WIDTH_BUCKET: true, WINDOW: true, WITH: true, WITHIN: true, WITHOUT: true
   };
   };
 
 
   var autocompleteFilter = function (filter, entries) {
   var autocompleteFilter = function (filter, entries) {

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