浏览代码

HUE-4697 [editor] The autocompleter should suggest select list aliases

Currently it won't add the correct column type to the alias as the parser is only aware of one column reference at a time, it can be extended later if needed.

This also takes care of some odd suggestions for limit and offset and improves lateral view completion
Johan Ahlen 9 年之前
父节点
当前提交
29eca42

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

@@ -110,7 +110,6 @@
 <hive>'ITEMS'                              { return '<hive>ITEMS'; }
 <hive>'JAR'                                { return '<hive>JAR'; }
 <hive>'KEYS'                               { return '<hive>KEYS'; }
-<hive>'LIMIT'                              { return '<hive>LIMIT'; }
 <hive>'LINES'                              { return '<hive>LINES'; }
 <hive>'LOAD'                               { determineCase(yytext); return '<hive>LOAD'; }
 <hive>'LOCATION'                           { this.begin('hdfs'); return '<hive>LOCATION'; }
@@ -205,6 +204,7 @@
 <impala>'INPATH'                           { this.begin('hdfs'); return '<impala>INPATH'; }
 <impala>'LAST'                             { return '<impala>LAST'; }
 <impala>LIKE\s+PARQUET                     { this.begin('hdfs'); return '<impala>LIKE_PARQUET'; }
+<impala>'LIMIT'                            { return '<impala>LIMIT'; }
 <impala>'LINES'                            { return '<impala>LINES'; }
 <impala>'LOAD'                             { determineCase(yytext); return '<impala>LOAD'; }
 <impala>'LOCATION'                         { this.begin('hdfs'); return '<impala>LOCATION'; }

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

@@ -129,7 +129,6 @@ NonReservedKeyword
 // | '<hive>FUNCTION'
 // | '<hive>INDEX'
 // | '<hive>INDEXES'
-// | '<hive>LIMIT'
 // | '<hive>SCHEMA'
 // | '<hive>SORT'
  ;
@@ -242,8 +241,8 @@ OptionalHiveExplainTypes
 // 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>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>LIMIT' | '<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>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>]'
+ : '<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>]'
  | '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'
@@ -1551,9 +1550,13 @@ GroupByClause
 
 GroupByClause_EDIT
  : AnyGroup 'BY' GroupByColumnList_EDIT OptionalHiveGroupingSetsCubeOrRollup
+   {
+     suggestSelectListAliases();
+   }
  | AnyGroup 'BY' 'CURSOR' OptionalHiveGroupingSetsCubeOrRollup
    {
      valueExpressionSuggest();
+     suggestSelectListAliases();
    }
  | AnyGroup 'CURSOR'
    {
@@ -1675,6 +1678,7 @@ OrderByColumnList_EDIT
    {
      valueExpressionSuggest();
      suggestAnalyticFunctions();
+     suggestSelectListAliases();
    }
  | OrderByColumnList ',' OrderByIdentifier_EDIT
  | OrderByColumnList ',' OrderByIdentifier_EDIT ','
@@ -1687,11 +1691,15 @@ OrderByIdentifier
 
 OrderByIdentifier_EDIT
  : ValueExpression_EDIT OptionalAscOrDesc OptionalImpalaNullsFirstOrLast
+   {
+     suggestSelectListAliases();
+   }
  | ValueExpression OptionalAscOrDesc OptionalImpalaNullsFirstOrLast_EDIT
  | AnyCursor OptionalAscOrDesc OptionalImpalaNullsFirstOrLast
    {
      valueExpressionSuggest();
      suggestAnalyticFunctions();
+     suggestSelectListAliases();
    }
  ;
 
@@ -1758,8 +1766,12 @@ ClusterByClause_EDIT
  | '<hive>CLUSTER' 'BY' 'CURSOR'
    {
      suggestColumns();
+     suggestSelectListAliases();
    }
  | '<hive>CLUSTER' 'BY' ColumnList_EDIT
+   {
+     suggestSelectListAliases();
+   }
  ;
 
 DistributeByClause
@@ -1774,8 +1786,12 @@ DistributeByClause_EDIT
  | '<hive>DISTRIBUTE' 'BY' 'CURSOR'
    {
      suggestColumns();
+     suggestSelectListAliases();
    }
  | '<hive>DISTRIBUTE' 'BY' ColumnList_EDIT
+   {
+     suggestSelectListAliases();
+   }
  ;
 
 SortByClause
@@ -1788,6 +1804,9 @@ SortByClause_EDIT
      suggestKeywords: ['BY'];
    }
  | '<hive>SORT' 'BY' SortByList_EDIT
+   {
+     suggestSelectListAliases();
+   }
  ;
 
 SortByList
@@ -1814,27 +1833,26 @@ SortByIdentifier_EDIT
    }
  ;
 
-AnyLimit
- : 'LIMIT'
- | '<hive>LIMIT'
- ;
-
 OptionalLimitClause
  :
  | LimitClause
  ;
 
 LimitClause
- : AnyLimit ValueExpression
+ : 'LIMIT' UnsignedNumericLiteral
+ | '<impala>LIMIT' ValueExpression
  ;
 
 LimitClause_EDIT
- : AnyLimit 'CURSOR'
+ : 'LIMIT' 'CURSOR'
+ | '<impala>LIMIT' 'CURSOR'
    {
-     valueExpressionSuggest();
-     applyTypeToSuggestions(['INT']);
+     suggestFunctions({ types: ['BIGINT'] });
+   }
+ | '<impala>LIMIT' ValueExpression_EDIT
+   {
+     delete parser.yy.result.suggestColumns;
    }
- | AnyLimit ValueExpression_EDIT
  ;
 
 OptionalOffsetClause
@@ -1849,10 +1867,12 @@ OffsetClause
 OffsetClause_EDIT
  : '<impala>OFFSET' 'CURSOR'
    {
-     valueExpressionSuggest();
-     applyTypeToSuggestions(['INT']);
+     suggestFunctions({ types: ['BIGINT'] });
    }
  | '<impala>OFFSET' ValueExpression_EDIT
+   {
+     delete parser.yy.result.suggestColumns;
+   }
  ;
 
 SearchCondition
@@ -2045,6 +2065,10 @@ SelectSubList
    {
      if ($2) {
        $$ = { valueExpression: $1, alias: $2 };
+       if (!parser.yy.selectListAliases) {
+         parser.yy.selectListAliases = [];
+       }
+       parser.yy.selectListAliases.push({ name: $2, types: $1.types || ['T'] });
      } else {
        $$ = { valueExpression: $1 }
      }
@@ -2449,37 +2473,7 @@ OptionalOnColumn_EDIT
 PushQueryState
  :
    {
-     if (typeof parser.yy.locationsStack === 'undefined') {
-       parser.yy.locationsStack = [];
-     }
-     if (typeof parser.yy.primariesStack === 'undefined') {
-       parser.yy.primariesStack = [];
-     }
-     if (typeof parser.yy.lateralViewsStack === 'undefined') {
-       parser.yy.lateralViewsStack = [];
-     }
-     if (typeof parser.yy.subQueriesStack === 'undefined') {
-       parser.yy.subQueriesStack = [];
-     }
-
-     if (typeof parser.yy.resultStack === 'undefined') {
-       parser.yy.resultStack = [];
-     }
-     parser.yy.primariesStack.push(parser.yy.latestTablePrimaries);
-     parser.yy.lateralViewsStack.push(parser.yy.lateralViews);
-     parser.yy.resultStack.push(parser.yy.result);
-     parser.yy.locationsStack.push(parser.yy.locations);
-     parser.yy.subQueriesStack.push(parser.yy.subQueries);
-
-     parser.yy.result = {};
-     parser.yy.locations = [];
-     if (parser.yy.correlatedSubQuery) {
-       parser.yy.latestTablePrimaries = parser.yy.latestTablePrimaries.concat();
-       parser.yy.subQueries = parser.yy.subQueries.concat();
-     } else {
-       parser.yy.latestTablePrimaries = [];
-       parser.yy.subQueries = [];
-     }
+     pushQueryState();
    }
  ;
 
@@ -2913,10 +2907,12 @@ HavingClause_EDIT
    {
      valueExpressionSuggest();
      suggestAggregateFunctions();
+     suggestSelectListAliases(true);
    }
  | 'HAVING' ValueExpression_EDIT
    {
      suggestAggregateFunctions();
+     suggestSelectListAliases(true);
    }
  ;
 
@@ -3228,6 +3224,9 @@ LateralView_EDIT
  : '<hive>LATERAL' '<hive>VIEW' OptionalOuter UserDefinedFunction_EDIT
  | '<hive>LATERAL' '<hive>VIEW' OptionalOuter UserDefinedFunction_EDIT RegularOrBacktickedIdentifier
  | '<hive>LATERAL' '<hive>VIEW' OptionalOuter UserDefinedFunction_EDIT RegularOrBacktickedIdentifier LateralViewColumnAliases
+ | '<hive>LATERAL' '<hive>VIEW' OptionalOuter UserDefinedFunction RegularOrBacktickedIdentifier LateralViewColumnAliases_EDIT
+ | '<hive>LATERAL' '<hive>VIEW' OptionalOuter UserDefinedFunction PartialBacktickedOrCursor
+ | '<hive>LATERAL' '<hive>VIEW' OptionalOuter UserDefinedFunction PartialBacktickedOrCursor LateralViewColumnAliases
  | '<hive>LATERAL' '<hive>VIEW' OptionalOuter 'CURSOR'
    {
      if (!$3) {
@@ -3250,4 +3249,9 @@ OptionalOuter
 LateralViewColumnAliases
  : '<hive>AS' RegularOrBacktickedIdentifier                                    -> [ $2 ]
  | '<hive>AS' RegularOrBacktickedIdentifier ',' RegularOrBacktickedIdentifier  -> [ $2, $4 ]
+ ;
+
+LateralViewColumnAliases_EDIT
+ : '<hive>AS' PartialBacktickedOrCursor
+ | '<hive>AS' RegularOrBacktickedIdentifier ',' PartialBacktickedOrAnyCursor
  ;

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


+ 39 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/sql_support.js

@@ -23,6 +23,7 @@ var prepareNewStatement = function () {
   delete parser.yy.latestCommonTableExpressions;
   delete parser.yy.correlatedSubQuery;
   parser.yy.subQueries = [];
+  parser.yy.selectListAliases = [];
 
   parser.parseError = function (message, error) {
     parser.yy.errors.push(error);
@@ -34,6 +35,28 @@ var addCommonTableExpressions = function (identifiers) {
   parser.yy.latestCommonTableExpressions = identifiers;
 };
 
+var pushQueryState = function () {
+  parser.yy.resultStack.push(parser.yy.result);
+  parser.yy.locationsStack.push(parser.yy.locations);
+  parser.yy.lateralViewsStack.push(parser.yy.lateralViews);
+  parser.yy.selectListAliasesStack.push(parser.yy.selectListAliases);
+  parser.yy.primariesStack.push(parser.yy.latestTablePrimaries);
+  parser.yy.subQueriesStack.push(parser.yy.subQueries);
+
+  parser.yy.result = {};
+  parser.yy.locations = [];
+  parser.yy.selectListAliases = []; // Not allowed in correlated sub-queries
+  parser.yy.lateralViews = []; // Not allowed in correlated sub-queries
+
+  if (parser.yy.correlatedSubQuery) {
+    parser.yy.latestTablePrimaries = parser.yy.latestTablePrimaries.concat();
+    parser.yy.subQueries = parser.yy.subQueries.concat();
+  } else {
+    parser.yy.latestTablePrimaries = [];
+    parser.yy.subQueries = [];
+  }
+};
+
 var popQueryState = function (subQuery) {
   linkTablePrimaries();
   commitLocations();
@@ -55,6 +78,14 @@ var popQueryState = function (subQuery) {
   parser.yy.lateralViews = parser.yy.lateralViewsStack.pop();
   parser.yy.latestTablePrimaries = parser.yy.primariesStack.pop();
   parser.yy.locations = parser.yy.locationsStack.pop();
+  parser.yy.selectListAliases = parser.yy.selectListAliasesStack.pop();
+};
+
+var suggestSelectListAliases = function () {
+  if (parser.yy.selectListAliases && parser.yy.selectListAliases.length > 0 && parser.yy.result.suggestColumns
+      && (typeof parser.yy.result.suggestColumns.identifierChain === 'undefined' || parser.yy.result.suggestColumns.identifierChain.length === 0)) {
+    parser.yy.result.suggestColumnAliases = parser.yy.selectListAliases;
+  }
 };
 
 var isHive = function () {
@@ -931,6 +962,14 @@ parser.parseSql = function (beforeCursor, afterCursor, dialect, sqlFunctions, de
   parser.yy.allLocations = [];
   parser.yy.subQueries = [];
   parser.yy.errors = [];
+  parser.yy.selectListAliases = [];
+
+  parser.yy.locationsStack = [];
+  parser.yy.primariesStack = [];
+  parser.yy.lateralViewsStack = [];
+  parser.yy.subQueriesStack = [];
+  parser.yy.resultStack = [];
+  parser.yy.selectListAliasesStack = [];
 
   delete parser.yy.caseDetermined;
   delete parser.yy.cursorFound;

+ 1 - 0
desktop/core/src/desktop/static/desktop/js/ko.hue-bindings.js

@@ -2866,6 +2866,7 @@
             if (token) {
               var self = this;
               if (token.value === " * ") {
+                // TODO: Figure out why called 7 times every once in a while
                 snippet.autocompleter.autocomplete(editor.getValue().substring(0, token.start + 1), editor.getValue().substring(token.start + 2), function (suggestions) {
                   var cols = [];
                   $.each(suggestions, function (idx, suggestion) {

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

@@ -123,7 +123,7 @@
       var suggestFunctionsDeferral = $.Deferred();
       if (parseResult.suggestFunctions.types && parseResult.suggestFunctions.types[0] === 'COLREF') {
         $.when.apply($, colRefDeferral).done(function () {
-          if (colRef !== null) {
+          if (colRef !== null && colRef.type) {
             sqlFunctions.suggestFunctions(self.snippet.type(), [colRef.type.toUpperCase()], parseResult.suggestAggregateFunctions || false, parseResult.suggestAnalyticFunctions || false, completions);
           } else {
             sqlFunctions.suggestFunctions(self.snippet.type(), ['T'], parseResult.suggestAggregateFunctions || false, parseResult.suggestAnalyticFunctions || false, completions);
@@ -137,6 +137,17 @@
       deferrals.push(suggestFunctionsDeferral);
     }
 
+    if (parseResult.suggestColumnAliases) {
+      parseResult.suggestColumnAliases.forEach(function (columnAlias) {
+        var type = columnAlias.types && columnAlias.types.length == 1 ? columnAlias.types[0] : 'T';
+        if (type === 'COLREF') {
+          completions.push({ value: columnAlias.name, meta: 'alias', weight: DEFAULT_WEIGHTS.COLUMN });
+        } else {
+          completions.push({ value: columnAlias.name, meta: type, weight: DEFAULT_WEIGHTS.COLUMN });
+        }
+      });
+    }
+
     if (parseResult.suggestValues) {
       var suggestValuesDeferral = $.Deferred();
       $.when.apply($, colRefDeferral).done(function () {

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

@@ -5488,7 +5488,8 @@ define([
               lowerCase: false,
               suggestFunctions: {},
               suggestAggregateFunctions: true,
-              suggestColumns: { tables: [{ table: 'testTable' }] }
+              suggestColumns: { tables: [{ table: 'testTable' }] },
+              suggestColumnAliases: [{ name: 'boo', types: ['BIGINT'] }]
             }
           });
         });
@@ -5506,7 +5507,54 @@ define([
               lowerCase: false,
               suggestFunctions: {},
               suggestAggregateFunctions: true,
-              suggestColumns: { tables: [{ table: 'testTable' }] }
+              suggestColumns: { tables: [{ table: 'testTable' }] },
+              suggestColumnAliases: [{ name: 'boo', types: ['BIGINT'] }]
+            }
+          });
+        });
+      });
+    });
+
+    describe('LIMIT clause', function () {
+      it('should not suggest anything for "SELECT COUNT(*) AS boo FROM testTable GROUP BY baa LIMIT |"', function() {
+        assertAutoComplete({
+          beforeCursor: 'SELECT COUNT(*) AS boo FROM testTable GROUP BY baa LIMIT ',
+          afterCursor: '',
+          dialect: 'generic',
+          hasLocations: true,
+          noErrors: true,
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      describe('Hive specific', function () {
+        it('should not suggest anything for "SELECT COUNT(*) AS boo FROM testTable GROUP BY baa LIMIT |"', function() {
+          assertAutoComplete({
+            beforeCursor: 'SELECT COUNT(*) AS boo FROM testTable GROUP BY baa LIMIT ',
+            afterCursor: '',
+            dialect: 'hive',
+            hasLocations: true,
+            noErrors: true,
+            expectedResult: {
+              lowerCase: false
+            }
+          });
+        });
+      });
+
+      describe('Impala specific', function () {
+        it('should not suggest columns for "SELECT COUNT(*) AS boo FROM testTable GROUP BY baa LIMIT |"', function() {
+          assertAutoComplete({
+            beforeCursor: 'SELECT COUNT(*) AS boo FROM testTable GROUP BY baa LIMIT ',
+            afterCursor: '',
+            dialect: 'impala',
+            hasLocations: true,
+            noErrors: true,
+            expectedResult: {
+              lowerCase: false,
+              suggestFunctions: { types: ['BIGINT'] }
             }
           });
         });
@@ -5515,9 +5563,9 @@ define([
 
     describe('OFFSET clause', function () {
       describe('Impala specific', function () {
-        it('should handle "SELECT COUNT(*) AS boo FROM testTable GROUP BY baa OFFSET 1;|"', function() {
+        it('should handle "SELECT COUNT(*) AS boo FROM testTable ORDER BY baa OFFSET 1;|"', function() {
           assertAutoComplete({
-            beforeCursor: 'SELECT COUNT(*) AS boo FROM testTable GROUP BY baa OFFSET 1; ',
+            beforeCursor: 'SELECT COUNT(*) AS boo FROM testTable ORDER BY baa OFFSET 1; ',
             afterCursor: '',
             dialect: 'impala',
             hasLocations: true,
@@ -5529,9 +5577,23 @@ define([
           });
         });
 
-        it('should suggest keywords for "SELECT COUNT(*) AS boo FROM testTable GROUP BY baa LIMIT 10 |"', function() {
+        it('should not suggest columns for "SELECT COUNT(*) AS boo FROM testTable ORDER BY baa OFFSET |"', function() {
+          assertAutoComplete({
+            beforeCursor: 'SELECT COUNT(*) AS boo FROM testTable ORDER BY baa OFFSET ',
+            afterCursor: '',
+            dialect: 'impala',
+            hasLocations: true,
+            noErrors: true,
+            expectedResult: {
+              lowerCase: false,
+              suggestFunctions: { types: ['BIGINT'] }
+            }
+          });
+        });
+
+        it('should suggest keywords for "SELECT COUNT(*) AS boo FROM testTable ORDER BY baa LIMIT 10 |"', function() {
           assertAutoComplete({
-            beforeCursor: 'SELECT COUNT(*) AS boo FROM testTable GROUP BY baa LIMIT 10 ',
+            beforeCursor: 'SELECT COUNT(*) AS boo FROM testTable ORDER BY baa LIMIT 10 ',
             afterCursor: '',
             dialect: 'impala',
             hasLocations: true,

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