9192 lines
811 KiB
JavaScript
9192 lines
811 KiB
JavaScript
|
// Licensed to Cloudera, Inc. under one
|
||
|
// or more contributor license agreements. See the NOTICE file
|
||
|
// distributed with this work for additional information
|
||
|
// regarding copyright ownership. Cloudera, Inc. licenses this file
|
||
|
// to you under the Apache License, Version 2.0 (the
|
||
|
// "License"); you may not use this file except in compliance
|
||
|
// with the License. You may obtain a copy of the License at
|
||
|
//
|
||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||
|
//
|
||
|
// Unless required by applicable law or agreed to in writing, software
|
||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
// See the License for the specific language governing permissions and
|
||
|
// limitations under the License.
|
||
|
|
||
|
var SqlParseSupport = (function () {
|
||
|
|
||
|
// endsWith polyfill from hue_utils.js, needed as workers live in their own js environment
|
||
|
if (!String.prototype.endsWith) {
|
||
|
String.prototype.endsWith = function (searchString, position) {
|
||
|
var subjectString = this.toString();
|
||
|
if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {
|
||
|
position = subjectString.length;
|
||
|
}
|
||
|
position -= searchString.length;
|
||
|
var lastIndex = subjectString.lastIndexOf(searchString, position);
|
||
|
return lastIndex !== -1 && lastIndex === position;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Calculates the Optimal String Alignment distance between two strings. Returns 0 when the strings are equal and the
|
||
|
* distance when not, distances is less than or equal to the length of the longest string.
|
||
|
*
|
||
|
* @param strA
|
||
|
* @param strB
|
||
|
* @param [ignoreCase]
|
||
|
* @returns {number} The similarity
|
||
|
*/
|
||
|
var stringDistance = function (strA, strB, ignoreCase) {
|
||
|
if (ignoreCase) {
|
||
|
strA = strA.toLowerCase();
|
||
|
strB = strB.toLowerCase();
|
||
|
}
|
||
|
|
||
|
// TODO: Consider other algorithms for performance
|
||
|
var strALength = strA.length;
|
||
|
var strBLength = strB.length;
|
||
|
if (strALength === 0) {
|
||
|
return strBLength;
|
||
|
}
|
||
|
if (strBLength === 0) {
|
||
|
return strALength;
|
||
|
}
|
||
|
|
||
|
var distances = new Array(strALength);
|
||
|
|
||
|
var cost, deletion, insertion, substitution, transposition;
|
||
|
for (var i = 0; i <= strALength; i++) {
|
||
|
distances[i] = new Array(strBLength);
|
||
|
distances[i][0] = i;
|
||
|
for (var j = 1; j <= strBLength; j++) {
|
||
|
if (!i){
|
||
|
distances[0][j] = j;
|
||
|
} else {
|
||
|
cost = strA[i-1] === strB[j-1] ? 0 : 1;
|
||
|
deletion = distances[i - 1][j] + 1;
|
||
|
insertion = distances[i][j - 1] + 1;
|
||
|
substitution = distances[i - 1][j - 1] + cost;
|
||
|
if (deletion <= insertion && deletion <= substitution) {
|
||
|
distances[i][j] = deletion;
|
||
|
} else if (insertion <= deletion && insertion <= substitution) {
|
||
|
distances[i][j] = insertion;
|
||
|
} else {
|
||
|
distances[i][j] = substitution;
|
||
|
}
|
||
|
|
||
|
if (i > 1 && j > 1 && strA[i] === strB[j - 1] && strA[i - 1] === strB[j]) {
|
||
|
transposition = distances[i - 2][j - 2] + cost;
|
||
|
if (transposition < distances[i][j]) {
|
||
|
distances[i][j] = transposition;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return distances[strALength][strBLength];
|
||
|
};
|
||
|
|
||
|
var equalIgnoreCase = function (a, b) {
|
||
|
return a && b && a.toLowerCase() === b.toLowerCase();
|
||
|
};
|
||
|
|
||
|
var initSqlParser = function (parser) {
|
||
|
|
||
|
var SIMPLE_TABLE_REF_SUGGESTIONS = ['suggestJoinConditions', 'suggestAggregateFunctions', 'suggestFilters', 'suggestGroupBys', 'suggestOrderBys'];
|
||
|
|
||
|
parser.prepareNewStatement = function () {
|
||
|
linkTablePrimaries();
|
||
|
parser.commitLocations();
|
||
|
|
||
|
delete parser.yy.lateralViews;
|
||
|
delete parser.yy.latestCommonTableExpressions;
|
||
|
delete parser.yy.correlatedSubQuery;
|
||
|
parser.yy.subQueries = [];
|
||
|
parser.yy.selectListAliases = [];
|
||
|
parser.yy.latestTablePrimaries = [];
|
||
|
|
||
|
prioritizeSuggestions();
|
||
|
};
|
||
|
|
||
|
parser.yy.parseError = function (message, error) {
|
||
|
parser.yy.errors.push(error);
|
||
|
return message;
|
||
|
};
|
||
|
|
||
|
parser.addCommonTableExpressions = function (identifiers) {
|
||
|
parser.yy.result.commonTableExpressions = identifiers;
|
||
|
parser.yy.latestCommonTableExpressions = identifiers;
|
||
|
};
|
||
|
|
||
|
parser.isInSubquery = function () {
|
||
|
return !!parser.yy.primariesStack.length
|
||
|
};
|
||
|
|
||
|
parser.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 = [];
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.popQueryState = function (subQuery) {
|
||
|
linkTablePrimaries();
|
||
|
parser.commitLocations();
|
||
|
|
||
|
if (Object.keys(parser.yy.result).length === 0) {
|
||
|
parser.yy.result = parser.yy.resultStack.pop();
|
||
|
} else {
|
||
|
parser.yy.resultStack.pop();
|
||
|
}
|
||
|
var oldSubQueries = parser.yy.subQueries;
|
||
|
parser.yy.subQueries = parser.yy.subQueriesStack.pop();
|
||
|
if (subQuery) {
|
||
|
if (oldSubQueries.length > 0) {
|
||
|
subQuery.subQueries = oldSubQueries;
|
||
|
}
|
||
|
parser.yy.subQueries.push(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();
|
||
|
};
|
||
|
|
||
|
parser.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;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.isHive = function () {
|
||
|
return parser.yy.activeDialect === 'hive';
|
||
|
};
|
||
|
|
||
|
parser.isImpala = function () {
|
||
|
return parser.yy.activeDialect === 'impala';
|
||
|
};
|
||
|
|
||
|
parser.mergeSuggestKeywords = function () {
|
||
|
var result = [];
|
||
|
Array.prototype.slice.call(arguments).forEach(function (suggestion) {
|
||
|
if (typeof suggestion !== 'undefined' && typeof suggestion.suggestKeywords !== 'undefined') {
|
||
|
result = result.concat(suggestion.suggestKeywords);
|
||
|
}
|
||
|
});
|
||
|
if (result.length > 0) {
|
||
|
return {suggestKeywords: result};
|
||
|
}
|
||
|
return {};
|
||
|
};
|
||
|
|
||
|
parser.suggestValueExpressionKeywords = function (valueExpression, extras) {
|
||
|
var expressionKeywords = parser.getValueExpressionKeywords(valueExpression, extras);
|
||
|
parser.suggestKeywords(expressionKeywords.suggestKeywords);
|
||
|
if (expressionKeywords.suggestColRefKeywords) {
|
||
|
parser.suggestColRefKeywords(expressionKeywords.suggestColRefKeywords);
|
||
|
}
|
||
|
if (valueExpression.lastType) {
|
||
|
parser.addColRefIfExists(valueExpression.lastType);
|
||
|
} else {
|
||
|
parser.addColRefIfExists(valueExpression);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.getSelectListKeywords = function (excludeAsterisk) {
|
||
|
var keywords = [{ value: 'CASE', weight: 450 }, 'FALSE', 'TRUE', 'NULL'];
|
||
|
if (!excludeAsterisk) {
|
||
|
keywords.push({ value: '*', weight: 10000 });
|
||
|
}
|
||
|
if (parser.isHive()) {
|
||
|
keywords = keywords.concat(['EXISTS', 'NOT']);
|
||
|
}
|
||
|
return keywords;
|
||
|
};
|
||
|
|
||
|
parser.getValueExpressionKeywords = function (valueExpression, extras) {
|
||
|
var types = valueExpression.lastType ? valueExpression.lastType.types : valueExpression.types;
|
||
|
// We could have valueExpression.columnReference to suggest based on column type
|
||
|
var keywords = ['<', '<=', '<=>', '<>', '=', '>', '>=', 'BETWEEN', 'IN', 'IS NOT NULL', 'IS NULL', 'IS NOT TRUE', 'IS TRUE', 'IS NOT FALSE', 'IS FALSE', 'NOT BETWEEN', 'NOT IN'];
|
||
|
if (parser.isImpala()) {
|
||
|
keywords = keywords.concat(['IS DISTINCT FROM', 'IS NOT DISTINCT FROM', 'IS NOT UNKNOWN', 'IS UNKNOWN']);
|
||
|
}
|
||
|
if (extras) {
|
||
|
keywords = keywords.concat(extras);
|
||
|
}
|
||
|
if (valueExpression.suggestKeywords) {
|
||
|
keywords = keywords.concat(valueExpression.suggestKeywords);
|
||
|
}
|
||
|
if (types.length === 1 && types[0] === 'COLREF') {
|
||
|
return {
|
||
|
suggestKeywords: keywords,
|
||
|
suggestColRefKeywords: {
|
||
|
BOOLEAN: ['AND', 'OR'],
|
||
|
NUMBER: ['+', '-', '*', '/', '%', 'DIV'],
|
||
|
STRING: parser.isImpala() ? ['ILIKE', 'IREGEXP', 'LIKE', 'NOT LIKE', 'REGEXP', 'RLIKE'] : ['LIKE', 'NOT LIKE', 'REGEXP', 'RLIKE']
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (typeof SqlFunctions === 'undefined' || SqlFunctions.matchesType(parser.yy.activeDialect, ['BOOLEAN'], types)) {
|
||
|
keywords = keywords.concat(['AND', 'OR']);
|
||
|
}
|
||
|
if (typeof SqlFunctions === 'undefined' || SqlFunctions.matchesType(parser.yy.activeDialect, ['NUMBER'], types)) {
|
||
|
keywords = keywords.concat(['+', '-', '*', '/', '%', 'DIV']);
|
||
|
}
|
||
|
if (typeof SqlFunctions === 'undefined' || SqlFunctions.matchesType(parser.yy.activeDialect, ['STRING'], types)) {
|
||
|
keywords = keywords.concat(parser.isImpala() ? ['ILIKE', 'IREGEXP', 'LIKE', 'NOT LIKE', 'REGEXP', 'RLIKE'] : ['LIKE', 'NOT LIKE', 'REGEXP', 'RLIKE']);
|
||
|
}
|
||
|
return { suggestKeywords: keywords };
|
||
|
};
|
||
|
|
||
|
parser.getTypeKeywords = function () {
|
||
|
if (parser.isHive()) {
|
||
|
return ['BIGINT', 'BINARY', 'BOOLEAN', 'CHAR', 'DATE', 'DECIMAL', 'DOUBLE', 'DOUBLE PRECISION', 'FLOAT', 'INT', 'SMALLINT', 'TIMESTAMP', 'STRING', 'TINYINT', 'VARCHAR'];
|
||
|
}
|
||
|
if (parser.isImpala()) {
|
||
|
return ['BIGINT', 'BOOLEAN', 'CHAR', 'DECIMAL', 'DOUBLE', 'FLOAT', 'INT', 'REAL', 'SMALLINT', 'TIMESTAMP', 'STRING', 'TINYINT', 'VARCHAR'];
|
||
|
}
|
||
|
return ['BIGINT', 'BOOLEAN', 'CHAR', 'DECIMAL', 'DOUBLE', 'FLOAT', 'INT', 'SMALLINT', 'TIMESTAMP', 'STRING', 'TINYINT', 'VARCHAR'];
|
||
|
};
|
||
|
|
||
|
parser.getColumnDataTypeKeywords = function () {
|
||
|
if (parser.isHive()) {
|
||
|
return parser.getTypeKeywords().concat(['ARRAY<>', 'MAP<>', 'STRUCT<>', 'UNIONTYPE<>']);
|
||
|
}
|
||
|
if (parser.isImpala()) {
|
||
|
return parser.getTypeKeywords().concat(['ARRAY<>', 'MAP<>', 'STRUCT<>']);
|
||
|
}
|
||
|
return parser.getTypeKeywords();
|
||
|
};
|
||
|
|
||
|
parser.addColRefIfExists = function (valueExpression) {
|
||
|
if (valueExpression.columnReference) {
|
||
|
parser.yy.result.colRef = {identifierChain: valueExpression.columnReference};
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.selectListNoTableSuggest = function (selectListEdit, hasDistinctOrAll) {
|
||
|
if (selectListEdit.cursorAtStart) {
|
||
|
var keywords = parser.getSelectListKeywords();
|
||
|
if (!hasDistinctOrAll) {
|
||
|
keywords = keywords.concat([{ value: 'ALL', weight: 2 }, { value: 'DISTINCT', weight: 2 }]);
|
||
|
}
|
||
|
if (parser.isImpala()) {
|
||
|
keywords.push('STRAIGHT_JOIN');
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
} else {
|
||
|
parser.checkForKeywords(selectListEdit);
|
||
|
}
|
||
|
if (selectListEdit.suggestFunctions) {
|
||
|
parser.suggestFunctions();
|
||
|
}
|
||
|
if (selectListEdit.suggestColumns) {
|
||
|
parser.suggestColumns();
|
||
|
}
|
||
|
if (selectListEdit.suggestAggregateFunctions && (!hasDistinctOrAll || hasDistinctOrAll === 'ALL')) {
|
||
|
parser.suggestAggregateFunctions();
|
||
|
parser.suggestAnalyticFunctions();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.suggestJoinConditions = function (details) {
|
||
|
parser.yy.result.suggestJoinConditions = details || {};
|
||
|
if (parser.yy.latestTablePrimaries && !parser.yy.result.suggestJoinConditions.tablePrimaries) {
|
||
|
parser.yy.result.suggestJoinConditions.tablePrimaries = parser.yy.latestTablePrimaries.concat();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.suggestJoins = function (details) {
|
||
|
parser.yy.result.suggestJoins = details || {};
|
||
|
};
|
||
|
|
||
|
parser.valueExpressionSuggest = function (oppositeValueExpression, operator) {
|
||
|
if (oppositeValueExpression && oppositeValueExpression.columnReference) {
|
||
|
parser.suggestValues();
|
||
|
parser.yy.result.colRef = {identifierChain: oppositeValueExpression.columnReference};
|
||
|
}
|
||
|
parser.suggestColumns();
|
||
|
parser.suggestFunctions();
|
||
|
var keywords = [{ value: 'CASE', weight: 450 }, { value: 'FALSE', weight: 450 }, { value: 'NULL', weight: 450 }, { value: 'TRUE', weight: 450 }];
|
||
|
if (parser.isHive() || typeof oppositeValueExpression === 'undefined' || typeof operator === 'undefined') {
|
||
|
keywords = keywords.concat(['EXISTS', 'NOT']);
|
||
|
}
|
||
|
if (oppositeValueExpression && oppositeValueExpression.types[0] === 'NUMBER') {
|
||
|
parser.applyTypeToSuggestions(['NUMBER']);
|
||
|
} else if (parser.isImpala() && (typeof operator === 'undefined' || operator === '-' || operator === '+')) {
|
||
|
keywords.push('INTERVAL');
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
};
|
||
|
|
||
|
parser.applyTypeToSuggestions = function (types) {
|
||
|
if (types[0] === 'BOOLEAN') {
|
||
|
return;
|
||
|
}
|
||
|
if (parser.yy.result.suggestFunctions && !parser.yy.result.suggestFunctions.types) {
|
||
|
parser.yy.result.suggestFunctions.types = types;
|
||
|
}
|
||
|
if (parser.yy.result.suggestColumns && !parser.yy.result.suggestColumns.types) {
|
||
|
parser.yy.result.suggestColumns.types = types;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.findCaseType = function (whenThenList) {
|
||
|
var types = {};
|
||
|
whenThenList.caseTypes.forEach(function (valueExpression) {
|
||
|
valueExpression.types.forEach(function (type) {
|
||
|
types[type] = true;
|
||
|
});
|
||
|
});
|
||
|
if (Object.keys(types).length === 1) {
|
||
|
return {types: [Object.keys(types)[0]]};
|
||
|
}
|
||
|
return {types: ['T']};
|
||
|
};
|
||
|
|
||
|
parser.findReturnTypes = function (functionName) {
|
||
|
return typeof SqlFunctions === 'undefined' ? ['T'] : SqlFunctions.getReturnTypes(parser.yy.activeDialect, functionName.toLowerCase());
|
||
|
};
|
||
|
|
||
|
parser.applyArgumentTypesToSuggestions = function (functionName, position) {
|
||
|
var foundArguments = typeof SqlFunctions === 'undefined' ? ['T'] : SqlFunctions.getArgumentTypes(parser.yy.activeDialect, functionName.toLowerCase(), position);
|
||
|
if (foundArguments.length == 0 && parser.yy.result.suggestColumns) {
|
||
|
delete parser.yy.result.suggestColumns;
|
||
|
delete parser.yy.result.suggestKeyValues;
|
||
|
delete parser.yy.result.suggestValues;
|
||
|
delete parser.yy.result.suggestFunctions;
|
||
|
delete parser.yy.result.suggestIdentifiers;
|
||
|
delete parser.yy.result.suggestKeywords;
|
||
|
} else {
|
||
|
parser.applyTypeToSuggestions(foundArguments);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var getCleanImpalaPrimaries = function (primaries) {
|
||
|
var cleanPrimaries = [];
|
||
|
for (var i = primaries.length - 1; i >= 0; i--) {
|
||
|
var cleanPrimary = primaries[i];
|
||
|
if (cleanPrimary.identifierChain && cleanPrimary.identifierChain.length > 0) {
|
||
|
for (var j = i - 1; j >=0; j--) {
|
||
|
var parentPrimary = primaries[j];
|
||
|
if (parentPrimary.alias && cleanPrimary.identifierChain[0].name === parentPrimary.alias) {
|
||
|
var restOfChain = cleanPrimary.identifierChain.concat();
|
||
|
restOfChain.shift();
|
||
|
if (cleanPrimary.alias) {
|
||
|
cleanPrimary = { identifierChain: parentPrimary.identifierChain.concat(restOfChain), alias: cleanPrimary.alias, impalaComplex: true };
|
||
|
} else {
|
||
|
cleanPrimary = { identifierChain: parentPrimary.identifierChain.concat(restOfChain), impalaComplex: true };
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
cleanPrimaries.push(cleanPrimary);
|
||
|
}
|
||
|
return cleanPrimaries;
|
||
|
};
|
||
|
|
||
|
parser.commitLocations = function () {
|
||
|
if (parser.yy.locations.length === 0) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var tablePrimaries = parser.yy.latestTablePrimaries;
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
tablePrimaries = [];
|
||
|
getCleanImpalaPrimaries(parser.yy.latestTablePrimaries).forEach(function (primary) {
|
||
|
var cleanPrimary = primary;
|
||
|
if (primary.identifierChain && primary.identifierChain.length > 0) {
|
||
|
for (var j = parser.yy.primariesStack.length - 1; j >= 0; j--) {
|
||
|
getCleanImpalaPrimaries(parser.yy.primariesStack[j]).every(function (parentPrimary) {
|
||
|
if (parentPrimary.alias && parentPrimary.alias === primary.identifierChain[0].name) {
|
||
|
var identifierChain = primary.identifierChain.concat();
|
||
|
identifierChain.shift();
|
||
|
cleanPrimary = { identifierChain: parentPrimary.identifierChain.concat(identifierChain) };
|
||
|
if (primary.alias) {
|
||
|
cleanPrimary.alias = primary.alias;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
return true;
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
tablePrimaries.unshift(cleanPrimary);
|
||
|
});
|
||
|
}
|
||
|
var i = parser.yy.locations.length;
|
||
|
|
||
|
while (i--) {
|
||
|
var location = parser.yy.locations[i];
|
||
|
if (location.type === 'variable' && location.colRef) {
|
||
|
parser.expandIdentifierChain({ wrapper: location.colRef, tablePrimaries: tablePrimaries, isColumnWrapper: true });
|
||
|
delete location.colRef.linked;
|
||
|
}
|
||
|
|
||
|
// Impala can have references to previous tables after FROM, i.e. FROM testTable t, t.testArray
|
||
|
// In this testArray would be marked a type table so we need to switch it to column.
|
||
|
if (location.type === 'table' && typeof location.identifierChain !== 'undefined' && location.identifierChain.length > 1 && tablePrimaries) {
|
||
|
var allPrimaries = tablePrimaries;
|
||
|
parser.yy.primariesStack.forEach(function (parentPrimaries) {
|
||
|
allPrimaries = getCleanImpalaPrimaries(parentPrimaries).concat(allPrimaries);
|
||
|
});
|
||
|
var found = allPrimaries.filter(function (primary) {
|
||
|
return equalIgnoreCase(primary.alias, location.identifierChain[0].name);
|
||
|
});
|
||
|
if (found.length > 0) {
|
||
|
location.type = 'column';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (location.type === 'database' && typeof location.identifierChain !== 'undefined' && location.identifierChain.length > 0 && tablePrimaries) {
|
||
|
var allPrimaries = tablePrimaries;
|
||
|
parser.yy.primariesStack.forEach(function (parentPrimaries) {
|
||
|
allPrimaries = getCleanImpalaPrimaries(parentPrimaries).concat(allPrimaries);
|
||
|
});
|
||
|
var foundAlias = allPrimaries.filter(function (primary) {
|
||
|
return equalIgnoreCase(primary.alias, location.identifierChain[0].name);
|
||
|
});
|
||
|
if (foundAlias.length > 0 && parser.isImpala()) {
|
||
|
// Impala complex reference in FROM clause, i.e. FROM testTable t, t.testMap tm
|
||
|
location.type = 'table';
|
||
|
parser.expandIdentifierChain({ tablePrimaries: allPrimaries, wrapper: location, anyOwner: true });
|
||
|
location.type = location.identifierChain.length === 1 ? 'table' : 'complex';
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (location.type === 'unknown') {
|
||
|
if (typeof location.identifierChain !== 'undefined' && location.identifierChain.length > 0 && location.identifierChain.length <= 2 && tablePrimaries) {
|
||
|
var found = tablePrimaries.filter(function (primary) {
|
||
|
return equalIgnoreCase(primary.alias, location.identifierChain[0].name) || (primary.identifierChain && equalIgnoreCase(primary.identifierChain[0].name, location.identifierChain[0].name));
|
||
|
});
|
||
|
if (!found.length && location.firstInChain) {
|
||
|
found = tablePrimaries.filter(function (primary) {
|
||
|
return !primary.alias && primary.identifierChain && equalIgnoreCase(primary.identifierChain[primary.identifierChain.length - 1].name, location.identifierChain[0].name);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
if (found.length) {
|
||
|
if (found[0].identifierChain.length > 1 && location.identifierChain.length === 1 && equalIgnoreCase(found[0].identifierChain[0].name, location.identifierChain[0].name)) {
|
||
|
location.type = 'database';
|
||
|
} else if (found[0].alias && equalIgnoreCase(location.identifierChain[0].name, found[0].alias) && location.identifierChain.length > 1) {
|
||
|
location.type = 'column';
|
||
|
parser.expandIdentifierChain({ tablePrimaries: tablePrimaries, wrapper: location, anyOwner: true });
|
||
|
} else if (!found[0].alias && found[0].identifierChain && equalIgnoreCase(location.identifierChain[0].name, found[0].identifierChain[found[0].identifierChain.length - 1].name) && location.identifierChain.length > 1) {
|
||
|
location.type = 'column';
|
||
|
parser.expandIdentifierChain({ tablePrimaries: tablePrimaries, wrapper: location, anyOwner: true });
|
||
|
} else {
|
||
|
location.type = found[0].impalaComplex ? 'column' : 'table';
|
||
|
parser.expandIdentifierChain({ tablePrimaries: tablePrimaries, wrapper: location, anyOwner: true });
|
||
|
}
|
||
|
} else {
|
||
|
if (parser.yy.subQueries) {
|
||
|
found = parser.yy.subQueries.filter(function (subQuery) {
|
||
|
return equalIgnoreCase(subQuery.alias, location.identifierChain[0].name);
|
||
|
});
|
||
|
if (found.length > 0) {
|
||
|
location.type = 'subQuery';
|
||
|
location.identifierChain = [{subQuery: found[0].alias}];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (location.type === 'asterisk' && !location.linked) {
|
||
|
|
||
|
if (tablePrimaries && tablePrimaries.length > 0) {
|
||
|
location.tables = [];
|
||
|
location.linked = false;
|
||
|
if (!location.identifierChain) {
|
||
|
location.identifierChain = [{ asterisk: true }];
|
||
|
}
|
||
|
parser.expandIdentifierChain({ tablePrimaries: tablePrimaries, wrapper: location, anyOwner: false });
|
||
|
if (location.tables.length === 0) {
|
||
|
parser.yy.locations.splice(i, 1);
|
||
|
}
|
||
|
} else {
|
||
|
parser.yy.locations.splice(i, 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (location.type === 'table' && typeof location.identifierChain !== 'undefined' && location.identifierChain.length === 1 && location.identifierChain[0].name) {
|
||
|
// Could be a cte reference
|
||
|
parser.yy.locations.some(function (otherLocation) {
|
||
|
if (otherLocation.type === 'alias' && otherLocation.source === 'cte' && SqlUtils.identifierEquals(otherLocation.alias, location.identifierChain[0].name)) {
|
||
|
// TODO: Possibly add the other location if we want to show the link in the future.
|
||
|
// i.e. highlight select definition on hover over alias, also for subquery references.
|
||
|
location.type = 'alias';
|
||
|
location.target = 'cte';
|
||
|
location.alias = location.identifierChain[0].name;
|
||
|
delete location.identifierChain;
|
||
|
return true;
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
if (location.type === 'table' && (typeof location.identifierChain === 'undefined' || location.identifierChain.length === 0)) {
|
||
|
parser.yy.locations.splice(i, 1);
|
||
|
}
|
||
|
|
||
|
if (location.type === 'unknown') {
|
||
|
location.type = 'column';
|
||
|
}
|
||
|
|
||
|
// A column location might refer to a previously defined alias, i.e. last 'foo' in "SELECT cast(id AS int) foo FROM tbl ORDER BY foo;"
|
||
|
if (location.type === 'column') {
|
||
|
for (var j = i - 1; j >= 0; j--) {
|
||
|
var otherLocation = parser.yy.locations[j];
|
||
|
if (otherLocation.type === 'alias' && otherLocation.source === 'column' && location.identifierChain && location.identifierChain.length === 1 && location.identifierChain[0].name && otherLocation.alias && location.identifierChain[0].name.toLowerCase() === otherLocation.alias.toLowerCase()) {
|
||
|
location.type = 'alias';
|
||
|
location.source = 'column';
|
||
|
location.alias = location.identifierChain[0].name;
|
||
|
delete location.identifierChain;
|
||
|
location.parentLocation = otherLocation.parentLocation;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (location.type === 'column') {
|
||
|
if (parser.isHive() && !location.linked) {
|
||
|
location.identifierChain = parser.expandLateralViews(parser.yy.lateralViews, location.identifierChain);
|
||
|
}
|
||
|
|
||
|
var initialIdentifierChain = location.identifierChain ? location.identifierChain.concat() : undefined;
|
||
|
|
||
|
parser.expandIdentifierChain({ tablePrimaries: tablePrimaries, wrapper: location, anyOwner: true, isColumnWrapper: true, isColumnLocation: true });
|
||
|
|
||
|
if (typeof location.identifierChain === 'undefined') {
|
||
|
parser.yy.locations.splice(i, 1);
|
||
|
} else if (location.identifierChain.length === 0 && initialIdentifierChain && initialIdentifierChain.length === 1) {
|
||
|
// This is for the case "SELECT tblOrColName FROM db.tblOrColName";
|
||
|
location.identifierChain = initialIdentifierChain;
|
||
|
}
|
||
|
}
|
||
|
if (location.type === 'column' && location.identifierChain) {
|
||
|
if (location.identifierChain.length > 1 && location.tables && location.tables.length > 0) {
|
||
|
location.type = 'complex';
|
||
|
}
|
||
|
}
|
||
|
delete location.firstInChain;
|
||
|
if (location.type !== 'column' && location.type !== 'complex') {
|
||
|
delete location.qualified;
|
||
|
} else if (typeof location.qualified === 'undefined') {
|
||
|
location.qualified = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (parser.yy.locations.length > 0) {
|
||
|
parser.yy.allLocations = parser.yy.allLocations.concat(parser.yy.locations);
|
||
|
parser.yy.locations = [];
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var prioritizeSuggestions = function () {
|
||
|
parser.yy.result.lowerCase = parser.yy.lowerCase || false;
|
||
|
|
||
|
var cteIndex = {};
|
||
|
|
||
|
if (typeof parser.yy.latestCommonTableExpressions !== 'undefined') {
|
||
|
parser.yy.latestCommonTableExpressions.forEach(function (cte) {
|
||
|
cteIndex[cte.alias.toLowerCase()] = cte;
|
||
|
})
|
||
|
}
|
||
|
|
||
|
SIMPLE_TABLE_REF_SUGGESTIONS.forEach(function (suggestionType) {
|
||
|
if (suggestionType !== 'suggestAggregateFunctions' && typeof parser.yy.result[suggestionType] !== 'undefined' && parser.yy.result[suggestionType].tables.length === 0) {
|
||
|
delete parser.yy.result[suggestionType];
|
||
|
} else if (typeof parser.yy.result[suggestionType] !== 'undefined' && typeof parser.yy.result[suggestionType].tables !== 'undefined') {
|
||
|
for (var i = parser.yy.result[suggestionType].tables.length - 1; i >= 0; i--) {
|
||
|
var table = parser.yy.result[suggestionType].tables[i];
|
||
|
if (table.identifierChain.length === 1 && typeof table.identifierChain[0].name !== 'undefined' && typeof cteIndex[table.identifierChain[0].name.toLowerCase()] !== 'undefined') {
|
||
|
parser.yy.result[suggestionType].tables.splice(i, 1);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
if (typeof parser.yy.result.colRef !== 'undefined') {
|
||
|
if (!parser.yy.result.colRef.linked || typeof parser.yy.result.colRef.identifierChain === 'undefined' || parser.yy.result.colRef.identifierChain.length === 0) {
|
||
|
delete parser.yy.result.colRef;
|
||
|
if (typeof parser.yy.result.suggestColRefKeywords !== 'undefined') {
|
||
|
Object.keys(parser.yy.result.suggestColRefKeywords).forEach(function (type) {
|
||
|
parser.yy.result.suggestKeywords = parser.yy.result.suggestKeywords.concat(parser.createWeightedKeywords(parser.yy.result.suggestColRefKeywords[type], -1));
|
||
|
});
|
||
|
delete parser.yy.result.suggestColRefKeywords;
|
||
|
}
|
||
|
if (parser.yy.result.suggestColumns && parser.yy.result.suggestColumns.types.length === 1 && parser.yy.result.suggestColumns.types[0] === 'COLREF') {
|
||
|
parser.yy.result.suggestColumns.types = ['T'];
|
||
|
}
|
||
|
delete parser.yy.result.suggestValues;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (typeof parser.yy.result.colRef !== 'undefined') {
|
||
|
if (!parser.yy.result.suggestValues && !parser.yy.result.suggestColRefKeywords &&
|
||
|
(!parser.yy.result.suggestColumns ||
|
||
|
parser.yy.result.suggestColumns.types[0] !== 'COLREF')) {
|
||
|
delete parser.yy.result.colRef;
|
||
|
}
|
||
|
}
|
||
|
if (typeof parser.yy.result.suggestIdentifiers !== 'undefined' && parser.yy.result.suggestIdentifiers.length > 0) {
|
||
|
delete parser.yy.result.suggestTables;
|
||
|
delete parser.yy.result.suggestDatabases;
|
||
|
}
|
||
|
if (typeof parser.yy.result.suggestColumns !== 'undefined') {
|
||
|
var suggestColumns = parser.yy.result.suggestColumns;
|
||
|
if (typeof suggestColumns.tables === 'undefined' || suggestColumns.tables.length === 0) {
|
||
|
// Impala supports statements like SELECT * FROM tbl1, tbl2 WHERE db.tbl1.col = tbl2.bla
|
||
|
if (parser.yy.result.suggestColumns.linked && parser.isImpala() && typeof suggestColumns.identifierChain !== 'undefined' && suggestColumns.identifierChain.length > 0) {
|
||
|
if (suggestColumns.identifierChain.length === 1) {
|
||
|
parser.yy.result.suggestTables = suggestColumns;
|
||
|
delete parser.yy.result.suggestColumns
|
||
|
} else {
|
||
|
suggestColumns.tables = [{identifierChain: suggestColumns.identifierChain}];
|
||
|
delete suggestColumns.identifierChain;
|
||
|
}
|
||
|
} else {
|
||
|
delete parser.yy.result.suggestColumns;
|
||
|
delete parser.yy.result.subQueries;
|
||
|
}
|
||
|
} else {
|
||
|
delete parser.yy.result.suggestTables;
|
||
|
delete parser.yy.result.suggestDatabases;
|
||
|
|
||
|
suggestColumns.tables.forEach(function (table) {
|
||
|
if (typeof table.identifierChain !== 'undefined' && table.identifierChain.length === 1 && typeof table.identifierChain[0].name !== 'undefined') {
|
||
|
var cte = cteIndex[table.identifierChain[0].name.toLowerCase()];
|
||
|
if (typeof cte !== 'undefined') {
|
||
|
delete table.identifierChain[0].name;
|
||
|
table.identifierChain[0].cte = cte.alias;
|
||
|
}
|
||
|
} else if (typeof table.identifierChain === 'undefined' && table.subQuery) {
|
||
|
table.identifierChain = [{ subQuery: table.subQuery }];
|
||
|
delete table.subQuery;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
if (typeof suggestColumns.identifierChain !== 'undefined' && suggestColumns.identifierChain.length === 0) {
|
||
|
delete suggestColumns.identifierChain;
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
delete parser.yy.result.subQueries;
|
||
|
}
|
||
|
|
||
|
if (typeof parser.yy.result.suggestJoinConditions !== 'undefined') {
|
||
|
if (typeof parser.yy.result.suggestJoinConditions.tables === 'undefined' || parser.yy.result.suggestJoinConditions.tables.length === 0) {
|
||
|
delete parser.yy.result.suggestJoinConditions;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (typeof parser.yy.result.suggestTables !== 'undefined' && typeof parser.yy.latestCommonTableExpressions !== 'undefined') {
|
||
|
var ctes = [];
|
||
|
parser.yy.latestCommonTableExpressions.forEach(function (cte) {
|
||
|
var suggestion = {name: cte.alias};
|
||
|
if (parser.yy.result.suggestTables.prependFrom) {
|
||
|
suggestion.prependFrom = true
|
||
|
}
|
||
|
if (parser.yy.result.suggestTables.prependQuestionMark) {
|
||
|
suggestion.prependQuestionMark = true;
|
||
|
}
|
||
|
ctes.push(suggestion);
|
||
|
});
|
||
|
if (ctes.length > 0) {
|
||
|
parser.yy.result.suggestCommonTableExpressions = ctes;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Impala supports referencing maps and arrays in the the table reference list i.e.
|
||
|
*
|
||
|
* SELECT m['foo'].bar.| FROM someDb.someTable t, t.someMap m;
|
||
|
*
|
||
|
* From this the tablePrimaries would look like:
|
||
|
*
|
||
|
* [ { alias: 't', identifierChain: [ { name: 'someDb' }, { name: 'someTable' } ] },
|
||
|
* { alias: 'm', identifierChain: [ { name: 't' }, { name: 'someMap' } ] } ]
|
||
|
*
|
||
|
* with an identifierChain from the select list:
|
||
|
*
|
||
|
* [ { name: 'm', keySet: true }, { name: 'bar' } ]
|
||
|
*
|
||
|
* Calling this would return an expanded identifierChain, given the above it would be:
|
||
|
*
|
||
|
* [ { name: 't' }, { name: 'someMap', keySet: true }, { name: 'bar' } ]
|
||
|
*/
|
||
|
parser.expandImpalaIdentifierChain = function (tablePrimaries, identifierChain) {
|
||
|
var expandedChain = identifierChain.concat(); // Clone in case it's called multiple times.
|
||
|
if (typeof expandedChain === 'undefined' || expandedChain.length === 0) {
|
||
|
return identifierChain;
|
||
|
}
|
||
|
var expand = function (identifier, expandedChain) {
|
||
|
var foundPrimary = tablePrimaries.filter(function (tablePrimary) {
|
||
|
var primaryIdentifier = tablePrimary.alias;
|
||
|
if (!primaryIdentifier && tablePrimary.identifierChain && tablePrimary.identifierChain.length > 0) {
|
||
|
primaryIdentifier = tablePrimary.identifierChain[tablePrimary.identifierChain.length - 1].name;
|
||
|
}
|
||
|
return equalIgnoreCase(primaryIdentifier, identifier);
|
||
|
});
|
||
|
|
||
|
if (foundPrimary.length === 1 && foundPrimary[0].identifierChain) {
|
||
|
var parentPrimary = tablePrimaries.filter(function (tablePrimary) {
|
||
|
return equalIgnoreCase(tablePrimary.alias, foundPrimary[0].identifierChain[0].name);
|
||
|
});
|
||
|
if (parentPrimary.length === 1) {
|
||
|
var keySet = expandedChain[0].keySet;
|
||
|
var secondPart = expandedChain.slice(1);
|
||
|
var firstPart = [];
|
||
|
// Clone to make sure we don't add keySet to the primaries
|
||
|
foundPrimary[0].identifierChain.forEach(function (identifier) {
|
||
|
firstPart.push({name: identifier.name});
|
||
|
});
|
||
|
if (keySet && firstPart.length > 0) {
|
||
|
firstPart[firstPart.length - 1].keySet = true;
|
||
|
}
|
||
|
|
||
|
if (firstPart.length === 0 || typeof secondPart === 'undefined' || secondPart.length === 0) {
|
||
|
return firstPart;
|
||
|
}
|
||
|
var result = firstPart.concat(secondPart);
|
||
|
if (result.length > 0) {
|
||
|
return expand(firstPart[0].name, result);
|
||
|
} else {
|
||
|
return result;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return expandedChain;
|
||
|
};
|
||
|
return expand(expandedChain[0].name, expandedChain);
|
||
|
};
|
||
|
|
||
|
parser.identifyPartials = function (beforeCursor, afterCursor) {
|
||
|
var beforeMatch = beforeCursor.match(/[0-9a-zA-Z_]*$/);
|
||
|
var afterMatch = afterCursor.match(/^[0-9a-zA-Z_]*(?:\((?:[^)]*\))?)?/);
|
||
|
return {left: beforeMatch ? beforeMatch[0].length : 0, right: afterMatch ? afterMatch[0].length : 0};
|
||
|
};
|
||
|
|
||
|
parser.expandLateralViews = function (lateralViews, originalIdentifierChain, columnSuggestion) {
|
||
|
var identifierChain = originalIdentifierChain.concat(); // Clone in case it's re-used
|
||
|
var firstIdentifier = identifierChain[0];
|
||
|
if (typeof lateralViews !== 'undefined') {
|
||
|
lateralViews.concat().reverse().forEach(function (lateralView) {
|
||
|
if (!lateralView.udtf.expression.columnReference) {
|
||
|
return;
|
||
|
}
|
||
|
if (equalIgnoreCase(firstIdentifier.name, lateralView.tableAlias) && identifierChain.length > 1) {
|
||
|
identifierChain.shift();
|
||
|
firstIdentifier = identifierChain[0];
|
||
|
if (columnSuggestion) {
|
||
|
delete parser.yy.result.suggestKeywords;
|
||
|
}
|
||
|
} else if (equalIgnoreCase(firstIdentifier.name, lateralView.tableAlias) && identifierChain.length === 1 && typeof parser.yy.result.suggestColumns !== 'undefined') {
|
||
|
if (columnSuggestion) {
|
||
|
if (typeof parser.yy.result.suggestIdentifiers === 'undefined') {
|
||
|
parser.yy.result.suggestIdentifiers = [];
|
||
|
}
|
||
|
lateralView.columnAliases.forEach(function (columnAlias) {
|
||
|
parser.yy.result.suggestIdentifiers.push({name: columnAlias, type: 'alias'});
|
||
|
});
|
||
|
delete parser.yy.result.suggestColumns;
|
||
|
delete parser.yy.result.suggestKeywords;
|
||
|
}
|
||
|
return identifierChain;
|
||
|
}
|
||
|
if (lateralView.columnAliases.indexOf(firstIdentifier.name) !== -1) {
|
||
|
if (lateralView.columnAliases.length === 2 && lateralView.udtf.function.toLowerCase() === 'explode' && equalIgnoreCase(firstIdentifier.name, lateralView.columnAliases[0])) {
|
||
|
identifierChain[0] = {name: 'key'};
|
||
|
} else if (lateralView.columnAliases.length === 2 && lateralView.udtf.function.toLowerCase() === 'explode' && equalIgnoreCase(firstIdentifier.name, lateralView.columnAliases[1])) {
|
||
|
identifierChain[0] = {name: 'value'};
|
||
|
} else {
|
||
|
identifierChain[0] = {name: 'item'};
|
||
|
}
|
||
|
identifierChain = lateralView.udtf.expression.columnReference.concat(identifierChain);
|
||
|
firstIdentifier = identifierChain[0];
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
return identifierChain;
|
||
|
};
|
||
|
|
||
|
var addCleanTablePrimary = function (tables, tablePrimary) {
|
||
|
if (tablePrimary.alias) {
|
||
|
tables.push({alias: tablePrimary.alias, identifierChain: tablePrimary.identifierChain});
|
||
|
} else {
|
||
|
tables.push({identifierChain: tablePrimary.identifierChain});
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.expandIdentifierChain = function (options) {
|
||
|
var wrapper = options.wrapper;
|
||
|
var anyOwner = options.anyOwner;
|
||
|
var isColumnWrapper = options.isColumnWrapper;
|
||
|
var isColumnLocation = options.isColumnLocation;
|
||
|
var tablePrimaries = options.tablePrimaries || parser.yy.latestTablePrimaries;
|
||
|
|
||
|
if (typeof wrapper.identifierChain === 'undefined' || typeof tablePrimaries === 'undefined') {
|
||
|
return;
|
||
|
}
|
||
|
var identifierChain = wrapper.identifierChain.concat();
|
||
|
|
||
|
if (tablePrimaries.length === 0) {
|
||
|
delete wrapper.identifierChain;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (!anyOwner) {
|
||
|
tablePrimaries = filterTablePrimariesForOwner(tablePrimaries, wrapper.owner);
|
||
|
}
|
||
|
|
||
|
if (identifierChain.length > 0 && identifierChain[identifierChain.length - 1].asterisk) {
|
||
|
var tables = [];
|
||
|
tablePrimaries.forEach(function (tablePrimary) {
|
||
|
if (identifierChain.length > 1 && !tablePrimary.subQueryAlias) {
|
||
|
if (identifierChain.length === 2 && equalIgnoreCase(tablePrimary.alias, identifierChain[0].name)) {
|
||
|
addCleanTablePrimary(tables, tablePrimary);
|
||
|
} else if (identifierChain.length === 2 && equalIgnoreCase(tablePrimary.identifierChain[0].name, identifierChain[0].name)) {
|
||
|
addCleanTablePrimary(tables, tablePrimary);
|
||
|
} else if (identifierChain.length === 3 && tablePrimary.identifierChain.length > 1 &&
|
||
|
equalIgnoreCase(tablePrimary.identifierChain[0].name, identifierChain[0].name) &&
|
||
|
equalIgnoreCase(tablePrimary.identifierChain[1].name, identifierChain[1].name)) {
|
||
|
addCleanTablePrimary(tables, tablePrimary);
|
||
|
}
|
||
|
} else {
|
||
|
if (tablePrimary.subQueryAlias) {
|
||
|
tables.push({identifierChain: [{subQuery: tablePrimary.subQueryAlias}]});
|
||
|
} else {
|
||
|
addCleanTablePrimary(tables, tablePrimary);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
// Possible Joins
|
||
|
if (tables.length > 0) {
|
||
|
wrapper.tables = tables;
|
||
|
delete wrapper.identifierChain;
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Impala can have references to maps or array, i.e. FROM table t, t.map m
|
||
|
// We need to replace those in the identifierChain
|
||
|
if (parser.isImpala()) {
|
||
|
var lengthBefore = identifierChain.length;
|
||
|
identifierChain = parser.expandImpalaIdentifierChain(tablePrimaries, identifierChain);
|
||
|
// Change type of any locations marked as table
|
||
|
if (wrapper.type === 'table' && identifierChain.length > lengthBefore) {
|
||
|
wrapper.type = 'column';
|
||
|
}
|
||
|
wrapper.identifierChain = identifierChain;
|
||
|
}
|
||
|
// Expand exploded views in the identifier chain
|
||
|
if (parser.isHive() && identifierChain.length > 0) {
|
||
|
identifierChain = parser.expandLateralViews(parser.yy.lateralViews, identifierChain);
|
||
|
wrapper.identifierChain = identifierChain;
|
||
|
}
|
||
|
|
||
|
// IdentifierChain contains a possibly started identifier or empty, example: a.b.c = ['a', 'b', 'c']
|
||
|
// Reduce the tablePrimaries to the one that matches the first identifier if found
|
||
|
var foundPrimary;
|
||
|
var doubleMatch = false;
|
||
|
var aliasMatch = false;
|
||
|
if (identifierChain.length > 0) {
|
||
|
for (var i = 0; i < tablePrimaries.length; i++) {
|
||
|
if (tablePrimaries[i].subQueryAlias) {
|
||
|
if (equalIgnoreCase(tablePrimaries[i].subQueryAlias, identifierChain[0].name)) {
|
||
|
foundPrimary = tablePrimaries[i];
|
||
|
}
|
||
|
} else if (equalIgnoreCase(tablePrimaries[i].alias, identifierChain[0].name)) {
|
||
|
foundPrimary = tablePrimaries[i];
|
||
|
aliasMatch = true;
|
||
|
break;
|
||
|
} else if (tablePrimaries[i].identifierChain.length > 1 && identifierChain.length > 1 &&
|
||
|
equalIgnoreCase(tablePrimaries[i].identifierChain[0].name, identifierChain[0].name) &&
|
||
|
equalIgnoreCase(tablePrimaries[i].identifierChain[1].name, identifierChain[1].name)) {
|
||
|
foundPrimary = tablePrimaries[i];
|
||
|
doubleMatch = true;
|
||
|
break;
|
||
|
} else if (!foundPrimary && equalIgnoreCase(tablePrimaries[i].identifierChain[0].name, identifierChain[0].name) && identifierChain.length > (isColumnLocation ? 1 : 0)) {
|
||
|
foundPrimary = tablePrimaries[i];
|
||
|
// No break as first two can still match.
|
||
|
} else if (!foundPrimary && tablePrimaries[i].identifierChain.length > 1 && !tablePrimaries[i].alias
|
||
|
&& equalIgnoreCase(tablePrimaries[i].identifierChain[tablePrimaries[i].identifierChain.length - 1].name, identifierChain[0].name)) {
|
||
|
// This is for the case SELECT baa. FROM bla.baa, blo.boo;
|
||
|
foundPrimary = tablePrimaries[i];
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (foundPrimary) {
|
||
|
if (foundPrimary.impalaComplex && wrapper.type === 'column') {
|
||
|
wrapper.type = 'complex';
|
||
|
}
|
||
|
identifierChain.shift();
|
||
|
if (doubleMatch) {
|
||
|
identifierChain.shift();
|
||
|
}
|
||
|
} else if (tablePrimaries.length === 1 && !isColumnWrapper) {
|
||
|
foundPrimary = tablePrimaries[0];
|
||
|
}
|
||
|
|
||
|
if (foundPrimary) {
|
||
|
if (isColumnWrapper) {
|
||
|
wrapper.identifierChain = identifierChain;
|
||
|
if (foundPrimary.subQueryAlias) {
|
||
|
wrapper.tables = [{ subQuery: foundPrimary.subQueryAlias }];
|
||
|
} else if (foundPrimary.alias) {
|
||
|
if (!isColumnLocation && isColumnWrapper && aliasMatch) {
|
||
|
// TODO: add alias on table in suggestColumns (needs support in sqlAutocomplete3.js)
|
||
|
// the case is: SELECT cu.| FROM customers cu;
|
||
|
// This prevents alias from being added automatically in sqlAutocompleter3.js
|
||
|
wrapper.tables = [{ identifierChain: foundPrimary.identifierChain }];
|
||
|
} else {
|
||
|
wrapper.tables = [{ identifierChain: foundPrimary.identifierChain, alias: foundPrimary.alias }];
|
||
|
}
|
||
|
} else {
|
||
|
wrapper.tables = [{ identifierChain: foundPrimary.identifierChain }];
|
||
|
}
|
||
|
} else {
|
||
|
if (foundPrimary.subQueryAlias) {
|
||
|
identifierChain.unshift({ subQuery: foundPrimary.subQueryAlias });
|
||
|
} else {
|
||
|
identifierChain = foundPrimary.identifierChain.concat(identifierChain);
|
||
|
}
|
||
|
if (wrapper.tables) {
|
||
|
wrapper.tables.push({identifierChain: identifierChain});
|
||
|
delete wrapper.identifierChain;
|
||
|
} else {
|
||
|
wrapper.identifierChain = identifierChain;
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
if (isColumnWrapper) {
|
||
|
wrapper.tables = [];
|
||
|
}
|
||
|
tablePrimaries.forEach(function (tablePrimary) {
|
||
|
var targetTable = tablePrimary.subQueryAlias ? { subQuery: tablePrimary.subQueryAlias } : { identifierChain: tablePrimary.identifierChain } ;
|
||
|
if (tablePrimary.alias) {
|
||
|
targetTable.alias = tablePrimary.alias;
|
||
|
}
|
||
|
if (wrapper.tables) {
|
||
|
wrapper.tables.push(targetTable)
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
delete wrapper.owner;
|
||
|
wrapper.linked = true;
|
||
|
};
|
||
|
|
||
|
var suggestLateralViewAliasesAsIdentifiers = function () {
|
||
|
if (typeof parser.yy.lateralViews === 'undefined' || parser.yy.lateralViews.length === 0) {
|
||
|
return;
|
||
|
}
|
||
|
if (typeof parser.yy.result.suggestIdentifiers === 'undefined') {
|
||
|
parser.yy.result.suggestIdentifiers = [];
|
||
|
}
|
||
|
parser.yy.lateralViews.forEach(function (lateralView) {
|
||
|
if (typeof lateralView.tableAlias !== 'undefined') {
|
||
|
parser.yy.result.suggestIdentifiers.push({name: lateralView.tableAlias + '.', type: 'alias'});
|
||
|
}
|
||
|
lateralView.columnAliases.forEach(function (columnAlias) {
|
||
|
parser.yy.result.suggestIdentifiers.push({name: columnAlias, type: 'alias'});
|
||
|
});
|
||
|
});
|
||
|
if (parser.yy.result.suggestIdentifiers.length === 0) {
|
||
|
delete parser.yy.result.suggestIdentifiers;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var filterTablePrimariesForOwner = function (tablePrimaries, owner) {
|
||
|
var result = [];
|
||
|
tablePrimaries.forEach(function (primary) {
|
||
|
if (typeof owner === 'undefined' && typeof primary.owner === 'undefined') {
|
||
|
result.push(primary);
|
||
|
} else if (owner === primary.owner) {
|
||
|
result.push(primary);
|
||
|
}
|
||
|
});
|
||
|
return result;
|
||
|
};
|
||
|
|
||
|
var convertTablePrimariesToSuggestions = function (tablePrimaries) {
|
||
|
var tables = [];
|
||
|
var identifiers = [];
|
||
|
tablePrimaries.forEach(function (tablePrimary) {
|
||
|
if (tablePrimary.identifierChain && tablePrimary.identifierChain.length > 0) {
|
||
|
var table = {identifierChain: tablePrimary.identifierChain};
|
||
|
if (tablePrimary.alias) {
|
||
|
table.alias = tablePrimary.alias;
|
||
|
identifiers.push({name: table.alias + '.', type: 'alias'});
|
||
|
if (parser.isImpala()) {
|
||
|
var testForImpalaAlias = [{name: table.alias}];
|
||
|
var result = parser.expandImpalaIdentifierChain(tablePrimaries, testForImpalaAlias);
|
||
|
if (result.length > 1) {
|
||
|
// Continue if it's a reference to a complex type
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
var lastIdentifier = tablePrimary.identifierChain[tablePrimary.identifierChain.length - 1];
|
||
|
if (typeof lastIdentifier.name !== 'undefined') {
|
||
|
identifiers.push({name: lastIdentifier.name + '.', type: 'table'});
|
||
|
} else if (typeof lastIdentifier.subQuery !== 'undefined') {
|
||
|
identifiers.push({name: lastIdentifier.subQuery + '.', type: 'sub-query'});
|
||
|
}
|
||
|
}
|
||
|
tables.push(table);
|
||
|
} else if (tablePrimary.subQueryAlias) {
|
||
|
identifiers.push({name: tablePrimary.subQueryAlias + '.', type: 'sub-query'});
|
||
|
tables.push({identifierChain: [{subQuery: tablePrimary.subQueryAlias}]});
|
||
|
}
|
||
|
});
|
||
|
if (identifiers.length > 0) {
|
||
|
if (typeof parser.yy.result.suggestIdentifiers === 'undefined') {
|
||
|
parser.yy.result.suggestIdentifiers = identifiers;
|
||
|
} else {
|
||
|
parser.yy.result.suggestIdentifiers = identifiers.concat(parser.yy.result.suggestIdentifiers);
|
||
|
}
|
||
|
}
|
||
|
parser.yy.result.suggestColumns.tables = tables;
|
||
|
if (parser.yy.result.suggestColumns.identifierChain && parser.yy.result.suggestColumns.identifierChain.length === 0) {
|
||
|
delete parser.yy.result.suggestColumns.identifierChain;
|
||
|
}
|
||
|
parser.yy.result.suggestColumns.linked = true;
|
||
|
};
|
||
|
|
||
|
var linkTablePrimaries = function () {
|
||
|
if (!parser.yy.cursorFound || typeof parser.yy.latestTablePrimaries === 'undefined') {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
SIMPLE_TABLE_REF_SUGGESTIONS.forEach(function (suggestionType) {
|
||
|
if (typeof parser.yy.result[suggestionType] !== 'undefined' && parser.yy.result[suggestionType].tablePrimaries && !parser.yy.result[suggestionType].linked) {
|
||
|
parser.yy.result[suggestionType].tables = [];
|
||
|
parser.yy.result[suggestionType].tablePrimaries.forEach(function (tablePrimary) {
|
||
|
if (!tablePrimary.subQueryAlias) {
|
||
|
parser.yy.result[suggestionType].tables.push(tablePrimary.alias ? {
|
||
|
identifierChain: tablePrimary.identifierChain.concat(),
|
||
|
alias: tablePrimary.alias
|
||
|
} : {identifierChain: tablePrimary.identifierChain.concat()});
|
||
|
}
|
||
|
});
|
||
|
delete parser.yy.result[suggestionType].tablePrimaries;
|
||
|
parser.yy.result[suggestionType].linked = true;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
if (typeof parser.yy.result.suggestColumns !== 'undefined' && !parser.yy.result.suggestColumns.linked) {
|
||
|
var tablePrimaries = filterTablePrimariesForOwner(parser.yy.latestTablePrimaries, parser.yy.result.suggestColumns.owner);
|
||
|
if (!parser.yy.result.suggestColumns.tables) {
|
||
|
parser.yy.result.suggestColumns.tables = [];
|
||
|
}
|
||
|
if (parser.yy.subQueries.length > 0) {
|
||
|
parser.yy.result.subQueries = parser.yy.subQueries;
|
||
|
}
|
||
|
if (typeof parser.yy.result.suggestColumns.identifierChain === 'undefined' || parser.yy.result.suggestColumns.identifierChain.length === 0) {
|
||
|
if (tablePrimaries.length > 1) {
|
||
|
convertTablePrimariesToSuggestions(tablePrimaries);
|
||
|
} else {
|
||
|
suggestLateralViewAliasesAsIdentifiers();
|
||
|
if (tablePrimaries.length === 1 && (tablePrimaries[0].alias || tablePrimaries[0].subQueryAlias)) {
|
||
|
convertTablePrimariesToSuggestions(tablePrimaries);
|
||
|
}
|
||
|
parser.expandIdentifierChain({ wrapper: parser.yy.result.suggestColumns, anyOwner: false, isColumnWrapper: true });
|
||
|
}
|
||
|
} else {
|
||
|
// Expand exploded views in the identifier chain
|
||
|
if (parser.isHive() && !parser.yy.result.suggestColumns.linked) {
|
||
|
var originalLength = parser.yy.result.suggestColumns.identifierChain.length;
|
||
|
parser.yy.result.suggestColumns.identifierChain = parser.expandLateralViews(parser.yy.lateralViews, parser.yy.result.suggestColumns.identifierChain, true);
|
||
|
// Drop '*' keyword for lateral views
|
||
|
if (typeof parser.yy.result.suggestColumns !== 'undefined') {
|
||
|
if (parser.yy.result.suggestColumns.identifierChain.length > originalLength &&
|
||
|
typeof parser.yy.result.suggestKeywords !== 'undefined' &&
|
||
|
parser.yy.result.suggestKeywords.length === 1 &&
|
||
|
parser.yy.result.suggestKeywords[0].value === '*') {
|
||
|
delete parser.yy.result.suggestKeywords;
|
||
|
}
|
||
|
parser.expandIdentifierChain({ wrapper: parser.yy.result.suggestColumns, anyOwner: false, isColumnWrapper: true });
|
||
|
}
|
||
|
} else {
|
||
|
parser.expandIdentifierChain({ wrapper: parser.yy.result.suggestColumns, anyOwner: false, isColumnWrapper: true });
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (typeof parser.yy.result.colRef !== 'undefined' && !parser.yy.result.colRef.linked) {
|
||
|
parser.expandIdentifierChain({ wrapper: parser.yy.result.colRef });
|
||
|
|
||
|
var primaries = filterTablePrimariesForOwner(parser.yy.latestTablePrimaries);
|
||
|
if (primaries.length === 0 || (primaries.length > 1 && parser.yy.result.colRef.identifierChain.length === 1)) {
|
||
|
parser.yy.result.colRef.identifierChain = [];
|
||
|
}
|
||
|
}
|
||
|
if (typeof parser.yy.result.suggestKeyValues !== 'undefined' && !parser.yy.result.suggestKeyValues.linked) {
|
||
|
parser.expandIdentifierChain({ wrapper: parser.yy.result.suggestKeyValues });
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.getSubQuery = function (cols) {
|
||
|
var columns = [];
|
||
|
cols.selectList.forEach(function (col) {
|
||
|
var result = {};
|
||
|
if (col.alias) {
|
||
|
result.alias = col.alias;
|
||
|
}
|
||
|
if (col.valueExpression && col.valueExpression.columnReference) {
|
||
|
result.identifierChain = col.valueExpression.columnReference
|
||
|
} else if (col.asterisk) {
|
||
|
result.identifierChain = [{asterisk: true}];
|
||
|
}
|
||
|
if (col.valueExpression && col.valueExpression.types && col.valueExpression.types.length === 1) {
|
||
|
result.type = col.valueExpression.types[0];
|
||
|
}
|
||
|
|
||
|
columns.push(result);
|
||
|
});
|
||
|
|
||
|
return {
|
||
|
columns: columns
|
||
|
};
|
||
|
};
|
||
|
|
||
|
parser.addTablePrimary = function (ref) {
|
||
|
if (typeof parser.yy.latestTablePrimaries === 'undefined') {
|
||
|
parser.yy.latestTablePrimaries = [];
|
||
|
}
|
||
|
parser.yy.latestTablePrimaries.push(ref);
|
||
|
};
|
||
|
|
||
|
parser.suggestFileFormats = function () {
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['AVRO', 'INPUTFORMAT', 'ORC', 'PARQUET', 'RCFILE', 'SEQUENCEFILE', 'TEXTFILE']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['AVRO', 'KUDU', 'ORC', 'PARQUET', 'RCFILE', 'SEQUENCEFILE', 'TEXTFILE']);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.getKeywordsForOptionalsLR = function (optionals, keywords, override) {
|
||
|
var result = [];
|
||
|
|
||
|
for (var i = 0; i < optionals.length; i++) {
|
||
|
if (!optionals[i] && (typeof override === 'undefined' || override[i])) {
|
||
|
if (keywords[i] instanceof Array) {
|
||
|
result = result.concat(keywords[i]);
|
||
|
} else {
|
||
|
result.push(keywords[i]);
|
||
|
}
|
||
|
} else if (optionals[i]) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return result;
|
||
|
};
|
||
|
|
||
|
parser.suggestDdlAndDmlKeywords = function (extraKeywords) {
|
||
|
var keywords = ['ALTER', 'CREATE', 'DESCRIBE', 'DROP', 'GRANT', 'INSERT', 'REVOKE', 'SELECT', 'SET', 'SHOW', 'TRUNCATE', 'UPDATE', 'USE', 'WITH'];
|
||
|
|
||
|
if (extraKeywords) {
|
||
|
keywords = keywords.concat(extraKeywords);
|
||
|
}
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
keywords = keywords.concat(['ABORT', 'ANALYZE TABLE', 'DELETE', 'EXPORT', 'IMPORT', 'LOAD', 'MERGE', 'MSCK', 'RELOAD FUNCTION', 'RESET']);
|
||
|
}
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
keywords = keywords.concat(['COMMENT ON', 'COMPUTE', 'DELETE', 'INVALIDATE METADATA', 'LOAD', 'REFRESH', 'UPSERT']);
|
||
|
}
|
||
|
|
||
|
parser.suggestKeywords(keywords);
|
||
|
};
|
||
|
|
||
|
parser.checkForSelectListKeywords = function (selectList) {
|
||
|
if (selectList.length === 0) {
|
||
|
return;
|
||
|
}
|
||
|
var last = selectList[selectList.length - 1];
|
||
|
if (!last || !last.valueExpression) {
|
||
|
return;
|
||
|
}
|
||
|
var valueExpressionKeywords = parser.getValueExpressionKeywords(last.valueExpression);
|
||
|
var keywords = [];
|
||
|
if (last.suggestKeywords) {
|
||
|
keywords = keywords.concat(last.suggestKeywords);
|
||
|
}
|
||
|
if (valueExpressionKeywords.suggestKeywords) {
|
||
|
keywords = keywords.concat(valueExpressionKeywords.suggestKeywords);
|
||
|
}
|
||
|
if (valueExpressionKeywords.suggestColRefKeywords) {
|
||
|
parser.suggestColRefKeywords(valueExpressionKeywords.suggestColRefKeywords);
|
||
|
parser.addColRefIfExists(last.valueExpression);
|
||
|
}
|
||
|
if (!last.alias) {
|
||
|
keywords.push('AS');
|
||
|
}
|
||
|
if (keywords.length > 0) {
|
||
|
parser.suggestKeywords(keywords);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.checkForKeywords = function (expression) {
|
||
|
if (expression) {
|
||
|
if (expression.suggestKeywords && expression.suggestKeywords.length > 0) {
|
||
|
parser.suggestKeywords(expression.suggestKeywords);
|
||
|
}
|
||
|
if (expression.suggestColRefKeywords) {
|
||
|
parser.suggestColRefKeywords(expression.suggestColRefKeywords);
|
||
|
parser.addColRefIfExists(expression);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.createWeightedKeywords = function (keywords, weight) {
|
||
|
var result = [];
|
||
|
keywords.forEach(function (keyword) {
|
||
|
if (typeof keyword.weight !== 'undefined') {
|
||
|
keyword.weight = weight + (keyword.weight / 10);
|
||
|
result.push(keyword);
|
||
|
} else {
|
||
|
result.push({value: keyword, weight: weight});
|
||
|
}
|
||
|
});
|
||
|
return result;
|
||
|
};
|
||
|
|
||
|
parser.suggestKeywords = function (keywords) {
|
||
|
var weightedKeywords = [];
|
||
|
if (keywords.length == 0) {
|
||
|
return;
|
||
|
}
|
||
|
keywords.forEach(function (keyword) {
|
||
|
if (typeof keyword.weight !== 'undefined') {
|
||
|
weightedKeywords.push(keyword);
|
||
|
} else {
|
||
|
weightedKeywords.push({value: keyword, weight: -1})
|
||
|
}
|
||
|
});
|
||
|
weightedKeywords.sort(function (a, b) {
|
||
|
if (a.weight !== b.weight) {
|
||
|
return b.weight - a.weight;
|
||
|
}
|
||
|
return a.value.localeCompare(b.value);
|
||
|
});
|
||
|
parser.yy.result.suggestKeywords = weightedKeywords;
|
||
|
};
|
||
|
|
||
|
parser.suggestColRefKeywords = function (colRefKeywords) {
|
||
|
parser.yy.result.suggestColRefKeywords = colRefKeywords;
|
||
|
};
|
||
|
|
||
|
parser.suggestTablesOrColumns = function (identifier) {
|
||
|
if (typeof parser.yy.latestTablePrimaries == 'undefined') {
|
||
|
parser.suggestTables({identifierChain: [{name: identifier}]});
|
||
|
return;
|
||
|
}
|
||
|
var tableRef = parser.yy.latestTablePrimaries.filter(function (tablePrimary) {
|
||
|
return equalIgnoreCase(tablePrimary.alias, identifier);
|
||
|
});
|
||
|
if (tableRef.length > 0) {
|
||
|
parser.suggestColumns({identifierChain: [{name: identifier}]});
|
||
|
} else {
|
||
|
parser.suggestTables({identifierChain: [{name: identifier}]});
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.suggestFunctions = function (details) {
|
||
|
parser.yy.result.suggestFunctions = details || {};
|
||
|
};
|
||
|
|
||
|
parser.suggestAggregateFunctions = function () {
|
||
|
var primaries = [];
|
||
|
var aliases = {};
|
||
|
parser.yy.latestTablePrimaries.forEach(function (primary) {
|
||
|
if (typeof primary.alias !== 'undefined') {
|
||
|
aliases[primary.alias] = true;
|
||
|
}
|
||
|
// Drop if the first one refers to a table alias (...FROM tbl t, t.map tm ...)
|
||
|
if (typeof primary.identifierChain !== 'undefined' && !aliases[primary.identifierChain[0].name] && typeof primary.owner === 'undefined') {
|
||
|
primaries.push(primary);
|
||
|
}
|
||
|
});
|
||
|
parser.yy.result.suggestAggregateFunctions = {tablePrimaries: primaries};
|
||
|
};
|
||
|
|
||
|
parser.suggestAnalyticFunctions = function () {
|
||
|
parser.yy.result.suggestAnalyticFunctions = true;
|
||
|
};
|
||
|
|
||
|
parser.suggestSetOptions = function () {
|
||
|
parser.yy.result.suggestSetOptions = true;
|
||
|
};
|
||
|
|
||
|
parser.suggestIdentifiers = function (identifiers) {
|
||
|
parser.yy.result.suggestIdentifiers = identifiers;
|
||
|
};
|
||
|
|
||
|
parser.suggestColumns = function (details) {
|
||
|
if (typeof details === 'undefined') {
|
||
|
details = {identifierChain: []};
|
||
|
} else if (typeof details.identifierChain === 'undefined') {
|
||
|
details.identifierChain = [];
|
||
|
}
|
||
|
parser.yy.result.suggestColumns = details;
|
||
|
};
|
||
|
|
||
|
parser.suggestGroupBys = function (details) {
|
||
|
parser.yy.result.suggestGroupBys = details || {};
|
||
|
};
|
||
|
|
||
|
parser.suggestOrderBys = function (details) {
|
||
|
parser.yy.result.suggestOrderBys = details || {};
|
||
|
};
|
||
|
|
||
|
parser.suggestFilters = function (details) {
|
||
|
parser.yy.result.suggestFilters = details || {};
|
||
|
};
|
||
|
|
||
|
parser.suggestKeyValues = function (details) {
|
||
|
parser.yy.result.suggestKeyValues = details || {};
|
||
|
};
|
||
|
|
||
|
parser.suggestTables = function (details) {
|
||
|
parser.yy.result.suggestTables = details || {};
|
||
|
};
|
||
|
|
||
|
var adjustLocationForCursor = function (location) {
|
||
|
// columns are 0-based and lines not, so add 1 to cols
|
||
|
var newLocation = {
|
||
|
first_line: location.first_line,
|
||
|
last_line: location.last_line,
|
||
|
first_column: location.first_column + 1,
|
||
|
last_column: location.last_column + 1
|
||
|
};
|
||
|
if (parser.yy.cursorFound) {
|
||
|
if (parser.yy.cursorFound.first_line === newLocation.first_line && parser.yy.cursorFound.last_column <= newLocation.first_column) {
|
||
|
var additionalSpace = parser.yy.partialLengths.left + parser.yy.partialLengths.right;
|
||
|
additionalSpace -= parser.yy.partialCursor ? 1 : 3; // For some reason the normal cursor eats 3 positions.
|
||
|
newLocation.first_column = newLocation.first_column + additionalSpace;
|
||
|
newLocation.last_column = newLocation.last_column + additionalSpace;
|
||
|
}
|
||
|
}
|
||
|
return newLocation;
|
||
|
};
|
||
|
|
||
|
parser.addFunctionLocation = function (location, functionName) {
|
||
|
// Remove trailing '(' from location
|
||
|
var adjustedLocation = {
|
||
|
first_line: location.first_line,
|
||
|
last_line: location.last_line,
|
||
|
first_column: location.first_column,
|
||
|
last_column: location.last_column - 1
|
||
|
};
|
||
|
parser.yy.locations.push({
|
||
|
type: 'function',
|
||
|
location: adjustLocationForCursor(adjustedLocation),
|
||
|
function: functionName.toLowerCase()
|
||
|
});
|
||
|
};
|
||
|
|
||
|
parser.addStatementLocation = function (location) {
|
||
|
// Don't report lonely cursor as a statement
|
||
|
if (location.first_line === location.last_line && Math.abs(location.last_column - location.first_column) === 1) {
|
||
|
return;
|
||
|
}
|
||
|
var adjustedLocation;
|
||
|
if (parser.yy.cursorFound && parser.yy.cursorFound.last_line === location.last_line &&
|
||
|
parser.yy.cursorFound.first_column >= location.first_column && parser.yy.cursorFound.last_column <= location.last_column) {
|
||
|
var additionalSpace = parser.yy.partialLengths.left + parser.yy.partialLengths.right;
|
||
|
adjustedLocation = {
|
||
|
first_line: location.first_line,
|
||
|
last_line: location.last_line,
|
||
|
first_column: location.first_column + 1,
|
||
|
last_column: location.last_column + additionalSpace - (parser.yy.partialCursor ? 0 : 2)
|
||
|
}
|
||
|
} else {
|
||
|
adjustedLocation = {
|
||
|
first_line: location.first_line,
|
||
|
last_line: location.last_line,
|
||
|
first_column: location.first_column + 1,
|
||
|
last_column: location.last_column + 1
|
||
|
}
|
||
|
}
|
||
|
|
||
|
parser.yy.locations.push({
|
||
|
type: 'statement',
|
||
|
location: adjustedLocation
|
||
|
});
|
||
|
};
|
||
|
|
||
|
parser.firstDefined = function () {
|
||
|
for (var i = 0; i + 1 < arguments.length; i += 2) {
|
||
|
if (arguments[i]) {
|
||
|
return arguments[i + 1];
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.addClauseLocation = function (type, precedingLocation, locationIfPresent, isCursor) {
|
||
|
var location;
|
||
|
if (isCursor) {
|
||
|
if (parser.yy.partialLengths.left === 0 && parser.yy.partialLengths.right === 0) {
|
||
|
location = {
|
||
|
type: type,
|
||
|
missing: true,
|
||
|
location: adjustLocationForCursor({
|
||
|
first_line: precedingLocation.last_line,
|
||
|
first_column: precedingLocation.last_column,
|
||
|
last_line: precedingLocation.last_line,
|
||
|
last_column: precedingLocation.last_column
|
||
|
})
|
||
|
}
|
||
|
} else {
|
||
|
location = {
|
||
|
type: type,
|
||
|
missing: false,
|
||
|
location: {
|
||
|
first_line: locationIfPresent.last_line,
|
||
|
first_column: locationIfPresent.last_column - 1,
|
||
|
last_line: locationIfPresent.last_line,
|
||
|
last_column: locationIfPresent.last_column - 1 + parser.yy.partialLengths.right + parser.yy.partialLengths.left
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
location = {
|
||
|
type: type,
|
||
|
missing: !locationIfPresent,
|
||
|
location: adjustLocationForCursor(locationIfPresent || {
|
||
|
first_line: precedingLocation.last_line,
|
||
|
first_column: precedingLocation.last_column,
|
||
|
last_line: precedingLocation.last_line,
|
||
|
last_column: precedingLocation.last_column
|
||
|
})
|
||
|
};
|
||
|
}
|
||
|
if (parser.isInSubquery()) {
|
||
|
location.subquery = true;
|
||
|
}
|
||
|
parser.yy.locations.push(location)
|
||
|
};
|
||
|
|
||
|
parser.addStatementTypeLocation = function (identifier, location, additionalText) {
|
||
|
if (!parser.isImpala()) {
|
||
|
return;
|
||
|
}
|
||
|
var loc = {
|
||
|
type: 'statementType',
|
||
|
location: adjustLocationForCursor(location),
|
||
|
identifier: identifier
|
||
|
};
|
||
|
if (typeof additionalText !== 'undefined') {
|
||
|
switch (identifier) {
|
||
|
case 'ALTER':
|
||
|
if (/ALTER\s+VIEW/i.test(additionalText)) {
|
||
|
loc.identifier = 'ALTER VIEW';
|
||
|
} else {
|
||
|
loc.identifier = 'ALTER TABLE';
|
||
|
}
|
||
|
break;
|
||
|
case 'COMPUTE':
|
||
|
loc.identifier = 'COMPUTE STATS';
|
||
|
break;
|
||
|
case 'CREATE':
|
||
|
if (/CREATE\s+VIEW/i.test(additionalText)) {
|
||
|
loc.identifier = 'CREATE VIEW';
|
||
|
} else if (/CREATE\s+TABLE/i.test(additionalText)) {
|
||
|
loc.identifier = 'CREATE TABLE';
|
||
|
} else if (/CREATE\s+DATABASE/i.test(additionalText)) {
|
||
|
loc.identifier = 'CREATE DATABASE';
|
||
|
} else if (/CREATE\s+ROLE/i.test(additionalText)) {
|
||
|
loc.identifier = 'CREATE ROLE';
|
||
|
} else if (/CREATE\s+FUNCTION/i.test(additionalText)) {
|
||
|
loc.identifier = 'CREATE FUNCTION';
|
||
|
} else {
|
||
|
loc.identifier = 'CREATE TABLE';
|
||
|
}
|
||
|
break;
|
||
|
case 'DROP':
|
||
|
if (/DROP\s+VIEW/i.test(additionalText)) {
|
||
|
loc.identifier = 'DROP VIEW';
|
||
|
} else if (/DROP\s+TABLE/i.test(additionalText)) {
|
||
|
loc.identifier = 'DROP TABLE';
|
||
|
} else if (/DROP\s+DATABASE/i.test(additionalText)) {
|
||
|
loc.identifier = 'DROP DATABASE';
|
||
|
} else if (/DROP\s+ROLE/i.test(additionalText)) {
|
||
|
loc.identifier = 'DROP ROLE';
|
||
|
} else if (/DROP\s+STATS/i.test(additionalText)) {
|
||
|
loc.identifier = 'DROP STATS';
|
||
|
} else if (/DROP\s+FUNCTION/i.test(additionalText)) {
|
||
|
loc.identifier = 'DROP FUNCTION';
|
||
|
} else {
|
||
|
loc.identifier = 'DROP TABLE';
|
||
|
}
|
||
|
break;
|
||
|
case 'INVALIDATE':
|
||
|
loc.identifier = 'INVALIDATE METADATA';
|
||
|
break;
|
||
|
case 'LOAD':
|
||
|
loc.identifier = 'LOAD DATA';
|
||
|
break;
|
||
|
case 'TRUNCATE':
|
||
|
loc.identifier = 'TRUNCATE TABLE';
|
||
|
break;
|
||
|
default:
|
||
|
}
|
||
|
}
|
||
|
parser.yy.locations.push(loc);
|
||
|
};
|
||
|
|
||
|
parser.addFileLocation = function (location, path) {
|
||
|
parser.yy.locations.push({
|
||
|
type: 'file',
|
||
|
location: adjustLocationForCursor(location),
|
||
|
path: path
|
||
|
});
|
||
|
};
|
||
|
|
||
|
parser.addDatabaseLocation = function (location, identifierChain) {
|
||
|
parser.yy.locations.push({
|
||
|
type: 'database',
|
||
|
location: adjustLocationForCursor(location),
|
||
|
identifierChain: identifierChain
|
||
|
});
|
||
|
};
|
||
|
|
||
|
parser.addTableLocation = function (location, identifierChain) {
|
||
|
parser.yy.locations.push({
|
||
|
type: 'table',
|
||
|
location: adjustLocationForCursor(location),
|
||
|
identifierChain: identifierChain
|
||
|
});
|
||
|
};
|
||
|
|
||
|
parser.addColumnAliasLocation = function (location, alias, parentLocation) {
|
||
|
var aliasLocation = {
|
||
|
type: 'alias',
|
||
|
source: 'column',
|
||
|
alias: alias,
|
||
|
location: adjustLocationForCursor(location),
|
||
|
parentLocation: adjustLocationForCursor(parentLocation)
|
||
|
};
|
||
|
if (parser.yy.locations.length && parser.yy.locations[parser.yy.locations.length - 1].type === 'column') {
|
||
|
var closestColumn = parser.yy.locations[parser.yy.locations.length - 1];
|
||
|
if (closestColumn.location.first_line === aliasLocation.parentLocation.first_line &&
|
||
|
closestColumn.location.last_line === aliasLocation.parentLocation.last_line &&
|
||
|
closestColumn.location.first_column === aliasLocation.parentLocation.first_column &&
|
||
|
closestColumn.location.last_column === aliasLocation.parentLocation.last_column) {
|
||
|
parser.yy.locations[parser.yy.locations.length - 1].alias = alias;
|
||
|
}
|
||
|
}
|
||
|
parser.yy.locations.push(aliasLocation);
|
||
|
};
|
||
|
|
||
|
parser.addTableAliasLocation = function (location, alias, identifierChain) {
|
||
|
parser.yy.locations.push({
|
||
|
type: 'alias',
|
||
|
source: 'table',
|
||
|
alias: alias,
|
||
|
location: adjustLocationForCursor(location),
|
||
|
identifierChain: identifierChain
|
||
|
});
|
||
|
};
|
||
|
|
||
|
parser.addSubqueryAliasLocation = function (location, alias) {
|
||
|
parser.yy.locations.push({
|
||
|
type: 'alias',
|
||
|
source: 'subquery',
|
||
|
alias: alias,
|
||
|
location: adjustLocationForCursor(location)
|
||
|
});
|
||
|
};
|
||
|
|
||
|
parser.addAsteriskLocation = function (location, identifierChain) {
|
||
|
parser.yy.locations.push({
|
||
|
type: 'asterisk',
|
||
|
location: adjustLocationForCursor(location),
|
||
|
identifierChain: identifierChain
|
||
|
});
|
||
|
};
|
||
|
|
||
|
parser.addVariableLocation = function (location, value) {
|
||
|
if (/\$\{[^}]*\}/.test(value)) {
|
||
|
parser.yy.locations.push({
|
||
|
type: 'variable',
|
||
|
location: adjustLocationForCursor(location),
|
||
|
value: value
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.addColumnLocation = function (location, identifierChain) {
|
||
|
var isVariable = identifierChain.length && /\$\{[^}]*\}/.test(identifierChain[identifierChain.length - 1].name);
|
||
|
if (isVariable) {
|
||
|
parser.yy.locations.push({
|
||
|
type: 'variable',
|
||
|
location: adjustLocationForCursor(location),
|
||
|
value: identifierChain[identifierChain.length - 1].name
|
||
|
});
|
||
|
} else {
|
||
|
parser.yy.locations.push({
|
||
|
type: 'column',
|
||
|
location: adjustLocationForCursor(location),
|
||
|
identifierChain: identifierChain,
|
||
|
qualified: identifierChain.length > 1
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.addCteAliasLocation = function (location, alias) {
|
||
|
parser.yy.locations.push({
|
||
|
type: 'alias',
|
||
|
source: 'cte',
|
||
|
alias: alias,
|
||
|
location: adjustLocationForCursor(location)
|
||
|
});
|
||
|
};
|
||
|
|
||
|
parser.addUnknownLocation = function (location, identifierChain) {
|
||
|
var isVariable = identifierChain.length && /\$\{[^}]*\}/.test(identifierChain[identifierChain.length - 1].name);
|
||
|
var loc;
|
||
|
if (isVariable) {
|
||
|
loc = {
|
||
|
type: 'variable',
|
||
|
location: adjustLocationForCursor(location),
|
||
|
value: identifierChain[identifierChain.length - 1].name
|
||
|
};
|
||
|
} else {
|
||
|
loc = {
|
||
|
type: 'unknown',
|
||
|
location: adjustLocationForCursor(location),
|
||
|
identifierChain: identifierChain,
|
||
|
qualified: identifierChain.length > 1
|
||
|
};
|
||
|
}
|
||
|
parser.yy.locations.push(loc);
|
||
|
return loc;
|
||
|
};
|
||
|
|
||
|
parser.addColRefToVariableIfExists = function (left, right) {
|
||
|
if (left && left.columnReference && left.columnReference.length && right && right.columnReference && right.columnReference.length && parser.yy.locations.length > 1) {
|
||
|
var addColRefToVariableLocation = function (variableValue, colRef) {
|
||
|
// See if colref is actually an alias
|
||
|
if (colRef.length === 1 && colRef[0].name) {
|
||
|
parser.yy.locations.some(function (location) {
|
||
|
if (location.type === 'column' && location.alias === colRef[0].name) {
|
||
|
colRef = location.identifierChain;
|
||
|
return true;
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
for (var i = parser.yy.locations.length - 1; i > 0; i--) {
|
||
|
var location = parser.yy.locations[i];
|
||
|
if (location.type === 'variable' && location.value === variableValue) {
|
||
|
location.colRef = { identifierChain: colRef };
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
if (/\$\{[^}]*\}/.test(left.columnReference[0].name)) {
|
||
|
// left is variable
|
||
|
addColRefToVariableLocation(left.columnReference[0].name, right.columnReference);
|
||
|
} else if (/\$\{[^}]*\}/.test(right.columnReference[0].name)) {
|
||
|
// right is variable
|
||
|
addColRefToVariableLocation(right.columnReference[0].name, left.columnReference);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.suggestDatabases = function (details) {
|
||
|
parser.yy.result.suggestDatabases = details || {};
|
||
|
};
|
||
|
|
||
|
parser.suggestHdfs = function (details) {
|
||
|
parser.yy.result.suggestHdfs = details || {};
|
||
|
};
|
||
|
|
||
|
parser.suggestValues = function (details) {
|
||
|
parser.yy.result.suggestValues = details || {};
|
||
|
};
|
||
|
|
||
|
parser.determineCase = function (text) {
|
||
|
if (!parser.yy.caseDetermined) {
|
||
|
parser.yy.lowerCase = text.toLowerCase() === text;
|
||
|
parser.yy.caseDetermined = true;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.handleQuotedValueWithCursor = function (lexer, yytext, yylloc, quoteChar) {
|
||
|
if (yytext.indexOf('\u2020') !== -1 || yytext.indexOf('\u2021') !== -1) {
|
||
|
parser.yy.partialCursor = yytext.indexOf('\u2021') !== -1;
|
||
|
var cursorIndex = parser.yy.partialCursor ? yytext.indexOf('\u2021') : yytext.indexOf('\u2020');
|
||
|
parser.yy.cursorFound = {
|
||
|
first_line: yylloc.first_line,
|
||
|
last_line: yylloc.last_line,
|
||
|
first_column: yylloc.first_column + cursorIndex,
|
||
|
last_column: yylloc.first_column + cursorIndex + 1
|
||
|
};
|
||
|
var remainder = yytext.substring(cursorIndex + 1);
|
||
|
var remainingQuotes = (lexer.upcomingInput().match(new RegExp(quoteChar, 'g')) || []).length;
|
||
|
if (remainingQuotes > 0 && remainingQuotes & 1 != 0) {
|
||
|
parser.yy.missingEndQuote = false;
|
||
|
lexer.input();
|
||
|
} else {
|
||
|
parser.yy.missingEndQuote = true;
|
||
|
lexer.unput(remainder);
|
||
|
}
|
||
|
lexer.popState();
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
|
||
|
var lexerModified = false;
|
||
|
|
||
|
/**
|
||
|
* Main parser function
|
||
|
*/
|
||
|
parser.parseSql = function (beforeCursor, afterCursor, dialect, debug) {
|
||
|
// Jison counts CRLF as two lines in the locations
|
||
|
beforeCursor = beforeCursor.replace(/\r\n|\n\r/gm, '\n');
|
||
|
afterCursor = afterCursor.replace(/\r\n|\n\r/gm, '\n');
|
||
|
parser.yy.result = {locations: []};
|
||
|
parser.yy.lowerCase = false;
|
||
|
parser.yy.locations = [];
|
||
|
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;
|
||
|
delete parser.yy.partialCursor;
|
||
|
|
||
|
parser.prepareNewStatement();
|
||
|
|
||
|
var REASONABLE_SURROUNDING_LENGTH = 150000; // About 3000 lines before and after
|
||
|
|
||
|
if (beforeCursor.length > REASONABLE_SURROUNDING_LENGTH) {
|
||
|
if ((beforeCursor.length - beforeCursor.lastIndexOf(';')) > REASONABLE_SURROUNDING_LENGTH) {
|
||
|
// Bail out if the last complete statement is more than 150000 chars before
|
||
|
return {};
|
||
|
}
|
||
|
// Cut it at the first statement found within 150000 chars before
|
||
|
var lastReasonableChunk = beforeCursor.substring(beforeCursor.length - REASONABLE_SURROUNDING_LENGTH);
|
||
|
beforeCursor = lastReasonableChunk.substring(lastReasonableChunk.indexOf(';') + 1);
|
||
|
}
|
||
|
|
||
|
if (afterCursor.length > REASONABLE_SURROUNDING_LENGTH) {
|
||
|
if ((afterCursor.length - afterCursor.indexOf(';')) > REASONABLE_SURROUNDING_LENGTH) {
|
||
|
// No need to bail out for what's comes after, we can still get keyword completion
|
||
|
afterCursor = '';
|
||
|
} else {
|
||
|
// Cut it at the last statement found within 150000 chars after
|
||
|
var firstReasonableChunk = afterCursor.substring(0, REASONABLE_SURROUNDING_LENGTH);
|
||
|
afterCursor = firstReasonableChunk.substring(0, firstReasonableChunk.lastIndexOf(';'));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
parser.yy.partialLengths = parser.identifyPartials(beforeCursor, afterCursor);
|
||
|
|
||
|
if (parser.yy.partialLengths.left > 0) {
|
||
|
beforeCursor = beforeCursor.substring(0, beforeCursor.length - parser.yy.partialLengths.left);
|
||
|
}
|
||
|
|
||
|
if (parser.yy.partialLengths.right > 0) {
|
||
|
afterCursor = afterCursor.substring(parser.yy.partialLengths.right);
|
||
|
}
|
||
|
|
||
|
parser.yy.activeDialect = (dialect !== 'hive' && dialect !== 'impala') ? undefined : dialect;
|
||
|
|
||
|
// Hack to set the inital state of the lexer without first having to hit a token
|
||
|
// has to be done as the first token found can be dependant on dialect
|
||
|
if (!lexerModified) {
|
||
|
var originalSetInput = parser.lexer.setInput;
|
||
|
parser.lexer.setInput = function (input, yy) {
|
||
|
var lexer = originalSetInput.bind(parser.lexer)(input, yy);
|
||
|
if (typeof parser.yy.activeDialect !== 'undefined') {
|
||
|
lexer.begin(parser.yy.activeDialect);
|
||
|
}
|
||
|
return lexer;
|
||
|
};
|
||
|
lexerModified = true;
|
||
|
}
|
||
|
|
||
|
var result;
|
||
|
try {
|
||
|
// Add |CURSOR| or |PARTIAL_CURSOR| to represent the different cursor states in the lexer
|
||
|
result = parser.parse(beforeCursor + (beforeCursor.length == 0 || /[\s\(]$$/.test(beforeCursor) ? ' \u2020 ' : '\u2021') + afterCursor);
|
||
|
} catch (err) {
|
||
|
// On any error try to at least return any existing result
|
||
|
if (typeof parser.yy.result === 'undefined') {
|
||
|
throw err;
|
||
|
}
|
||
|
if (debug) {
|
||
|
console.log(err);
|
||
|
console.error(err.stack);
|
||
|
}
|
||
|
result = parser.yy.result;
|
||
|
}
|
||
|
if (parser.yy.errors.length > 0) {
|
||
|
parser.yy.result.errors = parser.yy.errors;
|
||
|
if (debug) {
|
||
|
console.log(parser.yy.errors);
|
||
|
}
|
||
|
}
|
||
|
try {
|
||
|
linkTablePrimaries();
|
||
|
parser.commitLocations();
|
||
|
// Clean up and prioritize
|
||
|
prioritizeSuggestions();
|
||
|
} catch (err) {
|
||
|
if (debug) {
|
||
|
console.log(err);
|
||
|
console.error(err.stack);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
parser.yy.allLocations.sort(function (a, b) {
|
||
|
if (a.location.first_line !== b.location.first_line) {
|
||
|
return a.location.first_line - b.location.first_line;
|
||
|
}
|
||
|
if (a.location.first_column !== b.location.first_column) {
|
||
|
return a.location.first_column - b.location.first_column;
|
||
|
}
|
||
|
if (a.location.last_column !== b.location.last_column) {
|
||
|
return b.location.last_column - a.location.last_column;
|
||
|
}
|
||
|
return b.type.localeCompare(a.type);
|
||
|
});
|
||
|
parser.yy.result.locations = parser.yy.allLocations;
|
||
|
|
||
|
parser.yy.result.locations.forEach(function (location) {
|
||
|
delete location.linked;
|
||
|
});
|
||
|
if (typeof parser.yy.result.suggestColumns !== 'undefined') {
|
||
|
delete parser.yy.result.suggestColumns.linked;
|
||
|
}
|
||
|
|
||
|
SIMPLE_TABLE_REF_SUGGESTIONS.forEach(function (suggestionType) {
|
||
|
if (typeof parser.yy.result[suggestionType] !== 'undefined') {
|
||
|
delete parser.yy.result[suggestionType].linked;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
if (typeof parser.yy.result.colRef !== 'undefined') {
|
||
|
delete parser.yy.result.colRef.linked;
|
||
|
}
|
||
|
if (typeof parser.yy.result.suggestKeyValues !== 'undefined') {
|
||
|
delete parser.yy.result.suggestKeyValues.linked;
|
||
|
}
|
||
|
|
||
|
if (typeof result.error !== 'undefined' && typeof result.error.expected !== 'undefined') {
|
||
|
// Remove any expected tokens from other dialects, jison doesn't remove tokens from other lexer states.
|
||
|
var actualExpected = {};
|
||
|
result.error.expected.forEach(function (expected) {
|
||
|
var match = expected.match(/\<([a-z]+)\>(.*)/);
|
||
|
if (match !== null) {
|
||
|
if (typeof parser.yy.activeDialect !== 'undefined' && parser.yy.activeDialect === match[1]) {
|
||
|
actualExpected[("'" + match[2])] = true;
|
||
|
}
|
||
|
} else if (expected.indexOf('CURSOR') == -1) {
|
||
|
actualExpected[expected] = true;
|
||
|
}
|
||
|
});
|
||
|
result.error.expected = Object.keys(actualExpected);
|
||
|
}
|
||
|
|
||
|
if (typeof result.error !== 'undefined' && result.error.recoverable) {
|
||
|
delete result.error;
|
||
|
}
|
||
|
|
||
|
// Adjust all the statement locations to include white space surrounding them
|
||
|
var lastStatementLocation = null;
|
||
|
result.locations.forEach(function (location) {
|
||
|
if (location.type === 'statement') {
|
||
|
if (lastStatementLocation === null) {
|
||
|
location.location.first_line = 1;
|
||
|
location.location.first_column = 1;
|
||
|
} else {
|
||
|
location.location.first_line = lastStatementLocation.location.last_line;
|
||
|
location.location.first_column = lastStatementLocation.location.last_column + 1;
|
||
|
}
|
||
|
lastStatementLocation = location;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
return result;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
var SYNTAX_PARSER_NOOP_FUNCTIONS = ['prepareNewStatement', 'addCommonTableExpressions', 'pushQueryState', 'popQueryState', 'suggestSelectListAliases',
|
||
|
'suggestValueExpressionKeywords', 'getSelectListKeywords', 'getValueExpressionKeywords', 'addColRefIfExists', 'selectListNoTableSuggest', 'suggestJoinConditions',
|
||
|
'suggestJoins', 'valueExpressionSuggest', 'applyTypeToSuggestions', 'applyArgumentTypesToSuggestions', 'commitLocations', 'identifyPartials',
|
||
|
'getSubQuery', 'addTablePrimary', 'suggestFileFormats', 'suggestDdlAndDmlKeywords', 'checkForSelectListKeywords', 'checkForKeywords',
|
||
|
'suggestKeywords', 'suggestColRefKeywords', 'suggestTablesOrColumns', 'suggestFunctions', 'suggestAggregateFunctions', 'suggestAnalyticFunctions',
|
||
|
'suggestColumns', 'suggestGroupBys', 'suggestIdentifiers', 'suggestOrderBys', 'suggestFilters', 'suggestKeyValues', 'suggestTables', 'addFunctionLocation',
|
||
|
'addStatementLocation', 'firstDefined', 'addClauseLocation', 'addStatementTypeLocation', 'addFileLocation', 'addDatabaseLocation', 'addColumnAliasLocation',
|
||
|
'addTableAliasLocation', 'addSubqueryAliasLocation', 'addTableLocation', 'addAsteriskLocation', 'addVariableLocation', 'addColumnLocation', 'addCteAliasLocation',
|
||
|
'addUnknownLocation', 'addColRefToVariableIfExists', 'suggestDatabases', 'suggestHdfs', 'suggestValues'];
|
||
|
|
||
|
var SYNTAX_PARSER_NOOP = function () {};
|
||
|
|
||
|
var initSyntaxParser = function (parser) {
|
||
|
|
||
|
// Noop functions for compatibility with the autocomplete parser as the grammar is shared
|
||
|
SYNTAX_PARSER_NOOP_FUNCTIONS.forEach(function (noopFn) {
|
||
|
parser[noopFn] = SYNTAX_PARSER_NOOP
|
||
|
});
|
||
|
|
||
|
parser.yy.locations = [{}];
|
||
|
|
||
|
parser.determineCase = function (text) {
|
||
|
if (!parser.yy.caseDetermined) {
|
||
|
parser.yy.lowerCase = text.toLowerCase() === text;
|
||
|
parser.yy.caseDetermined = true;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
parser.getKeywordsForOptionalsLR = function () {
|
||
|
return [];
|
||
|
};
|
||
|
|
||
|
parser.mergeSuggestKeywords = function () {
|
||
|
return {};
|
||
|
};
|
||
|
|
||
|
parser.getTypeKeywords = function () {
|
||
|
return [];
|
||
|
};
|
||
|
|
||
|
parser.getColumnDataTypeKeywords = function () {
|
||
|
return [];
|
||
|
};
|
||
|
|
||
|
parser.findCaseType = function () {
|
||
|
return {types: ['T']};
|
||
|
};
|
||
|
|
||
|
parser.findReturnTypes = function (functionName) {
|
||
|
return ['T'];
|
||
|
};
|
||
|
|
||
|
parser.isHive = function () {
|
||
|
return parser.yy.activeDialect === 'hive';
|
||
|
};
|
||
|
|
||
|
parser.isImpala = function () {
|
||
|
return parser.yy.activeDialect === 'impala';
|
||
|
};
|
||
|
|
||
|
parser.expandImpalaIdentifierChain = function () {
|
||
|
return [];
|
||
|
};
|
||
|
|
||
|
parser.expandIdentifierChain = function () {
|
||
|
return [];
|
||
|
};
|
||
|
|
||
|
parser.expandLateralViews = function () {
|
||
|
return [];
|
||
|
};
|
||
|
|
||
|
parser.createWeightedKeywords = function () {
|
||
|
return [];
|
||
|
};
|
||
|
|
||
|
parser.handleQuotedValueWithCursor = function (lexer, yytext, yylloc, quoteChar) {
|
||
|
if (yytext.indexOf('\u2020') !== -1 || yytext.indexOf('\u2021') !== -1) {
|
||
|
parser.yy.partialCursor = yytext.indexOf('\u2021') !== -1;
|
||
|
var cursorIndex = parser.yy.partialCursor ? yytext.indexOf('\u2021') : yytext.indexOf('\u2020');
|
||
|
parser.yy.cursorFound = {
|
||
|
first_line: yylloc.first_line,
|
||
|
last_line: yylloc.last_line,
|
||
|
first_column: yylloc.first_column + cursorIndex,
|
||
|
last_column: yylloc.first_column + cursorIndex + 1
|
||
|
};
|
||
|
var remainder = yytext.substring(cursorIndex + 1);
|
||
|
var remainingQuotes = (lexer.upcomingInput().match(new RegExp(quoteChar, 'g')) || []).length;
|
||
|
if (remainingQuotes > 0 && remainingQuotes & 1 != 0) {
|
||
|
parser.yy.missingEndQuote = false;
|
||
|
lexer.input();
|
||
|
} else {
|
||
|
parser.yy.missingEndQuote = true;
|
||
|
lexer.unput(remainder);
|
||
|
}
|
||
|
lexer.popState();
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
|
||
|
var lexerModified = false;
|
||
|
|
||
|
parser.yy.parseError = function (str, hash) {
|
||
|
parser.yy.error = hash;
|
||
|
};
|
||
|
|
||
|
var IGNORED_EXPECTED = {
|
||
|
';': true,
|
||
|
'.': true,
|
||
|
'EOF': true,
|
||
|
'UNSIGNED_INTEGER': true,
|
||
|
'UNSIGNED_INTEGER_E': true,
|
||
|
'REGULAR_IDENTIFIER': true, // TODO: Indicate that an identifier was expected
|
||
|
'CURSOR': true,
|
||
|
'PARTIAL_CURSOR': true,
|
||
|
'HDFS_START_QUOTE': true,
|
||
|
'HDFS_PATH': true,
|
||
|
'HDFS_END_QUOTE' : true,
|
||
|
'COMPARISON_OPERATOR': true, // TODO: Expand in results when found
|
||
|
'ARITHMETIC_OPERATOR' : true, // TODO: Expand in results when found
|
||
|
'VARIABLE_REFERENCE': true,
|
||
|
'BACKTICK': true,
|
||
|
'VALUE': true,
|
||
|
'PARTIAL_VALUE': true,
|
||
|
'SINGLE_QUOTE': true,
|
||
|
'DOUBLE_QUOTE': true
|
||
|
};
|
||
|
|
||
|
var CLEAN_EXPECTED = {
|
||
|
'BETWEEN_AND': 'AND',
|
||
|
'OVERWRITE_DIRECTORY' : 'OVERWRITE',
|
||
|
'STORED_AS_DIRECTORIES' : 'STORED',
|
||
|
'LIKE_PARQUET' : 'LIKE',
|
||
|
'PARTITION_VALUE' : 'PARTITION'
|
||
|
};
|
||
|
|
||
|
parser.parseSyntax = function (beforeCursor, afterCursor, dialect, debug) {
|
||
|
parser.yy.caseDetermined = false;
|
||
|
parser.yy.error = undefined;
|
||
|
|
||
|
parser.yy.latestTablePrimaries = [];
|
||
|
parser.yy.subQueries = [];
|
||
|
parser.yy.selectListAliases = [];
|
||
|
parser.yy.latestTablePrimaries = [];
|
||
|
|
||
|
parser.yy.activeDialect = (dialect !== 'hive' && dialect !== 'impala') ? undefined : dialect;
|
||
|
|
||
|
// Hack to set the inital state of the lexer without first having to hit a token
|
||
|
// has to be done as the first token found can be dependant on dialect
|
||
|
if (!lexerModified) {
|
||
|
var originalSetInput = parser.lexer.setInput;
|
||
|
parser.lexer.setInput = function (input, yy) {
|
||
|
var lexer = originalSetInput.bind(parser.lexer)(input, yy);
|
||
|
if (typeof parser.yy.activeDialect !== 'undefined') {
|
||
|
lexer.begin(parser.yy.activeDialect);
|
||
|
}
|
||
|
return lexer;
|
||
|
};
|
||
|
lexerModified = true;
|
||
|
}
|
||
|
|
||
|
// TODO: Find a way around throwing an exception when the parser finds a syntax error
|
||
|
try {
|
||
|
parser.yy.error = false;
|
||
|
parser.parse(beforeCursor + afterCursor);
|
||
|
} catch (err) {
|
||
|
if (debug) {
|
||
|
console.log(err);
|
||
|
console.error(err.stack);
|
||
|
console.log(parser.yy.error);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (parser.yy.error && (parser.yy.error.loc.last_column < beforeCursor.length || !beforeCursor.endsWith(parser.yy.error.text))) {
|
||
|
var weightedExpected = [];
|
||
|
|
||
|
var addedExpected = {};
|
||
|
|
||
|
var isLowerCase = parser.yy.caseDetermined && parser.yy.lowerCase || parser.yy.error.text.toLowerCase() === parser.yy.error.text;
|
||
|
|
||
|
if (parser.yy.error.expected.length == 2 && parser.yy.error.expected.indexOf('\';\'') !== -1 && parser.yy.error.expected.indexOf('\'EOF\'') !== -1) {
|
||
|
parser.yy.error.expected = [];
|
||
|
parser.yy.error.expectedStatementEnd = true;
|
||
|
return parser.yy.error;
|
||
|
}
|
||
|
for (var i = 0; i < parser.yy.error.expected.length; i++) {
|
||
|
var expected = parser.yy.error.expected[i];
|
||
|
// Strip away the surrounding ' chars
|
||
|
expected = expected.substring(1, expected.length - 1);
|
||
|
// TODO: Only suggest alphanumeric?
|
||
|
if (!IGNORED_EXPECTED[expected] && /[a-z_]+/i.test(expected)) {
|
||
|
if (dialect && expected.indexOf('<' + dialect + '>') == 0) {
|
||
|
expected = expected.substring(dialect.length + 2);
|
||
|
} else if (/^<[a-z]+>/.test(expected)) {
|
||
|
continue;
|
||
|
}
|
||
|
expected = CLEAN_EXPECTED[expected] || expected;
|
||
|
if (expected === parser.yy.error.text.toUpperCase()) {
|
||
|
// Can happen when the lexer entry for a rule contains multiple words like 'stored' in 'stored as parquet'
|
||
|
return false;
|
||
|
}
|
||
|
var text = isLowerCase ? expected.toLowerCase() : expected;
|
||
|
if (text && !addedExpected[text]) {
|
||
|
addedExpected[text] = true;
|
||
|
weightedExpected.push({
|
||
|
text: text,
|
||
|
distance: stringDistance(parser.yy.error.text, text, true)
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (weightedExpected.length === 0) {
|
||
|
parser.yy.error.expected = [];
|
||
|
parser.yy.error.incompleteStatement = true;
|
||
|
return parser.yy.error;
|
||
|
}
|
||
|
weightedExpected.sort(function (a, b) {
|
||
|
if (a.distance === b.distance) {
|
||
|
return a.text.localeCompare(b.text);
|
||
|
}
|
||
|
return a.distance - b.distance
|
||
|
});
|
||
|
parser.yy.error.expected = weightedExpected;
|
||
|
parser.yy.error.incompleteStatement = true;
|
||
|
return parser.yy.error;
|
||
|
} else if (parser.yy.error) {
|
||
|
parser.yy.error.expected = [];
|
||
|
parser.yy.error.incompleteStatement = true;
|
||
|
return parser.yy.error;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var initGlobalSearchParser = function (parser) {
|
||
|
|
||
|
parser.identifyPartials = function (beforeCursor, afterCursor) {
|
||
|
var beforeMatch = beforeCursor.match(/[0-9a-zA-Z_]*$/);
|
||
|
var afterMatch = afterCursor.match(/^[0-9a-zA-Z_]*(?:\((?:[^)]*\))?)?/);
|
||
|
return {left: beforeMatch ? beforeMatch[0].length : 0, right: afterMatch ? afterMatch[0].length : 0};
|
||
|
};
|
||
|
|
||
|
parser.mergeFacets = function (a, b) {
|
||
|
if (!a.facets) {
|
||
|
a.facets = {};
|
||
|
}
|
||
|
if (!b.facets) {
|
||
|
return;
|
||
|
}
|
||
|
Object.keys(b.facets).forEach(function (key) {
|
||
|
if (a.facets[key]) {
|
||
|
Object.keys(b.facets[key]).forEach(function (val) {
|
||
|
a.facets[key][val.toLowerCase()] = true;
|
||
|
});
|
||
|
} else {
|
||
|
a.facets[key] = b.facets[key];
|
||
|
}
|
||
|
});
|
||
|
};
|
||
|
|
||
|
parser.mergeText = function (a, b) {
|
||
|
if (!a.text) {
|
||
|
a.text = [];
|
||
|
}
|
||
|
if (!b.text) {
|
||
|
return;
|
||
|
}
|
||
|
a.text = a.text.concat(b.text);
|
||
|
};
|
||
|
|
||
|
parser.handleQuotedValueWithCursor = function (lexer, yytext, yylloc, quoteChar) {
|
||
|
if (yytext.indexOf('\u2020') !== -1 || yytext.indexOf('\u2021') !== -1) {
|
||
|
var cursorIndex = yytext.indexOf('\u2020');
|
||
|
parser.yy.cursorFound = {
|
||
|
first_line: yylloc.first_line,
|
||
|
last_line: yylloc.last_line,
|
||
|
first_column: yylloc.first_column + cursorIndex,
|
||
|
last_column: yylloc.first_column + cursorIndex + 1
|
||
|
};
|
||
|
var remainder = yytext.substring(cursorIndex + 1);
|
||
|
var remainingQuotes = (lexer.upcomingInput().match(new RegExp(quoteChar, 'g')) || []).length;
|
||
|
if (remainingQuotes > 0 && remainingQuotes & 1 != 0) {
|
||
|
parser.yy.missingEndQuote = false;
|
||
|
lexer.input();
|
||
|
} else {
|
||
|
parser.yy.missingEndQuote = true;
|
||
|
lexer.unput(remainder);
|
||
|
}
|
||
|
lexer.popState();
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
|
||
|
parser.parseGlobalSearch = function (beforeCursor, afterCursor, debug) {
|
||
|
delete parser.yy.cursorFound;
|
||
|
|
||
|
var result;
|
||
|
try {
|
||
|
result = parser.parse(beforeCursor + '\u2020' + afterCursor);
|
||
|
} catch (err) {
|
||
|
if (debug) {
|
||
|
console.log(err);
|
||
|
console.error(err.stack);
|
||
|
console.log(parser.yy.error);
|
||
|
}
|
||
|
return {
|
||
|
facets: {},
|
||
|
text: []
|
||
|
}
|
||
|
}
|
||
|
return result;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
return {
|
||
|
initSqlParser: initSqlParser,
|
||
|
initSyntaxParser: initSyntaxParser,
|
||
|
stringDistance: stringDistance,
|
||
|
initGlobalSearchParser: initGlobalSearchParser
|
||
|
};
|
||
|
})();
|
||
|
/* parser generated by jison 0.4.18 */
|
||
|
/*
|
||
|
Returns a Parser object of the following structure:
|
||
|
|
||
|
Parser: {
|
||
|
yy: {}
|
||
|
}
|
||
|
|
||
|
Parser.prototype: {
|
||
|
yy: {},
|
||
|
trace: function(),
|
||
|
symbols_: {associative list: name ==> number},
|
||
|
terminals_: {associative list: number ==> name},
|
||
|
productions_: [...],
|
||
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
|
||
|
table: [...],
|
||
|
defaultActions: {...},
|
||
|
parseError: function(str, hash),
|
||
|
parse: function(input),
|
||
|
|
||
|
lexer: {
|
||
|
EOF: 1,
|
||
|
parseError: function(str, hash),
|
||
|
setInput: function(input),
|
||
|
input: function(),
|
||
|
unput: function(str),
|
||
|
more: function(),
|
||
|
less: function(n),
|
||
|
pastInput: function(),
|
||
|
upcomingInput: function(),
|
||
|
showPosition: function(),
|
||
|
test_match: function(regex_match_array, rule_index),
|
||
|
next: function(),
|
||
|
lex: function(),
|
||
|
begin: function(condition),
|
||
|
popState: function(),
|
||
|
_currentRules: function(),
|
||
|
topState: function(),
|
||
|
pushState: function(condition),
|
||
|
|
||
|
options: {
|
||
|
ranges: boolean (optional: true ==> token location info will include a .range[] member)
|
||
|
flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
|
||
|
backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
|
||
|
},
|
||
|
|
||
|
performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
|
||
|
rules: [...],
|
||
|
conditions: {associative list: name ==> set},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
token location info (@$, _$, etc.): {
|
||
|
first_line: n,
|
||
|
last_line: n,
|
||
|
first_column: n,
|
||
|
last_column: n,
|
||
|
range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
|
||
|
}
|
||
|
|
||
|
|
||
|
the parseError function receives a 'hash' object with these members for lexer and parser errors: {
|
||
|
text: (matched text)
|
||
|
token: (the produced terminal token, if any)
|
||
|
line: (yylineno)
|
||
|
}
|
||
|
while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
|
||
|
loc: (yylloc)
|
||
|
expected: (string describing the set of expected tokens)
|
||
|
recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
|
||
|
}
|
||
|
*/
|
||
|
var sqlSyntaxParser = (function(){
|
||
|
var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,10,25,29,57,58,73,78,79,96,112,130,144,162,182,219,308,340,353,439,440,441,453,569,570,576,759,814,857,919,920,922,1158,1182,1183,1184,1185,1187,1205,1220,1245,1246,1272,1308],$V1=[2,4],$V2=[6,10],$V3=[2,5],$V4=[1,64],$V5=[1,44],$V6=[1,33],$V7=[1,99],$V8=[1,129],$V9=[1,138],$Va=[1,108],$Vb=[1,109],$Vc=[1,135],$Vd=[1,122],$Ve=[1,66],$Vf=[1,34],$Vg=[1,65],$Vh=[1,92],$Vi=[1,136],$Vj=[1,69],$Vk=[1,102],$Vl=[1,131],$Vm=[1,132],$Vn=[1,133],$Vo=[1,110],$Vp=[1,103],$Vq=[1,104],$Vr=[1,101],$Vs=[1,119],$Vt=[1,105],$Vu=[1,116],$Vv=[1,45],$Vw=[1,46],$Vx=[1,47],$Vy=[1,91],$Vz=[1,125],$VA=[1,100],$VB=[1,142],$VC=[1,67],$VD=[1,68],$VE=[1,126],$VF=[1,141],$VG=[1,130],$VH=[1,98],$VI=[1,134],$VJ=[1,121],$VK=[6,10,400,949],$VL=[2,865],$VM=[1,151],$VN=[1,153],$VO=[1,156],$VP=[25,29,58,73,78,79,96,112,130,144,182,219,308,340,353,439,440,441,453,569,570,576,759,814,857,919,920,922,1158,1182,1183,1184,1185,1187,1205,1220,1245,1246,1272,1308],$VQ=[1,170],$VR=[1,171],$VS=[1,172],$VT=[1,173],$VU=[1,174],$VV=[1,175],$VW=[1,176],$VX=[1,177],$VY=[1,178],$VZ=[1,179],$V_=[1,180],$V$=[1,181],$V01=[1,182],$V11=[1,183],$V21=[1,184],$V31=[1,185],$V41=[1,186],$V51=[1,187],$V61=[1,188],$V71=[1,189],$V81=[1,190],$V91=[1,191],$Va1=[1,192],$Vb1=[1,193],$Vc1=[1,194],$Vd1=[1,195],$Ve1=[1,196],$Vf1=[1,197],$Vg1=[1,198],$Vh1=[1,199],$Vi1=[1,200],$Vj1=[1,201],$Vk1=[1,202],$Vl1=[1,203],$Vm1=[1,204],$Vn1=[1,205],$Vo1=[1,206],$Vp1=[1,207],$Vq1=[1,208],$Vr1=[1,209],$Vs1=[1,210],$Vt1=[1,211],$Vu1=[1,212],$Vv1=[1,213],$Vw1=[1,214],$Vx1=[1,215],$Vy1=[1,216],$Vz1=[1,217],$VA1=[1,218],$VB1=[1,219],$VC1=[1,220],$VD1=[1,221],$VE1=[1,222],$VF1=[1,223],$VG1=[1,224],$VH1=[1,225],$VI1=[1,226],$VJ1=[1,227],$VK1=[1,228],$VL1=[1,229],$VM1=[1,230],$VN1=[1,231],$VO1=[1,232],$VP1=[1,233],$VQ1=[1,234],$VR1=[1,235],$VS1=[1,236],$VT1=[1,237],$VU1=[1,238],$VV1=[1,239],$VW1=[1,240],$VX1=[1,241],$VY1=[1,242],$VZ1=[1,243],$V_1=[1,244],$V$1=[1,245],$V02=[1,246],$V12=[1,247],$V22=[1,248],$V32=[1,249],$V42=[1,250],$V52=[1,251],$V62=[1,252],$V72=[1,253],$V82=[1,254],$V92=[1,255],$Va2=[1,256],$Vb2=[1,257],$Vc2=[1,258],$Vd2=[1,259],$Ve2=[1,260],$Vf2=[1,261],$Vg2=[1,262],$Vh2=[1,263],$Vi2=[1,264],$Vj2=[1,265],$Vk2=[1,266],$Vl2=[1,267],$Vm2=[1,268],$Vn2=[1,269],$Vo2=[1,270],$Vp2=[1,271],$Vq2=[1,272],$Vr2=[1,273],$Vs2=[1,274],$Vt2=[1,275],$Vu2=[1,276],$Vv2=[1,277],$Vw2=[1,278],$Vx2=[1,279],$Vy2=[1,280],$Vz2=[1,281],$VA2=[1,282],$VB2=[1,283],$VC2=[1,284],$VD2=[1,285],$VE2=[1,286],$VF2=[1,287],$VG2=[1,288],$VH2=[1,289],$VI2=[1,290],$VJ2=[1,291],$VK2=[1,292],$VL2=[1,293],$VM2=[1,294],$VN2=[1,295],$VO2=[1,296],$VP2=[1,297],$VQ2=[1,298],$VR2=[1,299],$VS2=[1,300],$VT2=[1,301],$VU2=[1,302],$VV2=[1,167],$VW2=[1,168],$VX2=[1,166],$VY2=[1,323],$VZ2=[1,321],$V_2=[1,322],$V$2=[1,320],$V03=[1,318],$V13=[1,314],$V23=[1,317],$V33=[1,319],$V43=[1,316],$V53=[1,313],$V63=[1,315],$V73=[1,326],$V83=[1,328],$V93=[1,332],$Va3=[1,327],$Vb3=[1,329],$Vc3=[1,331],$Vd3=[1,330],$Ve3=[1,356],$Vf3=[25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,159,160,168,208,237,261,282,286,293,304,305,312,322,323,324,347,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,375,376,377,378,379,380,381,382,383,384,392,393,396,397,398,399,403,404,405,758,759,789],$Vg3=[2,900],$Vh3=[1,371],$Vi3=[1,372],$Vj3=[1,373],$Vk3=[25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,1
|
||
|
var parser = {trace: function trace() { },
|
||
|
yy: {},
|
||
|
symbols_: {"error":2,"SqlSyntax":3,"NewStatement":4,"SqlStatements":5,"EOF":6,"SqlAutocomplete":7,"SqlStatements_EDIT":8,"SqlStatement":9,";":10,"SqlStatement_EDIT":11,"DataDefinition":12,"DataManipulation":13,"QuerySpecification":14,"ExplainClause":15,"AnyCursor":16,"CommonTableExpression":17,"CURSOR":18,"ExplainClause_EDIT":19,"DataDefinition_EDIT":20,"DataManipulation_EDIT":21,"QuerySpecification_EDIT":22,"SetSpecification_EDIT":23,"NonReservedKeyword":24,"<hive>ABORT":25,"<hive>ADD":26,"<hive>ADMIN":27,"<hive>AFTER":28,"<hive>ANALYZE":29,"<hive>ARCHIVE":30,"<hive>AVRO":31,"<hive>BUCKET":32,"<hive>BUCKETS":33,"<hive>CASCADE":34,"<hive>CHANGE":35,"<hive>CLUSTERED":36,"<hive>COLLECTION":37,"<hive>COLUMNS":38,"<hive>COMMENT":39,"<hive>COMPACT":40,"<hive>COMPACTIONS":41,"<hive>COMPUTE":42,"<hive>CONCATENATE":43,"<hive>DATA":44,"<hive>DATABASES":45,"<hive>DBPROPERTIES":46,"<hive>DEFERRED":47,"<hive>DEFINED":48,"<hive>DELIMITED":49,"<hive>DEPENDENCY":50,"<hive>DIRECTORY":51,"<hive>DISABLE":52,"<hive>DOUBLE_PRECISION":53,"<hive>ENABLE":54,"<hive>ESCAPED":55,"<hive>EXCHANGE":56,"<hive>EXPLAIN":57,"<hive>EXPORT":58,"<hive>FIELDS":59,"<hive>FILE":60,"<hive>FILEFORMAT":61,"<hive>FIRST":62,"<hive>FORMAT":63,"<hive>FUNCTIONS":64,"<hive>INPATH":65,"<hive>INPUTFORMAT":66,"<hive>JAR":67,"<hive>IDXPROPERTIES":68,"<hive>ITEMS":69,"<hive>KEY":70,"<hive>KEYS":71,"<hive>LINES":72,"<hive>LOAD":73,"<hive>LOCATION":74,"<hive>LOCKS":75,"<hive>MATCHED":76,"<hive>METADATA":77,"<hive>MERGE":78,"<hive>MSCK":79,"<hive>NOSCAN":80,"<hive>NOVALIDATE":81,"<hive>NO_DROP":82,"<hive>OFFLINE":83,"<hive>ORC":84,"<hive>OUTPUTFORMAT":85,"<hive>OVERWRITE":86,"<hive>OWNER":87,"<hive>PARQUET":88,"<hive>PARTITIONED":89,"<hive>PARTITIONS":90,"<hive>PERCENT":91,"<hive>PRIVILEGES":92,"<hive>PURGE":93,"<hive>RCFILE":94,"<hive>REBUILD":95,"<hive>RELOAD":96,"<hive>RELY":97,"<hive>NORELY":98,"<hive>REPAIR":99,"<hive>REPLICATION":100,"<hive>RECOVER":101,"<hive>RENAME":102,"<hive>REPLACE":103,"<hive>RESTRICT":104,"<hive>ROLE":105,"<hive>ROLES":106,"<hive>SCHEMAS":107,"<hive>SEQUENCEFILE":108,"<hive>SERDE":109,"<hive>SERDEPROPERTIES":110,"<hive>SETS":111,"<hive>SHOW":112,"<hive>SKEWED":113,"<hive>SORTED":114,"<hive>STATISTICS":115,"<hive>STORED":116,"<hive>STRING":117,"STRUCT":118,"<hive>TABLES":119,"<hive>TBLPROPERTIES":120,"<hive>TEMPORARY":121,"<hive>TERMINATED":122,"<hive>TEXTFILE":123,"<hive>TIMESTAMP":124,"<hive>TINYINT":125,"<hive>TOUCH":126,"<hive>TRANSACTIONS":127,"<hive>UNARCHIVE":128,"<hive>UNIONTYPE":129,"<hive>USE":130,"<hive>USER":131,"<hive>VIEW":132,"<hive>WAIT":133,"<hive>DAY":134,"<hive>HOUR":135,"<hive>MINUTE":136,"<hive>MONTH":137,"<hive>QUARTER":138,"<hive>SECOND":139,"<hive>WEEK":140,"<hive>YEAR":141,"<impala>ANALYTIC":142,"<impala>CURRENT":143,"<impala>GRANT":144,"<impala>RECOVER":145,"<impala>ROLE":146,"<impala>ROLES":147,"<impala>URI":148,"<impala>SERVER":149,"<impala>UNKNOWN":150,"<impala>BLOCK_SIZE":151,"<impala>COMPRESSION":152,"<impala>DEFAULT":153,"<impala>ENCODING":154,"<impala>KEY":155,"ROLE":156,"OPTION":157,"RegularIdentifier":158,"REGULAR_IDENTIFIER":159,"VARIABLE_REFERENCE":160,"OptionalHiveExplainTypes":161,"<impala>EXPLAIN":162,"<hive>AUTHORIZATION":163,"<hive>EXTENDED":164,"NonStartingToken":165,"<hive>ALL":166,"<hive>AS":167,"<hive>BINARY":168,"<hive>CACHE":169,"<hive>CLUSTER":170,"<hive>CONF":171,"<hive>CONSTRAINT":172,"<hive>CUBE":173,"<hive>CURRENT":174,"<hive>DATE":175,"<hive>DISTRIBUTE":176,"<hive>DISTRIBUTED":177,"<hive>EXTERNAL":178,"<hive>FOR":179,"<hive>FOREIGN":180,"<hive>FUNCTION":181,"<hive>GRANT":182,"<hive>GROUPING":183,"<hive>LATERAL":184,"<hive>LOCAL":185,"<hive>LOCK":186,"<hive>MACRO":187,"<hive>PARTITION":188,"<hive>PRIMARY":189,"<hive>REFERENCES":190,"<hive>ROLLUP":191,"<hive>SHOW_DATABASE":192,"<hive>TABLE":193,"<hive>ASC":194,"<hive>DESC":195,"<hive>FORMATTED":196,"<hive>INDEX":197,"<hive>INDEXES":198,"<hive>NONE":199,"<hive>OF":200,"<hive>OUT":201,"<hive>SCHEMA":202,"<hive>STORED_AS_DIRECTORIES":203,"<hive>TABLESAMPLE":204,"<hive>USING":205,"<hive>VIEWS":206,"<hive>WINDOW":207,"<hive>.":208,"<hive>[":209,"<hiv
|
||
|
terminals_: {2:"error",6:"EOF",10:";",18:"CURSOR",23:"SetSpecification_EDIT",25:"<hive>ABORT",26:"<hive>ADD",27:"<hive>ADMIN",28:"<hive>AFTER",29:"<hive>ANALYZE",30:"<hive>ARCHIVE",31:"<hive>AVRO",32:"<hive>BUCKET",33:"<hive>BUCKETS",34:"<hive>CASCADE",35:"<hive>CHANGE",36:"<hive>CLUSTERED",37:"<hive>COLLECTION",38:"<hive>COLUMNS",39:"<hive>COMMENT",40:"<hive>COMPACT",41:"<hive>COMPACTIONS",42:"<hive>COMPUTE",43:"<hive>CONCATENATE",44:"<hive>DATA",45:"<hive>DATABASES",46:"<hive>DBPROPERTIES",47:"<hive>DEFERRED",48:"<hive>DEFINED",49:"<hive>DELIMITED",50:"<hive>DEPENDENCY",51:"<hive>DIRECTORY",52:"<hive>DISABLE",53:"<hive>DOUBLE_PRECISION",54:"<hive>ENABLE",55:"<hive>ESCAPED",56:"<hive>EXCHANGE",57:"<hive>EXPLAIN",58:"<hive>EXPORT",59:"<hive>FIELDS",60:"<hive>FILE",61:"<hive>FILEFORMAT",62:"<hive>FIRST",63:"<hive>FORMAT",64:"<hive>FUNCTIONS",65:"<hive>INPATH",66:"<hive>INPUTFORMAT",67:"<hive>JAR",68:"<hive>IDXPROPERTIES",69:"<hive>ITEMS",70:"<hive>KEY",71:"<hive>KEYS",72:"<hive>LINES",73:"<hive>LOAD",74:"<hive>LOCATION",75:"<hive>LOCKS",76:"<hive>MATCHED",77:"<hive>METADATA",78:"<hive>MERGE",79:"<hive>MSCK",80:"<hive>NOSCAN",81:"<hive>NOVALIDATE",82:"<hive>NO_DROP",83:"<hive>OFFLINE",84:"<hive>ORC",85:"<hive>OUTPUTFORMAT",86:"<hive>OVERWRITE",87:"<hive>OWNER",88:"<hive>PARQUET",89:"<hive>PARTITIONED",90:"<hive>PARTITIONS",91:"<hive>PERCENT",92:"<hive>PRIVILEGES",93:"<hive>PURGE",94:"<hive>RCFILE",95:"<hive>REBUILD",96:"<hive>RELOAD",97:"<hive>RELY",98:"<hive>NORELY",99:"<hive>REPAIR",100:"<hive>REPLICATION",101:"<hive>RECOVER",102:"<hive>RENAME",103:"<hive>REPLACE",104:"<hive>RESTRICT",105:"<hive>ROLE",106:"<hive>ROLES",107:"<hive>SCHEMAS",108:"<hive>SEQUENCEFILE",109:"<hive>SERDE",110:"<hive>SERDEPROPERTIES",111:"<hive>SETS",112:"<hive>SHOW",113:"<hive>SKEWED",114:"<hive>SORTED",115:"<hive>STATISTICS",116:"<hive>STORED",117:"<hive>STRING",118:"STRUCT",119:"<hive>TABLES",120:"<hive>TBLPROPERTIES",121:"<hive>TEMPORARY",122:"<hive>TERMINATED",123:"<hive>TEXTFILE",124:"<hive>TIMESTAMP",125:"<hive>TINYINT",126:"<hive>TOUCH",127:"<hive>TRANSACTIONS",128:"<hive>UNARCHIVE",129:"<hive>UNIONTYPE",130:"<hive>USE",131:"<hive>USER",132:"<hive>VIEW",133:"<hive>WAIT",134:"<hive>DAY",135:"<hive>HOUR",136:"<hive>MINUTE",137:"<hive>MONTH",138:"<hive>QUARTER",139:"<hive>SECOND",140:"<hive>WEEK",141:"<hive>YEAR",142:"<impala>ANALYTIC",143:"<impala>CURRENT",144:"<impala>GRANT",145:"<impala>RECOVER",146:"<impala>ROLE",147:"<impala>ROLES",148:"<impala>URI",149:"<impala>SERVER",150:"<impala>UNKNOWN",151:"<impala>BLOCK_SIZE",152:"<impala>COMPRESSION",153:"<impala>DEFAULT",154:"<impala>ENCODING",155:"<impala>KEY",156:"ROLE",157:"OPTION",159:"REGULAR_IDENTIFIER",160:"VARIABLE_REFERENCE",162:"<impala>EXPLAIN",163:"<hive>AUTHORIZATION",164:"<hive>EXTENDED",166:"<hive>ALL",167:"<hive>AS",168:"<hive>BINARY",169:"<hive>CACHE",170:"<hive>CLUSTER",171:"<hive>CONF",172:"<hive>CONSTRAINT",173:"<hive>CUBE",174:"<hive>CURRENT",175:"<hive>DATE",176:"<hive>DISTRIBUTE",177:"<hive>DISTRIBUTED",178:"<hive>EXTERNAL",179:"<hive>FOR",180:"<hive>FOREIGN",181:"<hive>FUNCTION",182:"<hive>GRANT",183:"<hive>GROUPING",184:"<hive>LATERAL",185:"<hive>LOCAL",186:"<hive>LOCK",187:"<hive>MACRO",188:"<hive>PARTITION",189:"<hive>PRIMARY",190:"<hive>REFERENCES",191:"<hive>ROLLUP",192:"<hive>SHOW_DATABASE",193:"<hive>TABLE",194:"<hive>ASC",195:"<hive>DESC",196:"<hive>FORMATTED",197:"<hive>INDEX",198:"<hive>INDEXES",199:"<hive>NONE",200:"<hive>OF",201:"<hive>OUT",202:"<hive>SCHEMA",203:"<hive>STORED_AS_DIRECTORIES",204:"<hive>TABLESAMPLE",205:"<hive>USING",206:"<hive>VIEWS",207:"<hive>WINDOW",208:"<hive>.",209:"<hive>[",210:"<hive>]",211:"<impala>AGGREGATE",212:"<impala>AVRO",213:"<impala>CACHED",214:"<impala>CASCADE",215:"<impala>CLOSE_FN",216:"<impala>COLUMN",217:"<impala>DATA",218:"<impala>DATABASES",219:"<impala>DELETE",220:"<impala>DELIMITED",221:"<impala>ESCAPED",222:"<impala>EXTENDED",223:"<impala>EXTERNAL",224:"<impala>FIELDS",225:"<impala>FILES",226:"<impala>FINALIZE_FN",227:"<impala>FIRST",228:"<impala>FORMAT",229:"<impala>FORMATTED",230:"<impala>FUNCTION",231:"<impala>F
|
||
|
productions_: [0,[3,3],[7,3],[7,3],[4,0],[5,0],[5,1],[5,4],[8,1],[8,4],[8,4],[8,7],[9,1],[9,1],[9,1],[9,2],[9,2],[9,2],[11,1],[11,2],[11,1],[11,1],[11,1],[11,1],[11,1],[11,2],[11,2],[11,2],[11,2],[11,2],[11,2],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[24,1],[158,1],[158,1],[158,1],[15,2],[15,1],[19,3],[19,2],[161,0],[161,1],[161,1],[161,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[165,1],[12,1],[12,1],[12,1],[12,1],[12,1],[12,1],[12,1],[12,1],[12,1],[12,1],[12,1],[12,1],[12,1],[12,1],[12,1],[20,1],[20,1],[20,1],[20,1],[20,1],[2
|
||
|
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
|
||
|
/* this == yyval */
|
||
|
|
||
|
var $0 = $$.length - 1;
|
||
|
switch (yystate) {
|
||
|
case 2: case 3:
|
||
|
|
||
|
return parser.yy.result;
|
||
|
|
||
|
break;
|
||
|
case 4:
|
||
|
|
||
|
parser.prepareNewStatement();
|
||
|
|
||
|
break;
|
||
|
case 6: case 8: case 10:
|
||
|
|
||
|
parser.addStatementLocation(_$[$0]);
|
||
|
|
||
|
break;
|
||
|
case 9: case 11:
|
||
|
|
||
|
parser.addStatementLocation(_$[$0-3]);
|
||
|
|
||
|
break;
|
||
|
case 18:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestDdlAndDmlKeywords(['EXPLAIN', 'FROM']);
|
||
|
} else if (parser.isImpala()) {
|
||
|
parser.suggestDdlAndDmlKeywords(['EXPLAIN']);
|
||
|
} else {
|
||
|
parser.suggestDdlAndDmlKeywords();
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 19:
|
||
|
|
||
|
if (parser.isHive() || parser.isImpala()) {
|
||
|
parser.suggestKeywords(['INSERT', 'SELECT']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['SELECT']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 169:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestDdlAndDmlKeywords([{ value: 'AUTHORIZATION', weight: 2 }, { value: 'DEPENDENCY', weight: 2 }, { value: 'EXTENDED', weight: 2 }]);
|
||
|
} else {
|
||
|
parser.suggestDdlAndDmlKeywords();
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 170:
|
||
|
|
||
|
parser.suggestDdlAndDmlKeywords();
|
||
|
|
||
|
break;
|
||
|
case 543:
|
||
|
|
||
|
parser.suggestSetOptions();
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['ROLE']);
|
||
|
}
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['ALL']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 611: case 614: case 719: case 760: case 852: case 1059: case 1242: case 1351: case 1408: case 2524: case 2526: case 3026:
|
||
|
this.$ = $$[$0-1];
|
||
|
break;
|
||
|
case 612: case 615: case 761:
|
||
|
this.$ = '';
|
||
|
break;
|
||
|
case 636:
|
||
|
|
||
|
parser.suggestKeywords(['INDEX', 'INDEXES']);
|
||
|
|
||
|
break;
|
||
|
case 637:
|
||
|
|
||
|
parser.suggestKeywords(['FORMATTED']);
|
||
|
|
||
|
break;
|
||
|
case 654: case 657:
|
||
|
|
||
|
parser.yy.correlatedSubQuery = false;
|
||
|
|
||
|
break;
|
||
|
case 655: case 659:
|
||
|
|
||
|
parser.suggestKeywords(['EXISTS']);
|
||
|
|
||
|
break;
|
||
|
case 658:
|
||
|
|
||
|
parser.suggestKeywords(['NOT EXISTS']);
|
||
|
|
||
|
break;
|
||
|
case 669: case 671: case 672: case 674:
|
||
|
|
||
|
parser.suggestKeywords(['<', '<=', '<>', '=', '>', '>=']);
|
||
|
|
||
|
break;
|
||
|
case 670: case 673: case 3053:
|
||
|
|
||
|
parser.suggestKeywords(['VALUES']);
|
||
|
|
||
|
break;
|
||
|
case 697: case 701: case 705: case 741: case 742: case 787: case 790: case 961: case 1030: case 1772: case 1870: case 1889: case 1935: case 1937: case 2307: case 2564: case 3343:
|
||
|
|
||
|
parser.suggestColumns();
|
||
|
|
||
|
break;
|
||
|
case 709: case 762:
|
||
|
|
||
|
parser.addTableLocation(_$[$0], [ { name: $$[$0] } ]);
|
||
|
this.$ = { identifierChain: [ { name: $$[$0] } ] };
|
||
|
|
||
|
break;
|
||
|
case 710: case 763:
|
||
|
|
||
|
parser.addDatabaseLocation(_$[$0-2], [ { name: $$[$0-2] } ]);
|
||
|
parser.addTableLocation(_$[$0], [ { name: $$[$0-2] }, { name: $$[$0] } ]);
|
||
|
this.$ = { identifierChain: [ { name: $$[$0-2] }, { name: $$[$0] } ] };
|
||
|
|
||
|
break;
|
||
|
case 711:
|
||
|
|
||
|
// This is a special case for Impala expression like "SELECT | FROM db.table.col"
|
||
|
this.$ = { identifierChain: [ { name: $$[$0-3] }, { name: $$[$0-1] } ].concat($$[$0]) };
|
||
|
|
||
|
break;
|
||
|
case 712: case 1676: case 1842: case 2009: case 2015: case 2024: case 2215: case 2537: case 2561: case 2664: case 2669: case 2687: case 2710: case 2717: case 2774: case 2782: case 3060: case 3091: case 3094: case 3100: case 3329: case 3349:
|
||
|
|
||
|
parser.suggestTables();
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
|
||
|
break;
|
||
|
case 713: case 727:
|
||
|
|
||
|
parser.suggestDatabases();
|
||
|
this.$ = { identifierChain: [{ name: $$[$0-2] }] };
|
||
|
|
||
|
break;
|
||
|
case 714:
|
||
|
|
||
|
// In Impala you can have statements like 'SELECT ... FROM testTable t, t.|'
|
||
|
parser.suggestTablesOrColumns($$[$0-2]);
|
||
|
|
||
|
break;
|
||
|
case 715:
|
||
|
|
||
|
// TODO: switch to suggestColumns, it's currently handled in sqlAutocompleter2.js
|
||
|
// Issue is that suggestColumns is deleted if no tables are defined and this is
|
||
|
// Impala only cases like "SELECT | FROM db.table.col"
|
||
|
parser.suggestTables({ identifierChain: [{ name: $$[$0-3] }, { name: $$[$0-1] }].concat($$[$0]) });
|
||
|
|
||
|
break;
|
||
|
case 716: case 890:
|
||
|
this.$ = [$$[$0]];
|
||
|
break;
|
||
|
case 717:
|
||
|
|
||
|
$$[$0-1].push($$[$0]);
|
||
|
|
||
|
break;
|
||
|
case 718: case 721:
|
||
|
this.$ = [];
|
||
|
break;
|
||
|
case 720: case 854: case 1244:
|
||
|
this.$ = $$[$0-2];
|
||
|
break;
|
||
|
case 722:
|
||
|
this.$ = { name: $$[$0] };
|
||
|
break;
|
||
|
case 726: case 1727: case 1954:
|
||
|
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
|
||
|
break;
|
||
|
case 730: case 1968: case 2005: case 2773: case 2781: case 3183: case 3243: case 3257: case 3315: case 3316: case 3354:
|
||
|
|
||
|
parser.suggestDatabases();
|
||
|
|
||
|
break;
|
||
|
case 740: case 966: case 967: case 973: case 974: case 1347: case 1435: case 3011: case 3047:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
|
||
|
break;
|
||
|
case 748: case 751:
|
||
|
|
||
|
if (!$$[$0]) {
|
||
|
this.$ = { suggestKeywords: ['WITH REPLICATION ='] };
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 753: case 3201:
|
||
|
|
||
|
parser.suggestKeywords(['IN']);
|
||
|
|
||
|
break;
|
||
|
case 757:
|
||
|
|
||
|
parser.suggestKeywords(['REPLICATION =']);
|
||
|
|
||
|
break;
|
||
|
case 758: case 1710: case 1867: case 2268:
|
||
|
|
||
|
parser.suggestKeywords(['=']);
|
||
|
|
||
|
break;
|
||
|
case 764: case 3306:
|
||
|
|
||
|
parser.suggestTables();
|
||
|
parser.suggestDatabases({ prependDot: true });
|
||
|
|
||
|
break;
|
||
|
case 765:
|
||
|
|
||
|
parser.suggestTablesOrColumns($$[$0-2]);
|
||
|
|
||
|
break;
|
||
|
case 767:
|
||
|
this.$ = { identifierChain: $$[$0-1].identifierChain, alias: $$[$0] };
|
||
|
break;
|
||
|
case 770:
|
||
|
|
||
|
parser.yy.locations[parser.yy.locations.length - 1].type = 'column';
|
||
|
|
||
|
break;
|
||
|
case 771: case 1195:
|
||
|
|
||
|
parser.addAsteriskLocation(_$[$0], $$[$0-2].concat({ asterisk: true }));
|
||
|
|
||
|
break;
|
||
|
case 773:
|
||
|
|
||
|
this.$ = [ $$[$0].identifier ];
|
||
|
parser.yy.firstChainLocation = parser.addUnknownLocation($$[$0].location, [ $$[$0].identifier ]);
|
||
|
|
||
|
break;
|
||
|
case 774:
|
||
|
|
||
|
if (parser.yy.firstChainLocation) {
|
||
|
parser.yy.firstChainLocation.firstInChain = true;
|
||
|
delete parser.yy.firstChainLocation;
|
||
|
}
|
||
|
$$[$0-2].push($$[$0].identifier);
|
||
|
parser.addUnknownLocation($$[$0].location, $$[$0-2].concat());
|
||
|
|
||
|
break;
|
||
|
case 775: case 783:
|
||
|
|
||
|
if ($$[$0].insideKey) {
|
||
|
parser.suggestKeyValues({ identifierChain: [ $$[$0].identifier ] });
|
||
|
parser.suggestColumns();
|
||
|
parser.suggestFunctions();
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 776: case 784:
|
||
|
|
||
|
if ($$[$0].insideKey) {
|
||
|
parser.suggestKeyValues({ identifierChain: $$[$0-2].concat([ $$[$0].identifier ]) });
|
||
|
parser.suggestColumns();
|
||
|
parser.suggestFunctions();
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 779:
|
||
|
|
||
|
parser.suggestColumns({
|
||
|
identifierChain: $$[$0-2]
|
||
|
});
|
||
|
this.$ = { suggestKeywords: [{ value: '*', weight: 10000 }] };
|
||
|
|
||
|
break;
|
||
|
case 780:
|
||
|
|
||
|
parser.suggestColumns({
|
||
|
identifierChain: $$[$0-4]
|
||
|
});
|
||
|
this.$ = { suggestKeywords: [{ value: '*', weight: 10000 }] };
|
||
|
|
||
|
break;
|
||
|
case 781:
|
||
|
this.$ = [ $$[$0].identifier ];
|
||
|
break;
|
||
|
case 782:
|
||
|
|
||
|
$$[$0-2].push($$[$0].identifier);
|
||
|
|
||
|
break;
|
||
|
case 785:
|
||
|
|
||
|
if ($$[$0-2].insideKey) {
|
||
|
parser.suggestKeyValues({ identifierChain: $$[$0-4].concat([ $$[$0-2].identifier ]) });
|
||
|
parser.suggestColumns();
|
||
|
parser.suggestFunctions();
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 786:
|
||
|
|
||
|
if ($$[$0-2].insideKey) {
|
||
|
parser.suggestKeyValues({ identifierChain: [ $$[$0-2].identifier ] });
|
||
|
parser.suggestColumns();
|
||
|
parser.suggestFunctions();
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 788:
|
||
|
|
||
|
parser.suggestColumns({ identifierChain: $$[$0-2] });
|
||
|
|
||
|
break;
|
||
|
case 789:
|
||
|
|
||
|
parser.suggestColumns({ identifierChain: $$[$0-4] });
|
||
|
|
||
|
break;
|
||
|
case 791:
|
||
|
this.$ = { identifier: { name: $$[$0] }, location: _$[$0] };;
|
||
|
break;
|
||
|
case 792:
|
||
|
this.$ = { identifier: { name: $$[$0-3], keySet: true }, location: _$[$0-3] };
|
||
|
break;
|
||
|
case 793:
|
||
|
this.$ = { identifier: { name: $$[$0-2], keySet: true }, location: _$[$0-2] };
|
||
|
break;
|
||
|
case 794:
|
||
|
this.$ = { identifier: { name: $$[$0-3] }, insideKey: true };
|
||
|
break;
|
||
|
case 795:
|
||
|
this.$ = { identifier: { name: $$[$0-3] }};;
|
||
|
break;
|
||
|
case 828:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
parser.addColumnLocation(_$[$0-1], $$[$0-1]);
|
||
|
|
||
|
break;
|
||
|
case 829: case 1678: case 1977: case 1999: case 2013: case 2027: case 2217: case 2663: case 2673: case 2674: case 2699: case 2705: case 2708: case 2713: case 3054: case 3063: case 3064: case 3093: case 3103: case 3200: case 3246: case 3247: case 3259: case 3261:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-1]);
|
||
|
|
||
|
break;
|
||
|
case 830: case 846: case 2000:
|
||
|
|
||
|
parser.addDatabaseLocation(_$[$0], [{ name: $$[$0] }]);
|
||
|
|
||
|
break;
|
||
|
case 833: case 1674: case 2012: case 2019: case 2020: case 3248:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
|
||
|
break;
|
||
|
case 834:
|
||
|
|
||
|
if (!$$[$0-4]) {
|
||
|
parser.suggestKeywords(['EXTENDED', 'FORMATTED']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 835:
|
||
|
|
||
|
if (!$$[$0-3]) {
|
||
|
parser.suggestKeywords(['EXTENDED', 'FORMATTED']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 836:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
parser.suggestColumns();
|
||
|
if (!$$[$0]) {
|
||
|
parser.suggestKeywords(['PARTITION']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 837:
|
||
|
|
||
|
if (!$$[$0]) {
|
||
|
parser.suggestKeywords(['PARTITION']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 840:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['DATABASE', 'EXTENDED', 'FORMATTED', 'FUNCTION', 'SCHEMA']);
|
||
|
}
|
||
|
parser.suggestTables();
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
|
||
|
break;
|
||
|
case 841: case 843:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['EXTENDED']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 842: case 844:
|
||
|
|
||
|
if (!$$[$0-2]) {
|
||
|
parser.suggestKeywords(['EXTENDED']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 845: case 1872: case 1955: case 1958: case 2007: case 2533: case 2662: case 2683: case 2693: case 2697: case 2771: case 2772: case 2778: case 3027: case 3096: case 3170: case 3186: case 3245: case 3258: case 3260: case 3303: case 3332:
|
||
|
|
||
|
parser.addTablePrimary($$[$0]);
|
||
|
|
||
|
break;
|
||
|
case 847:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords([{ value: 'DATABASE', weight: 2 }, { value: 'EXTENDED', weight: 1 }, { value: 'FORMATTED', weight: 1 }]);
|
||
|
}
|
||
|
parser.suggestTables();
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
|
||
|
break;
|
||
|
case 849:
|
||
|
|
||
|
parser.addTablePrimary($$[$0]);
|
||
|
if (!$$[$0-2]) {
|
||
|
parser.suggestKeywords([{ value: 'DATABASE', weight: 2 }, { value: 'EXTENDED', weight: 1 }, { value: 'FORMATTED', weight: 1 }]);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 850:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['EXTENDED', 'FORMATTED']);
|
||
|
}
|
||
|
parser.suggestDatabases();
|
||
|
|
||
|
break;
|
||
|
case 851:
|
||
|
|
||
|
if (!$$[$0-2]) {
|
||
|
parser.suggestKeywords(['EXTENDED', 'FORMATTED']);
|
||
|
}
|
||
|
parser.addDatabaseLocation(_$[$0], [{ name: $$[$0] }]);
|
||
|
|
||
|
break;
|
||
|
case 857:
|
||
|
|
||
|
parser.addCommonTableExpressions($$[$0-3]);
|
||
|
|
||
|
break;
|
||
|
case 858: case 859: case 893:
|
||
|
|
||
|
parser.addCommonTableExpressions($$[$0-2]);
|
||
|
|
||
|
break;
|
||
|
case 863:
|
||
|
|
||
|
parser.addClauseLocation('selectList', parser.firstDefined($$[$0-1], _$[$0-1], $$[$0-2], _$[$0-2], $$[$0-3], _$[$0-3]), _$[$0]);
|
||
|
this.$ = { selectList: $$[$0] };
|
||
|
|
||
|
break;
|
||
|
case 864:
|
||
|
|
||
|
parser.addClauseLocation('selectList', parser.firstDefined($$[$0-2], _$[$0-2], $$[$0-3], _$[$0-3], $$[$0-4], _$[$0-4]), _$[$0-1]);
|
||
|
this.$ = { selectList: $$[$0-1], tableExpression: $$[$0] }
|
||
|
|
||
|
break;
|
||
|
case 875:
|
||
|
|
||
|
parser.suggestKeywords(['ALL', 'DISTINCT', 'SELECT']);
|
||
|
|
||
|
break;
|
||
|
case 876:
|
||
|
|
||
|
parser.suggestKeywords(['ALL', 'DISTINCT']);
|
||
|
|
||
|
break;
|
||
|
case 878:
|
||
|
|
||
|
parser.addClauseLocation('selectList', parser.firstDefined($$[$0-1], _$[$0-1], $$[$0-2], _$[$0-2], $$[$0-3], _$[$0-3]), _$[$0]);
|
||
|
if ($$[$0].cursorAtStart) {
|
||
|
var keywords = parser.getSelectListKeywords();
|
||
|
if (!$$[$0-1] && !$$[$0-2]) {
|
||
|
keywords.push({ value: 'ALL', weight: 2 });
|
||
|
keywords.push({ value: 'DISTINCT', weight: 2 });
|
||
|
}
|
||
|
if (parser.isImpala() && !$$[$0-1]) {
|
||
|
keywords.push({ value: 'STRAIGHT_JOIN', weight: 1 });
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
} else {
|
||
|
parser.checkForSelectListKeywords($$[$0]);
|
||
|
}
|
||
|
if ($$[$0].suggestFunctions) {
|
||
|
parser.suggestFunctions();
|
||
|
}
|
||
|
if ($$[$0].suggestColumns) {
|
||
|
parser.suggestColumns({ identifierChain: [], source: 'select' });
|
||
|
}
|
||
|
if ($$[$0].suggestTables) {
|
||
|
parser.suggestTables({ prependQuestionMark: true, prependFrom: true });
|
||
|
}
|
||
|
if ($$[$0].suggestDatabases) {
|
||
|
parser.suggestDatabases({ prependQuestionMark: true, prependFrom: true, appendDot: true });
|
||
|
}
|
||
|
if ($$[$0].suggestAggregateFunctions && (!$$[$0-2] || $$[$0-2] === 'ALL')) {
|
||
|
parser.suggestAggregateFunctions();
|
||
|
parser.suggestAnalyticFunctions();
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 879:
|
||
|
|
||
|
parser.addClauseLocation('selectList', parser.firstDefined($$[$0-1], _$[$0-1], $$[$0-2], _$[$0-2], $$[$0-3], _$[$0-3]), _$[$0], true);
|
||
|
var keywords = parser.getSelectListKeywords();
|
||
|
if (!$$[$0-2] || $$[$0-2] === 'ALL') {
|
||
|
parser.suggestAggregateFunctions();
|
||
|
parser.suggestAnalyticFunctions();
|
||
|
}
|
||
|
if (!$$[$0-1] && !$$[$0-2]) {
|
||
|
keywords.push({ value: 'ALL', weight: 2 });
|
||
|
keywords.push({ value: 'DISTINCT', weight: 2 });
|
||
|
}
|
||
|
if (parser.isImpala() && !$$[$0-1]) {
|
||
|
keywords.push({ value: 'STRAIGHT_JOIN', weight: 1 });
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
parser.suggestFunctions();
|
||
|
parser.suggestColumns({ identifierChain: [], source: 'select' });
|
||
|
parser.suggestTables({ prependQuestionMark: true, prependFrom: true });
|
||
|
parser.suggestDatabases({ prependQuestionMark: true, prependFrom: true, appendDot: true });
|
||
|
|
||
|
break;
|
||
|
case 880:
|
||
|
|
||
|
parser.addClauseLocation('selectList', parser.firstDefined($$[$0-2], _$[$0-2], $$[$0-3], _$[$0-3], $$[$0-4], _$[$0-4]), _$[$0-1]);
|
||
|
|
||
|
break;
|
||
|
case 881:
|
||
|
|
||
|
parser.addClauseLocation('selectList', parser.firstDefined($$[$0-2], _$[$0-2], $$[$0-3], _$[$0-3], $$[$0-4], _$[$0-4]), _$[$0-1]);
|
||
|
parser.selectListNoTableSuggest($$[$0-1], $$[$0-3]);
|
||
|
if (parser.yy.result.suggestColumns) {
|
||
|
parser.yy.result.suggestColumns.source = 'select';
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 882:
|
||
|
|
||
|
parser.addClauseLocation('selectList', parser.firstDefined($$[$0-2], _$[$0-2], $$[$0-3], _$[$0-3], $$[$0-4], _$[$0-4]), _$[$0-1], true);
|
||
|
var keywords = parser.getSelectListKeywords();
|
||
|
if (!$$[$0-3] || $$[$0-3] === 'ALL') {
|
||
|
parser.suggestAggregateFunctions();
|
||
|
parser.suggestAnalyticFunctions();
|
||
|
}
|
||
|
if (!$$[$0-2] && !$$[$0-3]) {
|
||
|
keywords.push({ value: 'ALL', weight: 2 });
|
||
|
keywords.push({ value: 'DISTINCT', weight: 2 });
|
||
|
}
|
||
|
if (parser.isImpala() && !$$[$0-2]) {
|
||
|
keywords.push({ value: 'STRAIGHT_JOIN', weight: 1 });
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
parser.suggestFunctions();
|
||
|
parser.suggestColumns({ identifierChain: [], source: 'select' });
|
||
|
parser.suggestTables({ prependQuestionMark: true, prependFrom: true });
|
||
|
parser.suggestDatabases({ prependQuestionMark: true, prependFrom: true, appendDot: true });
|
||
|
|
||
|
break;
|
||
|
case 883:
|
||
|
|
||
|
parser.addClauseLocation('selectList', parser.firstDefined($$[$0-3], _$[$0-3], $$[$0-4], _$[$0-4], $$[$0-5], _$[$0-5]), _$[$0-2]);
|
||
|
parser.checkForSelectListKeywords($$[$0-2]);
|
||
|
|
||
|
break;
|
||
|
case 884:
|
||
|
|
||
|
parser.addClauseLocation('selectList', parser.firstDefined($$[$0-4], _$[$0-4], $$[$0-5], _$[$0-5], $$[$0-6], _$[$0-6]), _$[$0-3]);
|
||
|
parser.checkForSelectListKeywords($$[$0-3]);
|
||
|
|
||
|
break;
|
||
|
case 885:
|
||
|
|
||
|
parser.addClauseLocation('selectList', parser.firstDefined($$[$0-2], _$[$0-2], $$[$0-3], _$[$0-3], $$[$0-4], _$[$0-4]), _$[$0-1]);
|
||
|
parser.checkForSelectListKeywords($$[$0-1]);
|
||
|
var keywords = ['FROM'];
|
||
|
if (parser.yy.result.suggestKeywords) {
|
||
|
keywords = parser.yy.result.suggestKeywords.concat(keywords);
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
parser.suggestTables({ prependFrom: true });
|
||
|
parser.suggestDatabases({ prependFrom: true, appendDot: true });
|
||
|
|
||
|
break;
|
||
|
case 888: case 933: case 964: case 977: case 981: case 1019: case 1023: case 1051: case 1077: case 1078: case 1159: case 1161: case 1229: case 1239: case 1246: case 1258: case 1433: case 1629: case 1630: case 1918: case 2088: case 2105: case 3046: case 3348:
|
||
|
this.$ = $$[$0];
|
||
|
break;
|
||
|
case 891:
|
||
|
this.$ = $$[$0-2].concat([$$[$0]]);;
|
||
|
break;
|
||
|
case 895:
|
||
|
|
||
|
parser.addCommonTableExpressions($$[$0-4]);
|
||
|
|
||
|
break;
|
||
|
case 896:
|
||
|
|
||
|
parser.addCteAliasLocation(_$[$0-4], $$[$0-4]);
|
||
|
$$[$0-1].alias = $$[$0-4];
|
||
|
this.$ = $$[$0-1];
|
||
|
|
||
|
break;
|
||
|
case 897: case 1488: case 2327: case 2386: case 2463: case 2467: case 2540:
|
||
|
|
||
|
parser.suggestKeywords(['AS']);
|
||
|
|
||
|
break;
|
||
|
case 898: case 1354: case 1951: case 2400: case 2409: case 3028:
|
||
|
|
||
|
parser.suggestKeywords(['SELECT']);
|
||
|
|
||
|
break;
|
||
|
case 904: case 905:
|
||
|
|
||
|
parser.addClauseLocation('whereClause', _$[$0-1], $$[$0].whereClauseLocation);
|
||
|
parser.addClauseLocation('limitClause', $$[$0].limitClausePreceding || _$[$0-1], $$[$0].limitClauseLocation);
|
||
|
|
||
|
break;
|
||
|
case 906:
|
||
|
|
||
|
var keywords = [];
|
||
|
|
||
|
parser.addClauseLocation('whereClause', _$[$0-3], $$[$0-1].whereClauseLocation);
|
||
|
parser.addClauseLocation('limitClause', $$[$0-2].limitClausePreceding || _$[$0-3], $$[$0-2].limitClauseLocation);
|
||
|
|
||
|
if ($$[$0-3]) {
|
||
|
if (!$$[$0-3].hasLateralViews && typeof $$[$0-3].tableReferenceList.hasJoinCondition !== 'undefined' && !$$[$0-3].tableReferenceList.hasJoinCondition) {
|
||
|
keywords.push({ value: 'ON', weight: 3 });
|
||
|
if (parser.isImpala()) {
|
||
|
keywords.push({ value: 'USING', weight: 3 });
|
||
|
}
|
||
|
}
|
||
|
if ($$[$0-3].suggestKeywords) {
|
||
|
keywords = parser.createWeightedKeywords($$[$0-3].suggestKeywords, 3);
|
||
|
}
|
||
|
if ($$[$0-3].tableReferenceList.suggestJoinConditions) {
|
||
|
parser.suggestJoinConditions($$[$0-3].tableReferenceList.suggestJoinConditions);
|
||
|
}
|
||
|
if ($$[$0-3].tableReferenceList.suggestJoins) {
|
||
|
parser.suggestJoins($$[$0-3].tableReferenceList.suggestJoins);
|
||
|
}
|
||
|
if (!$$[$0-3].hasLateralViews && $$[$0-3].tableReferenceList.suggestKeywords) {
|
||
|
keywords = keywords.concat(parser.createWeightedKeywords($$[$0-3].tableReferenceList.suggestKeywords, 3));
|
||
|
}
|
||
|
|
||
|
// Lower the weights for 'TABLESAMPLE' and 'LATERAL VIEW'
|
||
|
keywords.forEach(function (keyword) {
|
||
|
if (keyword.value === 'TABLESAMPLE' || keyword.value === 'LATERAL VIEW') {
|
||
|
keyword.weight = 1.1;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
if (!$$[$0-3].hasLateralViews && $$[$0-3].tableReferenceList.types) {
|
||
|
var veKeywords = parser.getValueExpressionKeywords($$[$0-3].tableReferenceList);
|
||
|
keywords = keywords.concat(veKeywords.suggestKeywords);
|
||
|
if (veKeywords.suggestColRefKeywords) {
|
||
|
parser.suggestColRefKeywords(veKeywords.suggestColRefKeywords);
|
||
|
parser.addColRefIfExists($$[$0-3].tableReferenceList);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ($$[$0-1].empty && $$[$0] && $$[$0].joinType.toUpperCase() === 'JOIN') {
|
||
|
keywords = keywords.concat(['FULL', 'FULL OUTER', 'LEFT', 'LEFT OUTER', 'RIGHT', 'RIGHT OUTER']);
|
||
|
if (parser.isHive()) {
|
||
|
keywords = keywords.concat(['CROSS', 'INNER', 'LEFT SEMI']);
|
||
|
} else if (parser.isImpala()) {
|
||
|
keywords = keywords.concat(['ANTI', 'CROSS', 'INNER', 'LEFT ANTI', 'LEFT INNER', 'LEFT SEMI', 'OUTER', 'RIGHT ANTI', 'RIGHT INNER', 'RIGHT SEMI', 'SEMI']);
|
||
|
} else {
|
||
|
keywords.push('INNER');
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ($$[$0-1].suggestKeywords) {
|
||
|
keywords = keywords.concat(parser.createWeightedKeywords($$[$0-1].suggestKeywords, 2));
|
||
|
}
|
||
|
|
||
|
if ($$[$0-1].suggestFilters) {
|
||
|
parser.suggestFilters($$[$0-1].suggestFilters);
|
||
|
}
|
||
|
if ($$[$0-1].suggestGroupBys) {
|
||
|
parser.suggestGroupBys($$[$0-1].suggestGroupBys);
|
||
|
}
|
||
|
if ($$[$0-1].suggestOrderBys) {
|
||
|
parser.suggestOrderBys($$[$0-1].suggestOrderBys);
|
||
|
}
|
||
|
|
||
|
if ($$[$0-1].empty) {
|
||
|
keywords.push({ value: 'UNION', weight: 2.11 });
|
||
|
}
|
||
|
|
||
|
keywords = keywords.concat([
|
||
|
{ value: 'FULL JOIN', weight: 1 },
|
||
|
{ value: 'FULL OUTER JOIN', weight: 1 },
|
||
|
{ value: 'JOIN', weight: 1 },
|
||
|
{ value: 'LEFT JOIN', weight: 1 },
|
||
|
{ value: 'LEFT OUTER JOIN', weight: 1 },
|
||
|
{ value: 'RIGHT JOIN', weight: 1 },
|
||
|
{ value: 'RIGHT OUTER JOIN', weight: 1 }
|
||
|
]);
|
||
|
if (parser.isHive()) {
|
||
|
keywords = keywords.concat([
|
||
|
{ value: 'CROSS JOIN', weight: 1 },
|
||
|
{ value: 'INNER JOIN', weight: 1 },
|
||
|
{ value: 'LEFT SEMI JOIN', weight: 1 }
|
||
|
]);
|
||
|
} else if (parser.isImpala()) {
|
||
|
keywords = keywords.concat([
|
||
|
{ value: 'ANTI JOIN', weight: 1 },
|
||
|
{ value: 'INNER JOIN', weight: 1 },
|
||
|
{ value: 'LEFT ANTI JOIN', weight: 1 },
|
||
|
{ value: 'LEFT INNER JOIN', weight: 1 },
|
||
|
{ value: 'LEFT SEMI JOIN', weight: 1 },
|
||
|
{ value: 'OUTER JOIN', weight: 1 },
|
||
|
{ value: 'RIGHT ANTI JOIN', weight: 1 },
|
||
|
{ value: 'RIGHT INNER JOIN', weight: 1 },
|
||
|
{ value: 'RIGHT SEMI JOIN', weight: 1 },
|
||
|
{ value: 'SEMI JOIN', weight: 1 }
|
||
|
]);
|
||
|
} else {
|
||
|
keywords.push({ value: 'INNER JOIN', weight: 1 });
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
|
||
|
break;
|
||
|
case 907:
|
||
|
|
||
|
// A couple of things are going on here:
|
||
|
// - If there are no SelectConditions (WHERE, GROUP BY, etc.) we should suggest complete join options
|
||
|
// - If there's an OptionalJoin at the end, i.e. 'SELECT * FROM foo | JOIN ...' we should suggest
|
||
|
// different join types
|
||
|
// - The FromClause could end with a valueExpression, in which case we should suggest keywords like '='
|
||
|
// or 'AND' based on type
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.addClauseLocation('whereClause', _$[$0-2]);
|
||
|
parser.addClauseLocation('limitClause', _$[$0-2]);
|
||
|
return;
|
||
|
}
|
||
|
parser.addClauseLocation('whereClause', _$[$0-2], $$[$0-1].whereClauseLocation);
|
||
|
parser.addClauseLocation('limitClause', $$[$0-1].limitClausePreceding || _$[$0-2], $$[$0-1].limitClauseLocation);
|
||
|
var keywords = [];
|
||
|
|
||
|
if ($$[$0-1].suggestColRefKeywords) {
|
||
|
parser.suggestColRefKeywords($$[$0-1].suggestColRefKeywords);
|
||
|
parser.addColRefIfExists($$[$0-1]);
|
||
|
}
|
||
|
|
||
|
if ($$[$0-1].suggestKeywords && $$[$0-1].suggestKeywords.length) {
|
||
|
keywords = keywords.concat(parser.createWeightedKeywords($$[$0-1].suggestKeywords, 2));
|
||
|
}
|
||
|
|
||
|
if ($$[$0-1].cursorAtEnd) {
|
||
|
keywords.push({ value: 'UNION', weight: 2.11 });
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
|
||
|
break;
|
||
|
case 911:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
this.$ = { tableReferenceList : $$[$0-1], suggestKeywords: ['LATERAL VIEW'] }
|
||
|
} else {
|
||
|
this.$ = { tableReferenceList : $$[$0-1] }
|
||
|
}
|
||
|
if (parser.isHive() && $$[$0]) {
|
||
|
parser.yy.lateralViews = $$[$0].lateralViews;
|
||
|
this.$.hasLateralViews = true;
|
||
|
if ($$[$0].suggestKeywords) {
|
||
|
this.$.suggestKeywords = this.$.suggestKeywords.concat($$[$0].suggestKeywords);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 912: case 1251:
|
||
|
|
||
|
parser.suggestTables();
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
|
||
|
break;
|
||
|
case 913:
|
||
|
|
||
|
if ($$[$0]) {
|
||
|
parser.yy.lateralViews = $$[$0].lateralViews;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 915:
|
||
|
|
||
|
var keywords = parser.getKeywordsForOptionalsLR(
|
||
|
[$$[$0-7], $$[$0-6], $$[$0-5], $$[$0-4], $$[$0-3], $$[$0-2], $$[$0-2], $$[$0-1], $$[$0]],
|
||
|
[{ value: 'WHERE', weight: 9 }, { value: 'GROUP BY', weight: 8 }, { value: 'HAVING', weight: 7 }, { value: 'WINDOW', weight: 6 }, { value: 'ORDER BY', weight: 5 }, [{ value: 'CLUSTER BY', weight: 4 }, { value: 'DISTRIBUTE BY', weight: 4 }], { value: 'SORT BY', weight: 4 }, { value: 'LIMIT', weight: 3 }, { value: 'OFFSET', weight: 2 }],
|
||
|
[true, true, true, parser.isHive(), true, parser.isHive(), parser.isHive() && !$$[$0-3], true, parser.isImpala()]);
|
||
|
|
||
|
if (keywords.length > 0) {
|
||
|
this.$ = { suggestKeywords: keywords, empty: !$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0] };
|
||
|
} else {
|
||
|
this.$ = {};
|
||
|
}
|
||
|
|
||
|
this.$.whereClauseLocation = $$[$0-7] ? _$[$0-7] : undefined;
|
||
|
this.$.limitClausePreceding = parser.firstDefined($$[$0-2], _$[$0-2], $$[$0-3], _$[$0-3], $$[$0-4], _$[$0-4], $$[$0-5], _$[$0-5], $$[$0-6], _$[$0-6], $$[$0-7], _$[$0-7]);
|
||
|
this.$.limitClauseLocation = $$[$0-1] ? _$[$0-1] : undefined;
|
||
|
|
||
|
if (!$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0]) {
|
||
|
this.$.suggestFilters = { prefix: 'WHERE', tablePrimaries: parser.yy.latestTablePrimaries.concat() };
|
||
|
}
|
||
|
if (!$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0]) {
|
||
|
this.$.suggestGroupBys = { prefix: 'GROUP BY', tablePrimaries: parser.yy.latestTablePrimaries.concat() };
|
||
|
}
|
||
|
if (!$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0]) {
|
||
|
this.$.suggestOrderBys = { prefix: 'ORDER BY', tablePrimaries: parser.yy.latestTablePrimaries.concat() };
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 916:
|
||
|
|
||
|
if (parser.yy.result.suggestColumns) {
|
||
|
parser.yy.result.suggestColumns.source = 'where';
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 917:
|
||
|
|
||
|
if (parser.yy.result.suggestColumns) {
|
||
|
parser.yy.result.suggestColumns.source = 'group by';
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 920:
|
||
|
|
||
|
if (parser.yy.result.suggestColumns) {
|
||
|
parser.yy.result.suggestColumns.source = 'order by';
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 924:
|
||
|
|
||
|
var keywords = parser.getKeywordsForOptionalsLR(
|
||
|
[$$[$0-6], $$[$0-5], $$[$0-4], $$[$0-3], $$[$0-2], $$[$0-2], $$[$0-1], $$[$0]],
|
||
|
[{ value: 'GROUP BY', weight: 8 }, { value: 'HAVING', weight: 7 }, { value: 'WINDOW', weight: 6 }, { value: 'ORDER BY', weight: 5 }, [{ value: 'CLUSTER BY', weight: 4 }, { value: 'DISTRIBUTE BY', weight: 4 }], { value: 'SORT BY', weight: 4 }, { value: 'LIMIT', weight: 3 }, { value: 'OFFSET', weight: 2 }],
|
||
|
[true, true, parser.isHive(), true, parser.isHive(), parser.isHive() && !$$[$0-3], true, parser.isImpala()]);
|
||
|
if ($$[$0-8].suggestKeywords) {
|
||
|
keywords = keywords.concat(parser.createWeightedKeywords($$[$0-8].suggestKeywords, 1));
|
||
|
}
|
||
|
this.$ = parser.getValueExpressionKeywords($$[$0-8], keywords);
|
||
|
this.$.cursorAtEnd = !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0];
|
||
|
if ($$[$0-8].columnReference) {
|
||
|
this.$.columnReference = $$[$0-8].columnReference;
|
||
|
}
|
||
|
if (!$$[$0-6]) {
|
||
|
parser.suggestGroupBys({ prefix: 'GROUP BY', tablePrimaries: parser.yy.latestTablePrimaries.concat() });
|
||
|
}
|
||
|
if (!$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3]) {
|
||
|
parser.suggestOrderBys({ prefix: 'ORDER BY', tablePrimaries: parser.yy.latestTablePrimaries.concat() });
|
||
|
}
|
||
|
this.$.whereClauseLocation = $$[$0-8] ? _$[$0-8] : undefined;
|
||
|
this.$.limitClausePreceding = parser.firstDefined($$[$0-2], _$[$0-2], $$[$0-3], _$[$0-3], $$[$0-4], _$[$0-4], $$[$0-5], _$[$0-5], $$[$0-6], _$[$0-6], $$[$0-8], _$[$0-8]);
|
||
|
this.$.limitClauseLocation = $$[$0-1] ? _$[$0-1] : undefined;
|
||
|
|
||
|
break;
|
||
|
case 925:
|
||
|
|
||
|
var keywords = parser.getKeywordsForOptionalsLR(
|
||
|
[$$[$0-5], $$[$0-4], $$[$0-3], $$[$0-2], $$[$0-2], $$[$0-1], $$[$0]],
|
||
|
[{ value: 'HAVING', weight: 7 }, { value: 'WINDOW', weight: 6 }, { value: 'ORDER BY', weight: 5 }, [{ value: 'CLUSTER BY', weight: 4 }, { value: 'DISTRIBUTE BY', weight: 4 }], { value: 'SORT BY', weight: 4 }, { value: 'LIMIT', weight: 3 }, { value: 'OFFSET', weight: 2 }],
|
||
|
[true, parser.isHive(), true, parser.isHive(), parser.isHive() && !$$[$0-3], true, parser.isImpala()]);
|
||
|
if ($$[$0-7].suggestKeywords) {
|
||
|
keywords = keywords.concat(parser.createWeightedKeywords($$[$0-7].suggestKeywords, 8));
|
||
|
}
|
||
|
if ($$[$0-7].valueExpression) {
|
||
|
this.$ = parser.getValueExpressionKeywords($$[$0-7].valueExpression, keywords);
|
||
|
if ($$[$0-7].valueExpression.columnReference) {
|
||
|
this.$.columnReference = $$[$0-7].valueExpression.columnReference;
|
||
|
}
|
||
|
} else {
|
||
|
this.$ = { suggestKeywords: keywords };
|
||
|
}
|
||
|
this.$.cursorAtEnd = !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0];
|
||
|
if (!$$[$0-5] && !$$[$0-4] && !$$[$0-3]) {
|
||
|
parser.suggestOrderBys({ prefix: 'ORDER BY', tablePrimaries: parser.yy.latestTablePrimaries.concat() });
|
||
|
}
|
||
|
this.$.whereClauseLocation = $$[$0-8] ? _$[$0-8] : undefined;
|
||
|
this.$.limitClausePreceding = parser.firstDefined($$[$0-2], _$[$0-2], $$[$0-3], _$[$0-3], $$[$0-4], _$[$0-4], $$[$0-5], _$[$0-5], $$[$0-7], _$[$0-7]);
|
||
|
this.$.limitClauseLocation = $$[$0-1] ? _$[$0-1] : undefined;
|
||
|
|
||
|
break;
|
||
|
case 926:
|
||
|
|
||
|
var keywords = parser.getKeywordsForOptionalsLR(
|
||
|
[$$[$0-4], $$[$0-3], $$[$0-2], $$[$0-2], $$[$0-1], $$[$0]],
|
||
|
[{ value: 'WINDOW', weight: 6 }, { value: 'ORDER BY', weight: 5 }, [{ value: 'CLUSTER BY', weight: 4 }, { value: 'DISTRIBUTE BY', weight: 4 }], { value: 'SORT BY', weight: 4 }, { value: 'LIMIT', weight: 3 }, { value: 'OFFSET', weight: 2 }],
|
||
|
[parser.isHive(), true, parser.isHive(), parser.isHive() && !$$[$0-3], true, parser.isImpala()]);
|
||
|
this.$ = { suggestKeywords: keywords, cursorAtEnd: !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0] };
|
||
|
if (!$$[$0-4] && !$$[$0-3]) {
|
||
|
parser.suggestOrderBys({ prefix: 'ORDER BY', tablePrimaries: parser.yy.latestTablePrimaries.concat() });
|
||
|
}
|
||
|
this.$.whereClauseLocation = $$[$0-8] ? _$[$0-8] : undefined;
|
||
|
this.$.limitClausePreceding = parser.firstDefined($$[$0-2], _$[$0-2], $$[$0-3], _$[$0-3], $$[$0-4], _$[$0-4], $$[$0-6], _$[$0-6]);
|
||
|
this.$.limitClauseLocation = $$[$0-1] ? _$[$0-1] : undefined;
|
||
|
|
||
|
break;
|
||
|
case 927:
|
||
|
|
||
|
var keywords = parser.getKeywordsForOptionalsLR([$$[$0-3], $$[$0-2], $$[$0-1], $$[$0]], [{ value: 'ORDER BY', weight: 5 }, [{ value: 'CLUSTER BY', weight: 4 }, { value: 'DISTRIBUTE BY', weight: 4 }, { value: 'SORT BY', weight: 4 }], { value: 'LIMIT', weight: 3 }, { value: 'OFFSET', weight: 2 }], [true, parser.isHive(), true, parser.isImpala()]);
|
||
|
this.$ = { suggestKeywords: keywords, cursorAtEnd: !$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0] };
|
||
|
if (!$$[$0-3]) {
|
||
|
parser.suggestOrderBys({ prefix: 'ORDER BY', tablePrimaries: parser.yy.latestTablePrimaries.concat() });
|
||
|
}
|
||
|
this.$.whereClauseLocation = $$[$0-8] ? _$[$0-8] : undefined;
|
||
|
this.$.limitClausePreceding = parser.firstDefined($$[$0-2], _$[$0-2], $$[$0-3], _$[$0-3], $$[$0-5], _$[$0-5]);
|
||
|
this.$.limitClauseLocation = $$[$0-1] ? _$[$0-1] : undefined;
|
||
|
|
||
|
break;
|
||
|
case 928:
|
||
|
|
||
|
var keywords = parser.getKeywordsForOptionalsLR([$$[$0-2], $$[$0-1], $$[$0]], [[{ value: 'CLUSTER BY', weight: 4 }, { value: 'DISTRIBUTE BY', weight: 4 }], { value: 'LIMIT', weight: 3 }, { value: 'OFFSET', weight: 2 }], [parser.isHive(), true, parser.isImpala()]);
|
||
|
if ($$[$0-4].suggestKeywords) {
|
||
|
keywords = keywords.concat(parser.createWeightedKeywords($$[$0-4].suggestKeywords, 5));
|
||
|
}
|
||
|
this.$ = { suggestKeywords: keywords, cursorAtEnd: !$$[$0-2] && !$$[$0-1] && !$$[$0] };
|
||
|
this.$.whereClauseLocation = $$[$0-8] ? _$[$0-8] : undefined;
|
||
|
this.$.limitClausePreceding = parser.firstDefined($$[$0-2], _$[$0-2], $$[$0-4], _$[$0-4]);
|
||
|
this.$.limitClauseLocation = $$[$0-1] ? _$[$0-1] : undefined;
|
||
|
|
||
|
break;
|
||
|
case 929:
|
||
|
|
||
|
var keywords = parser.getKeywordsForOptionalsLR([$$[$0-1], $$[$0]], [{ value: 'LIMIT', weight: 3 }, { value: 'OFFSET', weight: 2 }], [true, parser.isImpala()]);
|
||
|
if ($$[$0-3].suggestKeywords) {
|
||
|
keywords = keywords.concat(parser.createWeightedKeywords($$[$0-3].suggestKeywords, 4));
|
||
|
}
|
||
|
this.$ = { suggestKeywords: keywords, cursorAtEnd: !$$[$0-1] && !$$[$0] };
|
||
|
this.$.whereClauseLocation = $$[$0-8] ? _$[$0-8] : undefined;
|
||
|
this.$.limitClausePreceding = _$[$0-3];
|
||
|
this.$.limitClauseLocation = $$[$0-1] ? _$[$0-1] : undefined;
|
||
|
|
||
|
break;
|
||
|
case 930:
|
||
|
|
||
|
var keywords = parser.getKeywordsForOptionalsLR([$$[$0]], [{ value: 'OFFSET', weight: 2 }], [parser.isImpala()]);
|
||
|
this.$ = { suggestKeywords: keywords, cursorAtEnd: !$$[$0] };
|
||
|
this.$.whereClauseLocation = $$[$0-8] ? _$[$0-8] : undefined;
|
||
|
this.$.limitClausePreceding = parser.firstDefined($$[$0-3], _$[$0-3], $$[$0-4], _$[$0-4], $$[$0-5], _$[$0-5], $$[$0-6], _$[$0-6], $$[$0-7], _$[$0-7], $$[$0-8], _$[$0-8]);
|
||
|
this.$.limitClauseLocation = $$[$0-2] ? _$[$0-2] : undefined;
|
||
|
|
||
|
break;
|
||
|
case 934:
|
||
|
|
||
|
if ($$[$0].suggestFilters) {
|
||
|
parser.suggestFilters({ tablePrimaries: parser.yy.latestTablePrimaries.concat() });
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 935:
|
||
|
|
||
|
parser.suggestFunctions();
|
||
|
parser.suggestColumns();
|
||
|
parser.suggestKeywords(['EXISTS', 'NOT EXISTS']);
|
||
|
parser.suggestFilters({ tablePrimaries: parser.yy.latestTablePrimaries.concat() });
|
||
|
|
||
|
break;
|
||
|
case 938:
|
||
|
|
||
|
this.$ = { valueExpression: $$[$0] ? false : $$[$0-1] };
|
||
|
if (!$$[$0] && parser.isHive()) {
|
||
|
this.$.suggestKeywords = ['GROUPING SETS', 'WITH CUBE', 'WITH ROLLUP'];
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 939: case 988: case 1014: case 1018: case 1021:
|
||
|
|
||
|
parser.suggestSelectListAliases();
|
||
|
|
||
|
break;
|
||
|
case 940:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.suggestSelectListAliases();
|
||
|
parser.suggestGroupBys({ tablePrimaries: parser.yy.latestTablePrimaries.concat() });
|
||
|
|
||
|
break;
|
||
|
case 941:
|
||
|
|
||
|
parser.suggestKeywords(['BY']);
|
||
|
parser.suggestGroupBys({ prefix: 'BY', tablePrimaries: parser.yy.latestTablePrimaries.concat() });
|
||
|
|
||
|
break;
|
||
|
case 948:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['CUBE', 'ROLLUP']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 950:
|
||
|
|
||
|
parser.suggestKeywords(['SETS']);
|
||
|
|
||
|
break;
|
||
|
case 978:
|
||
|
|
||
|
if ($$[$0].emptyOrderBy) {
|
||
|
parser.suggestOrderBys({ tablePrimaries: parser.yy.latestTablePrimaries.concat() });
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 979:
|
||
|
|
||
|
parser.suggestKeywords(['BY']);
|
||
|
parser.suggestOrderBys({ prefix: 'BY', tablePrimaries: parser.yy.latestTablePrimaries.concat() });
|
||
|
|
||
|
break;
|
||
|
case 983:
|
||
|
|
||
|
this.$ = { emptyOrderBy: false }
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.suggestAnalyticFunctions();
|
||
|
parser.suggestSelectListAliases();
|
||
|
|
||
|
break;
|
||
|
case 984: case 985: case 986:
|
||
|
this.$ = { emptyOrderBy: false };
|
||
|
break;
|
||
|
case 987:
|
||
|
this.$ = parser.mergeSuggestKeywords($$[$0-1], $$[$0]);
|
||
|
break;
|
||
|
case 990:
|
||
|
|
||
|
this.$ = { emptyOrderBy: true }
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.suggestAnalyticFunctions();
|
||
|
parser.suggestSelectListAliases();
|
||
|
|
||
|
break;
|
||
|
case 991:
|
||
|
|
||
|
this.$ = { suggestKeywords: ['ASC', 'DESC'] };
|
||
|
|
||
|
break;
|
||
|
case 996:
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
this.$ = { suggestKeywords: ['NULLS FIRST', 'NULLS LAST'] };
|
||
|
} else {
|
||
|
this.$ = {};
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 999:
|
||
|
|
||
|
parser.suggestKeywords(['FIRST', 'LAST']);
|
||
|
|
||
|
break;
|
||
|
case 1003:
|
||
|
this.$ = { suggestKeywords: ['SORT BY'] };
|
||
|
break;
|
||
|
case 1012: case 1016: case 1020:
|
||
|
|
||
|
suggestKeywords: ['BY'];
|
||
|
|
||
|
break;
|
||
|
case 1013: case 1017:
|
||
|
|
||
|
parser.suggestColumns();
|
||
|
parser.suggestSelectListAliases();
|
||
|
|
||
|
break;
|
||
|
case 1028:
|
||
|
|
||
|
parser.addColumnLocation($$[$0-1].location, [ $$[$0-1].identifier ]);
|
||
|
this.$ = $$[$0];
|
||
|
|
||
|
break;
|
||
|
case 1039: case 1044:
|
||
|
|
||
|
parser.suggestFunctions({ types: ['BIGINT'] });
|
||
|
|
||
|
break;
|
||
|
case 1040: case 1045:
|
||
|
|
||
|
delete parser.yy.result.suggestColumns;
|
||
|
|
||
|
break;
|
||
|
case 1049: case 1050:
|
||
|
|
||
|
// verifyType($$[$0], 'BOOLEAN');
|
||
|
this.$ = { types: [ 'BOOLEAN' ] };
|
||
|
|
||
|
break;
|
||
|
case 1052:
|
||
|
|
||
|
// verifyType($$[$0], 'NUMBER');
|
||
|
this.$ = $$[$0];
|
||
|
$$[$0].types = ['NUMBER'];
|
||
|
|
||
|
break;
|
||
|
case 1053: case 1054: case 1055: case 1056: case 1057: case 1064: case 1065: case 1066: case 1067: case 1068: case 1069: case 1075: case 1076: case 1097: case 1155: case 1156: case 1218:
|
||
|
this.$ = { types: [ 'BOOLEAN' ] };
|
||
|
break;
|
||
|
case 1058:
|
||
|
|
||
|
this.$ = { types: [ 'BOOLEAN' ] };
|
||
|
// clear correlated flag after completed sub-query (set by lexer)
|
||
|
parser.yy.correlatedSubQuery = false;
|
||
|
|
||
|
break;
|
||
|
case 1060: case 1061: case 1062: case 1063:
|
||
|
|
||
|
parser.addColRefToVariableIfExists($$[$0-2], $$[$0]);
|
||
|
this.$ = { types: [ 'BOOLEAN' ] };
|
||
|
|
||
|
break;
|
||
|
case 1070: case 1071:
|
||
|
|
||
|
// verifyType($$[$0-2], 'BOOLEAN');
|
||
|
// verifyType($$[$0], 'BOOLEAN');
|
||
|
this.$ = { types: [ 'BOOLEAN' ] };
|
||
|
|
||
|
break;
|
||
|
case 1072: case 1073: case 1074:
|
||
|
|
||
|
// verifyType($$[$0-2], 'NUMBER');
|
||
|
// verifyType($$[$0], 'NUMBER');
|
||
|
this.$ = { types: [ 'NUMBER' ] };
|
||
|
|
||
|
break;
|
||
|
case 1080:
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['BETWEEN', 'EXISTS', 'IN', 'ILIKE', 'IREGEXP', 'LIKE', 'REGEXP', 'RLIKE']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['BETWEEN', 'EXISTS', 'IN', 'LIKE', 'REGEXP', 'RLIKE']);
|
||
|
}
|
||
|
this.$ = { types: [ 'BOOLEAN' ] };
|
||
|
|
||
|
break;
|
||
|
case 1081: case 1083:
|
||
|
this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0].suggestFilters };
|
||
|
break;
|
||
|
case 1082:
|
||
|
|
||
|
parser.suggestFunctions();
|
||
|
parser.suggestColumns();
|
||
|
parser.suggestKeywords(['EXISTS']);
|
||
|
this.$ = { types: [ 'BOOLEAN' ] };
|
||
|
|
||
|
break;
|
||
|
case 1084:
|
||
|
|
||
|
parser.suggestFunctions({ types: [ 'BOOLEAN' ] });
|
||
|
parser.suggestColumns({ types: [ 'BOOLEAN' ] });
|
||
|
this.$ = { types: [ 'BOOLEAN' ] };
|
||
|
|
||
|
break;
|
||
|
case 1085:
|
||
|
this.$ = { types: [ 'T' ], suggestFilters: $$[$0].suggestFilters };
|
||
|
break;
|
||
|
case 1086:
|
||
|
|
||
|
parser.suggestFunctions();
|
||
|
parser.suggestColumns();
|
||
|
this.$ = { types: [ 'T' ] };
|
||
|
|
||
|
break;
|
||
|
case 1087:
|
||
|
|
||
|
if (!$$[$0].typeSet) {
|
||
|
parser.applyTypeToSuggestions('NUMBER');
|
||
|
}
|
||
|
this.$ = { types: [ 'NUMBER' ], suggestFilters: $$[$0].suggestFilters };
|
||
|
|
||
|
break;
|
||
|
case 1088:
|
||
|
|
||
|
parser.suggestFunctions({ types: [ 'NUMBER' ] });
|
||
|
parser.suggestColumns({ types: [ 'NUMBER' ] });
|
||
|
this.$ = { types: [ 'NUMBER' ] };
|
||
|
|
||
|
break;
|
||
|
case 1089:
|
||
|
|
||
|
var keywords = ['FALSE', 'NOT NULL', 'NOT TRUE', 'NOT FALSE', 'NULL', 'TRUE'];
|
||
|
if (parser.isImpala()) {
|
||
|
keywords = keywords.concat(['DISTINCT FROM', 'NOT DISTINCT FROM', 'NOT UNKNOWN', 'UNKNOWN']);
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
this.$ = { types: [ 'BOOLEAN' ] };
|
||
|
|
||
|
break;
|
||
|
case 1090:
|
||
|
|
||
|
var keywords = ['FALSE', 'NULL', 'TRUE'];
|
||
|
if (parser.isImpala()) {
|
||
|
keywords = keywords.concat(['DISTINCT FROM', 'UNKNOWN']);
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
this.$ = { types: [ 'BOOLEAN' ] };
|
||
|
|
||
|
break;
|
||
|
case 1091:
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['FROM']);
|
||
|
}
|
||
|
this.$ = { types: [ 'BOOLEAN' ] };
|
||
|
|
||
|
break;
|
||
|
case 1092: case 1093: case 1094:
|
||
|
|
||
|
parser.suggestKeywords(['NOT']);
|
||
|
this.$ = { types: [ 'BOOLEAN' ] };
|
||
|
|
||
|
break;
|
||
|
case 1095:
|
||
|
|
||
|
parser.valueExpressionSuggest($$[$0-5], $$[$0-3] ? 'IS NOT DISTINCT FROM' : 'IS DISTINCT FROM');
|
||
|
this.$ = { types: [ 'BOOLEAN' ] };
|
||
|
|
||
|
break;
|
||
|
case 1096:
|
||
|
|
||
|
this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0].suggestFilters }
|
||
|
|
||
|
break;
|
||
|
case 1098:
|
||
|
|
||
|
this.$ = $$[$0-1];
|
||
|
|
||
|
break;
|
||
|
case 1099:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
this.$ = { types: ['T'], typeSet: true };
|
||
|
|
||
|
break;
|
||
|
case 1100:
|
||
|
|
||
|
parser.valueExpressionSuggest($$[$0], $$[$0-1]);
|
||
|
parser.applyTypeToSuggestions($$[$0].types);
|
||
|
this.$ = { types: [ 'BOOLEAN' ], typeSet: true };
|
||
|
|
||
|
break;
|
||
|
case 1101: case 1102: case 1103:
|
||
|
|
||
|
parser.valueExpressionSuggest($$[$0], $$[$0-1]);
|
||
|
parser.applyTypeToSuggestions($$[$0].types);
|
||
|
this.$ = { types: [ 'BOOLEAN' ], typeSet: true };
|
||
|
|
||
|
break;
|
||
|
case 1104: case 1105: case 1106: case 1107:
|
||
|
|
||
|
if (!$$[$0-2].typeSet) {
|
||
|
parser.applyTypeToSuggestions($$[$0].types);
|
||
|
parser.addColRefIfExists($$[$0]);
|
||
|
}
|
||
|
this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-2].suggestFilters }
|
||
|
|
||
|
break;
|
||
|
case 1108: case 1110:
|
||
|
|
||
|
parser.valueExpressionSuggest($$[$0-2], $$[$0-1]);
|
||
|
parser.applyTypeToSuggestions($$[$0-2].types);
|
||
|
this.$ = { types: [ 'BOOLEAN' ], typeSet: true };
|
||
|
|
||
|
break;
|
||
|
case 1109:
|
||
|
|
||
|
parser.valueExpressionSuggest($$[$0-2], $$[$0-1]);
|
||
|
parser.applyTypeToSuggestions($$[$0-2].types);
|
||
|
this.$ = { types: [ 'BOOLEAN' ] , typeSet: true, endsWithLessThanOrEqual: true };
|
||
|
|
||
|
break;
|
||
|
case 1111:
|
||
|
|
||
|
parser.valueExpressionSuggest($$[$0-2], $$[$0-1]);
|
||
|
parser.applyTypeToSuggestions($$[$0-2].types);
|
||
|
this.$ = { types: [ 'BOOLEAN' ], typeSet: true, endsWithLessThanOrEqual: $$[$0-1] === '<=' };
|
||
|
|
||
|
break;
|
||
|
case 1112: case 1113: case 1114: case 1115:
|
||
|
|
||
|
if (!$$[$0].typeSet) {
|
||
|
parser.applyTypeToSuggestions($$[$0-2].types);
|
||
|
parser.addColRefIfExists($$[$0-2]);
|
||
|
}
|
||
|
this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0].suggestFilters }
|
||
|
|
||
|
break;
|
||
|
case 1116:
|
||
|
|
||
|
if ($$[$0].inValueEdit) {
|
||
|
parser.valueExpressionSuggest($$[$0-3], $$[$0-2] + ' ' + $$[$0-1]);
|
||
|
parser.applyTypeToSuggestions($$[$0-3].types);
|
||
|
}
|
||
|
if ($$[$0].cursorAtStart) {
|
||
|
parser.suggestKeywords(['SELECT']);
|
||
|
}
|
||
|
this.$ = { types: [ 'BOOLEAN' ], typeSet: true };
|
||
|
|
||
|
break;
|
||
|
case 1117:
|
||
|
|
||
|
if ($$[$0].inValueEdit) {
|
||
|
parser.valueExpressionSuggest($$[$0-2], $$[$0-1]);
|
||
|
parser.applyTypeToSuggestions($$[$0-2].types);
|
||
|
}
|
||
|
if ($$[$0].cursorAtStart) {
|
||
|
parser.suggestKeywords(['SELECT']);
|
||
|
}
|
||
|
this.$ = { types: [ 'BOOLEAN' ], typeSet: true };
|
||
|
|
||
|
break;
|
||
|
case 1118: case 1119:
|
||
|
this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-5].suggestFilters };
|
||
|
break;
|
||
|
case 1120: case 1121:
|
||
|
this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-4].suggestFilters };
|
||
|
break;
|
||
|
case 1122:
|
||
|
|
||
|
if ($$[$0-2].types[0] === $$[$0].types[0] && !$$[$0-5].typeSet) {
|
||
|
parser.applyTypeToSuggestions($$[$0-2].types);
|
||
|
}
|
||
|
this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-5].suggestFilters };
|
||
|
|
||
|
break;
|
||
|
case 1123:
|
||
|
|
||
|
if ($$[$0-5].types[0] === $$[$0].types[0] && !$$[$0-2].typeSet) {
|
||
|
parser.applyTypeToSuggestions($$[$0-5].types);
|
||
|
}
|
||
|
this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-2].suggestFilters };
|
||
|
|
||
|
break;
|
||
|
case 1124:
|
||
|
|
||
|
if ($$[$0-5].types[0] === $$[$0-2].types[0] && !$$[$0].typeSet) {
|
||
|
parser.applyTypeToSuggestions($$[$0-5].types);
|
||
|
}
|
||
|
this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0].suggestFilters };
|
||
|
|
||
|
break;
|
||
|
case 1125:
|
||
|
|
||
|
parser.valueExpressionSuggest($$[$0-5], $$[$0-1]);
|
||
|
this.$ = { types: [ 'BOOLEAN' ], typeSet: true };
|
||
|
|
||
|
break;
|
||
|
case 1126: case 1132:
|
||
|
|
||
|
parser.suggestValueExpressionKeywords($$[$0-1], ['AND']);
|
||
|
this.$ = { types: [ 'BOOLEAN' ] };
|
||
|
|
||
|
break;
|
||
|
case 1127:
|
||
|
|
||
|
parser.valueExpressionSuggest($$[$0-3], $$[$0-2] + ' ' + $$[$0-1]);
|
||
|
this.$ = { types: [ 'BOOLEAN' ], typeSet: true };
|
||
|
|
||
|
break;
|
||
|
case 1128:
|
||
|
|
||
|
if ($$[$0-4].types[0] === $$[$0-2].types[0] && !$$[$0-4].typeSet) {
|
||
|
parser.applyTypeToSuggestions($$[$0-4].types)
|
||
|
}
|
||
|
this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-4].suggestFilters };
|
||
|
|
||
|
break;
|
||
|
case 1129:
|
||
|
|
||
|
if ($$[$0-4].types[0] === $$[$0-2].types[0] && !$$[$0-2].typeSet) {
|
||
|
parser.applyTypeToSuggestions($$[$0-4].types)
|
||
|
}
|
||
|
this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-2].suggestFilters };
|
||
|
|
||
|
break;
|
||
|
case 1130:
|
||
|
|
||
|
if ($$[$0-4].types[0] === $$[$0-2].types[0] && !$$[$0].typeSet) {
|
||
|
parser.applyTypeToSuggestions($$[$0-4].types)
|
||
|
}
|
||
|
this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0].suggestFilters };
|
||
|
|
||
|
break;
|
||
|
case 1131:
|
||
|
|
||
|
parser.valueExpressionSuggest($$[$0-4], $$[$0-1]);
|
||
|
parser.applyTypeToSuggestions($$[$0-4].types);
|
||
|
this.$ = { types: [ 'BOOLEAN' ], typeSet: true };
|
||
|
|
||
|
break;
|
||
|
case 1133:
|
||
|
|
||
|
parser.valueExpressionSuggest($$[$0-2], $$[$0-1]);
|
||
|
parser.applyTypeToSuggestions($$[$0-2].types);
|
||
|
this.$ = { types: [ 'BOOLEAN' ], typeSet: true };
|
||
|
|
||
|
break;
|
||
|
case 1134: case 1136: case 1138: case 1140:
|
||
|
|
||
|
parser.valueExpressionSuggest(undefined, $$[$0-1]);
|
||
|
this.$ = { types: [ 'BOOLEAN' ], typeSet: true, suggestFilters: true };
|
||
|
|
||
|
break;
|
||
|
case 1135: case 1139:
|
||
|
|
||
|
parser.addColRefIfExists($$[$0]);
|
||
|
this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-2].suggestFilters }
|
||
|
|
||
|
break;
|
||
|
case 1137: case 1141:
|
||
|
|
||
|
parser.addColRefIfExists($$[$0-2]);
|
||
|
this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0].suggestFilters }
|
||
|
|
||
|
break;
|
||
|
case 1142: case 1143:
|
||
|
|
||
|
parser.valueExpressionSuggest(undefined, $$[$0-1]);
|
||
|
parser.applyTypeToSuggestions([ 'NUMBER' ]);
|
||
|
this.$ = { types: [ 'NUMBER' ], typeSet: true };
|
||
|
|
||
|
break;
|
||
|
case 1144: case 1145: case 1146:
|
||
|
|
||
|
if (!$$[$0-2].typeSet) {
|
||
|
parser.applyTypeToSuggestions(['NUMBER']);
|
||
|
parser.addColRefIfExists($$[$0]);
|
||
|
}
|
||
|
this.$ = { types: [ 'NUMBER' ], suggestFilters: $$[$0-2].suggestFilters }
|
||
|
|
||
|
break;
|
||
|
case 1147: case 1148: case 1149:
|
||
|
|
||
|
parser.valueExpressionSuggest(undefined, $$[$0-1]);
|
||
|
parser.applyTypeToSuggestions(['NUMBER']);
|
||
|
this.$ = { types: [ 'NUMBER' ], typeSet: true };
|
||
|
|
||
|
break;
|
||
|
case 1150: case 1151: case 1152:
|
||
|
|
||
|
if (!$$[$0].typeSet) {
|
||
|
parser.applyTypeToSuggestions(['NUMBER']);
|
||
|
parser.addColRefIfExists($$[$0-2]);
|
||
|
}
|
||
|
this.$ = { types: [ 'NUMBER' ], suggestFilters: $$[$0].suggestFilters };
|
||
|
|
||
|
break;
|
||
|
case 1153:
|
||
|
this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-1].suggestFilters };
|
||
|
break;
|
||
|
case 1154:
|
||
|
this.$ = { types: [ 'BOOLEAN' ], suggestFilters: $$[$0-2].suggestFilters };
|
||
|
break;
|
||
|
case 1157:
|
||
|
|
||
|
parser.valueExpressionSuggest(undefined, $$[$0]);
|
||
|
parser.applyTypeToSuggestions([ 'STRING' ]);
|
||
|
this.$ = { types: [ 'BOOLEAN' ], typeSet: true };
|
||
|
|
||
|
break;
|
||
|
case 1158:
|
||
|
|
||
|
parser.valueExpressionSuggest(undefined, $$[$0-1] + ' ' + $$[$0]);
|
||
|
parser.applyTypeToSuggestions([ 'STRING' ]);
|
||
|
this.$ = { types: [ 'BOOLEAN' ], typeSet: true };
|
||
|
|
||
|
break;
|
||
|
case 1160:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.suggestKeywords(['WHEN']);
|
||
|
this.$ = { types: [ 'T' ], typeSet: true };
|
||
|
|
||
|
break;
|
||
|
case 1162:
|
||
|
|
||
|
parser.suggestValueExpressionKeywords($$[$0-2], ['WHEN']);
|
||
|
this.$ = { types: [ 'T' ], typeSet: true };
|
||
|
|
||
|
break;
|
||
|
case 1163:
|
||
|
|
||
|
this.$ = $$[$0];
|
||
|
this.$.suggestFilters = $$[$0-1].suggestFilters;
|
||
|
|
||
|
break;
|
||
|
case 1164:
|
||
|
this.$ = { types: [ 'T' ], suggestFilters: $$[$0-1].suggestFilters };
|
||
|
break;
|
||
|
case 1165: case 1491: case 1496: case 1497:
|
||
|
this.$ = { types: [ 'T' ] };
|
||
|
break;
|
||
|
case 1166: case 1168:
|
||
|
|
||
|
$$[$0].position = 1;
|
||
|
|
||
|
break;
|
||
|
case 1167:
|
||
|
|
||
|
$$[$0].position = $$[$0-2].position + 1;
|
||
|
this.$ = $$[$0];
|
||
|
|
||
|
break;
|
||
|
case 1169:
|
||
|
|
||
|
$$[$0-2].position += 1;
|
||
|
|
||
|
break;
|
||
|
case 1170:
|
||
|
|
||
|
$$[$0-2].position = 1;
|
||
|
|
||
|
break;
|
||
|
case 1171:
|
||
|
|
||
|
$$[$0-4].position += 1;
|
||
|
|
||
|
break;
|
||
|
case 1172:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
$$[$0-2].position += 1;
|
||
|
|
||
|
break;
|
||
|
case 1173:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
$$[$0-4].position += 1;
|
||
|
|
||
|
break;
|
||
|
case 1174:
|
||
|
|
||
|
parser.suggestValueExpressionKeywords($$[$0-3]);
|
||
|
|
||
|
break;
|
||
|
case 1175: case 1176:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
this.$ = { cursorAtStart : true, position: 1 };
|
||
|
|
||
|
break;
|
||
|
case 1177: case 1178:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
this.$ = { position: 2 };
|
||
|
|
||
|
break;
|
||
|
case 1182:
|
||
|
this.$ = { types: ['COLREF'], columnReference: $$[$0].chain };
|
||
|
break;
|
||
|
case 1183:
|
||
|
|
||
|
// We need to handle arbitrary UDFs here instead of inside UserDefinedFunction or there will be a conflict
|
||
|
// with columnReference for functions like: db.udf(foo)
|
||
|
var fn = $$[$0-1].chain[$$[$0-1].chain.length - 1].name.toLowerCase();
|
||
|
$$[$0-1].lastLoc.type = 'function';
|
||
|
$$[$0-1].lastLoc.function = fn;
|
||
|
$$[$0-1].lastLoc.location = {
|
||
|
first_line: $$[$0-1].lastLoc.location.first_line,
|
||
|
last_line: $$[$0-1].lastLoc.location.last_line,
|
||
|
first_column: $$[$0-1].lastLoc.location.first_column,
|
||
|
last_column: $$[$0-1].lastLoc.location.last_column - 1
|
||
|
}
|
||
|
if ($$[$0-1].lastLoc !== $$[$0-1].firstLoc) {
|
||
|
$$[$0-1].firstLoc.type = 'database';
|
||
|
} else {
|
||
|
delete $$[$0-1].lastLoc.identifierChain;
|
||
|
}
|
||
|
if ($$[$0].expression) {
|
||
|
this.$ = { function: fn, expression: $$[$0].expression, types: parser.findReturnTypes(fn) }
|
||
|
} else {
|
||
|
this.$ = { function: fn, types: parser.findReturnTypes(fn) }
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1184:
|
||
|
|
||
|
parser.addFunctionLocation(_$[$0-1], $$[$0-1]);
|
||
|
if ($$[$0].expression) {
|
||
|
this.$ = { function: $$[$0-1], expression: $$[$0].expression, types: parser.findReturnTypes($$[$0-1]) }
|
||
|
} else {
|
||
|
this.$ = { function: $$[$0-1], types: parser.findReturnTypes($$[$0-1]) }
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1186:
|
||
|
this.$ = { types: [ 'NULL' ] };
|
||
|
break;
|
||
|
case 1187:
|
||
|
this.$ = { types: [ 'TIMESTAMP' ] };
|
||
|
break;
|
||
|
case 1189:
|
||
|
|
||
|
if ($$[$0].suggestKeywords) {
|
||
|
this.$ = { types: ['COLREF'], columnReference: $$[$0], suggestKeywords: $$[$0].suggestKeywords };
|
||
|
} else {
|
||
|
this.$ = { types: ['COLREF'], columnReference: $$[$0] };
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1190:
|
||
|
|
||
|
var fn = $$[$0-1].chain[$$[$0-1].chain.length - 1].name.toLowerCase();
|
||
|
$$[$0-1].lastLoc.type = 'function';
|
||
|
$$[$0-1].lastLoc.function = fn;
|
||
|
$$[$0-1].lastLoc.location = {
|
||
|
first_line: $$[$0-1].lastLoc.location.first_line,
|
||
|
last_line: $$[$0-1].lastLoc.location.last_line,
|
||
|
first_column: $$[$0-1].lastLoc.location.first_column,
|
||
|
last_column: $$[$0-1].lastLoc.location.last_column - 1
|
||
|
}
|
||
|
if ($$[$0-1].lastLoc !== $$[$0-1].firstLoc) {
|
||
|
$$[$0-1].firstLoc.type = 'database';
|
||
|
} else {
|
||
|
delete $$[$0-1].lastLoc.identifierChain;
|
||
|
}
|
||
|
if ($$[$0].position) {
|
||
|
parser.applyArgumentTypesToSuggestions(fn, $$[$0].position);
|
||
|
}
|
||
|
this.$ = { types: parser.findReturnTypes(fn) };
|
||
|
|
||
|
break;
|
||
|
case 1191: case 1396: case 1397:
|
||
|
|
||
|
parser.addFunctionLocation(_$[$0-1], $$[$0-1]);
|
||
|
if ($$[$0].position) {
|
||
|
parser.applyArgumentTypesToSuggestions($$[$0-1], $$[$0].position);
|
||
|
}
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-1]) };
|
||
|
|
||
|
break;
|
||
|
case 1194:
|
||
|
|
||
|
var lastLoc = parser.yy.locations[parser.yy.locations.length - 1];
|
||
|
if (lastLoc.type !== 'variable') {
|
||
|
lastLoc.type = 'column';
|
||
|
}
|
||
|
// used for function references with db prefix
|
||
|
var firstLoc = parser.yy.locations[parser.yy.locations.length - $$[$0].length];
|
||
|
this.$ = { chain: $$[$0], firstLoc: firstLoc, lastLoc: lastLoc }
|
||
|
|
||
|
break;
|
||
|
case 1198:
|
||
|
|
||
|
parser.suggestKeywords(['DAYS', 'HOURS', 'MICROSECONDS', 'MILLISECONDS', 'MINUTES', 'MONTHS', 'NANOSECONDS', 'SECONDS', 'WEEKS', 'YEARS']);
|
||
|
|
||
|
break;
|
||
|
case 1203:
|
||
|
|
||
|
parser.suggestValues($$[$0]);
|
||
|
|
||
|
break;
|
||
|
case 1204:
|
||
|
this.$ = { types: [ 'NUMBER' ] };
|
||
|
break;
|
||
|
case 1210: case 1212:
|
||
|
this.$ = $$[$0-1] + $$[$0];
|
||
|
break;
|
||
|
case 1211:
|
||
|
this.$ = $$[$0-2] + $$[$0-1] + $$[$0];
|
||
|
break;
|
||
|
case 1216: case 1217:
|
||
|
|
||
|
if (/\$\{[^}]*\}/.test($$[$0])) {
|
||
|
parser.addVariableLocation(_$[$0], $$[$0]);
|
||
|
this.$ = { types: [ 'STRING' ], columnReference: [{ name: $$[$0] }] }
|
||
|
} else {
|
||
|
this.$ = { types: [ 'STRING' ] }
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1219:
|
||
|
|
||
|
this.$ = { partialQuote: '\'', missingEndQuote: parser.yy.missingEndQuote };
|
||
|
|
||
|
break;
|
||
|
case 1220:
|
||
|
|
||
|
this.$ = { partialQuote: '"', missingEndQuote: parser.yy.missingEndQuote };
|
||
|
|
||
|
break;
|
||
|
case 1225:
|
||
|
|
||
|
if ($$[$0]) {
|
||
|
parser.addColumnAliasLocation($$[$0].location, $$[$0].alias, _$[$0-1]);
|
||
|
this.$ = { valueExpression: $$[$0-1], alias: $$[$0].alias };
|
||
|
if (!parser.yy.selectListAliases) {
|
||
|
parser.yy.selectListAliases = [];
|
||
|
}
|
||
|
parser.yy.selectListAliases.push({ name: $$[$0].alias, types: $$[$0-1].types || ['T'] });
|
||
|
} else {
|
||
|
this.$ = { valueExpression: $$[$0-1] }
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1226:
|
||
|
|
||
|
parser.addAsteriskLocation(_$[$0], [{ asterisk: true }]);
|
||
|
this.$ = { asterisk: true }
|
||
|
|
||
|
break;
|
||
|
case 1227:
|
||
|
|
||
|
if ($$[$0]) {
|
||
|
parser.addColumnAliasLocation($$[$0].location, $$[$0].alias, _$[$0-1]);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1228:
|
||
|
|
||
|
parser.suggestFunctions();
|
||
|
parser.suggestColumns();
|
||
|
parser.addColumnAliasLocation(_$[$0], $$[$0], _$[$0-2]);
|
||
|
this.$ = { suggestAggregateFunctions: true };
|
||
|
|
||
|
break;
|
||
|
case 1230: case 1586:
|
||
|
this.$ = [ $$[$0] ];
|
||
|
break;
|
||
|
case 1231:
|
||
|
|
||
|
$$[$0-2].push($$[$0]);
|
||
|
|
||
|
break;
|
||
|
case 1233: case 1234:
|
||
|
|
||
|
this.$ = { cursorAtStart : true, suggestFunctions: true, suggestColumns: true, suggestAggregateFunctions: true };
|
||
|
|
||
|
break;
|
||
|
case 1236:
|
||
|
|
||
|
parser.checkForSelectListKeywords($$[$0-2]);
|
||
|
|
||
|
break;
|
||
|
case 1237:
|
||
|
|
||
|
parser.checkForSelectListKeywords($$[$0-3]);
|
||
|
|
||
|
break;
|
||
|
case 1238:
|
||
|
|
||
|
this.$ = { suggestKeywords: parser.getSelectListKeywords(), suggestTables: true, suggestDatabases: true, suggestFunctions: true, suggestColumns: true, suggestAggregateFunctions: true };
|
||
|
|
||
|
break;
|
||
|
case 1240: case 1241: case 1243:
|
||
|
|
||
|
this.$ = { suggestKeywords: parser.getSelectListKeywords(), suggestFunctions: true, suggestColumns: true, suggestAggregateFunctions: true, };
|
||
|
|
||
|
break;
|
||
|
case 1254:
|
||
|
|
||
|
this.$ = $$[$0];
|
||
|
|
||
|
if (parser.yy.latestTablePrimaries.length > 0) {
|
||
|
var idx = parser.yy.latestTablePrimaries.length - 1;
|
||
|
var tables = [];
|
||
|
do {
|
||
|
var tablePrimary = parser.yy.latestTablePrimaries[idx];
|
||
|
if (!tablePrimary.subQueryAlias) {
|
||
|
tables.unshift(tablePrimary.alias ? { identifierChain: tablePrimary.identifierChain, alias: tablePrimary.alias } : { identifierChain: tablePrimary.identifierChain })
|
||
|
}
|
||
|
idx--;
|
||
|
} while (idx >= 0 && tablePrimary.join && !tablePrimary.subQueryAlias)
|
||
|
|
||
|
if (tables.length > 0) {
|
||
|
this.$.suggestJoins = {
|
||
|
prependJoin: true,
|
||
|
tables: tables
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1261:
|
||
|
|
||
|
if ($$[$0] && $$[$0].valueExpression) {
|
||
|
this.$ = $$[$0].valueExpression;
|
||
|
} else {
|
||
|
this.$ = {};
|
||
|
}
|
||
|
this.$.joinType = $$[$0-3];
|
||
|
if ($$[$0].noJoinCondition) {
|
||
|
this.$.suggestJoinConditions = { prependOn: true, tablePrimaries: parser.yy.latestTablePrimaries.concat() }
|
||
|
}
|
||
|
if ($$[$0].suggestKeywords) {
|
||
|
this.$.suggestKeywords = $$[$0].suggestKeywords;
|
||
|
}
|
||
|
if (parser.yy.latestTablePrimaries.length > 0) {
|
||
|
parser.yy.latestTablePrimaries[parser.yy.latestTablePrimaries.length - 1].join = true;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1262:
|
||
|
|
||
|
if ($$[$0] && $$[$0].valueExpression) {
|
||
|
this.$ = $$[$0].valueExpression;
|
||
|
} else {
|
||
|
this.$ = {};
|
||
|
}
|
||
|
this.$.joinType = $$[$0-4];
|
||
|
if ($$[$0].noJoinCondition) {
|
||
|
this.$.suggestJoinConditions = { prependOn: true, tablePrimaries: parser.yy.latestTablePrimaries.concat() }
|
||
|
}
|
||
|
if ($$[$0].suggestKeywords) {
|
||
|
this.$.suggestKeywords = $$[$0].suggestKeywords;
|
||
|
}
|
||
|
if (parser.yy.latestTablePrimaries.length > 0) {
|
||
|
parser.yy.latestTablePrimaries[parser.yy.latestTablePrimaries.length - 1].join = true;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1263:
|
||
|
this.$ = { joinType: $$[$0-1] };
|
||
|
break;
|
||
|
case 1264:
|
||
|
this.$ = { joinType: $$[$0-2] };
|
||
|
break;
|
||
|
case 1268:
|
||
|
|
||
|
if ($$[$0-3].suggestKeywords) {
|
||
|
parser.suggestKeywords($$[$0-3].suggestKeywords);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1269: case 1822:
|
||
|
|
||
|
if ($$[$0-1].suggestKeywords) {
|
||
|
parser.suggestKeywords($$[$0-1].suggestKeywords);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1272:
|
||
|
|
||
|
if (!$$[$0-2] && parser.isImpala()) {
|
||
|
parser.suggestKeywords(['[BROADCAST]', '[SHUFFLE]']);
|
||
|
}
|
||
|
if (!$$[$0-2] && parser.yy.latestTablePrimaries.length > 0) {
|
||
|
var idx = parser.yy.latestTablePrimaries.length - 1;
|
||
|
var tables = [];
|
||
|
do {
|
||
|
var tablePrimary = parser.yy.latestTablePrimaries[idx];
|
||
|
if (!tablePrimary.subQueryAlias) {
|
||
|
tables.unshift(tablePrimary.alias ? { identifierChain: tablePrimary.identifierChain, alias: tablePrimary.alias } : { identifierChain: tablePrimary.identifierChain })
|
||
|
}
|
||
|
idx--;
|
||
|
} while (idx >= 0 && tablePrimary.join && !tablePrimary.subQueryAlias)
|
||
|
|
||
|
if (tables.length > 0) {
|
||
|
parser.suggestJoins({
|
||
|
prependJoin: false,
|
||
|
joinType: $$[$0-3],
|
||
|
tables: tables
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
parser.suggestTables();
|
||
|
parser.suggestDatabases({
|
||
|
appendDot: true
|
||
|
});
|
||
|
|
||
|
break;
|
||
|
case 1277:
|
||
|
this.$ = 'JOIN';
|
||
|
break;
|
||
|
case 1278:
|
||
|
this.$ = 'ANTI JOIN';
|
||
|
break;
|
||
|
case 1279:
|
||
|
this.$ = 'CROSS JOIN';
|
||
|
break;
|
||
|
case 1280:
|
||
|
this.$ = 'INNER JOIN';
|
||
|
break;
|
||
|
case 1281:
|
||
|
this.$ = 'OUTER JOIN';
|
||
|
break;
|
||
|
case 1282:
|
||
|
this.$ = 'SEMI JOIN';
|
||
|
break;
|
||
|
case 1283:
|
||
|
this.$ = 'FULL JOIN';
|
||
|
break;
|
||
|
case 1284:
|
||
|
this.$ = 'FULL OUTER JOIN';
|
||
|
break;
|
||
|
case 1285:
|
||
|
this.$ = 'LEFT JOIN';
|
||
|
break;
|
||
|
case 1286:
|
||
|
this.$ = 'LEFT ANTI JOIN';
|
||
|
break;
|
||
|
case 1287:
|
||
|
this.$ = 'LEFT INNER JOIN';
|
||
|
break;
|
||
|
case 1288:
|
||
|
this.$ = 'LEFT OUTER JOIN';
|
||
|
break;
|
||
|
case 1289:
|
||
|
this.$ = 'LEFT SEMI JOIN';
|
||
|
break;
|
||
|
case 1290:
|
||
|
this.$ = 'RIGHT JOIN';
|
||
|
break;
|
||
|
case 1291:
|
||
|
this.$ = 'RIGHT ANTI JOIN';
|
||
|
break;
|
||
|
case 1292: case 1293:
|
||
|
this.$ = 'RIGHT OUTER JOIN';
|
||
|
break;
|
||
|
case 1294:
|
||
|
this.$ = 'RIGHT SEMI JOIN';
|
||
|
break;
|
||
|
case 1295: case 1296: case 1297: case 1298: case 1299: case 1300: case 1302: case 1303: case 1304: case 1305: case 1307: case 1308: case 1309: case 1310:
|
||
|
this.$ = { suggestKeywords: ['JOIN'] };
|
||
|
break;
|
||
|
case 1301:
|
||
|
this.$ = { suggestKeywords: ['OUTER'] };
|
||
|
break;
|
||
|
case 1306:
|
||
|
this.$ = { suggestKeywords: parser.isImpala() ? ['ANTI', 'INNER', 'OUTER', 'SEMI'] : parser.isHive() ? ['OUTER', 'SEMI'] : ['OUTER'] };
|
||
|
break;
|
||
|
case 1311:
|
||
|
this.$ = { suggestKeywords: parser.isImpala() ? ['ANTI', 'INNER', 'OUTER', 'SEMI'] : ['OUTER'] };
|
||
|
break;
|
||
|
case 1312:
|
||
|
this.$ = { noJoinCondition: true, suggestKeywords: parser.isImpala() ? ['ON', 'USING'] : ['ON'] };
|
||
|
break;
|
||
|
case 1313:
|
||
|
this.$ = { valueExpression: $$[$0] };
|
||
|
break;
|
||
|
case 1314: case 2118:
|
||
|
this.$ = {};
|
||
|
break;
|
||
|
case 1318:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.suggestJoinConditions({ prependOn: false });
|
||
|
|
||
|
break;
|
||
|
case 1319:
|
||
|
|
||
|
this.$ = {
|
||
|
primary: $$[$0-3]
|
||
|
}
|
||
|
if ($$[$0-3].identifierChain) {
|
||
|
if ($$[$0-1]) {
|
||
|
$$[$0-3].alias = $$[$0-1].alias
|
||
|
parser.addTableAliasLocation($$[$0-1].location, $$[$0-1].alias, $$[$0-3].identifierChain);
|
||
|
}
|
||
|
parser.addTablePrimary($$[$0-3]);
|
||
|
}
|
||
|
var keywords = [];
|
||
|
if ($$[$0] && $$[$0].suggestKeywords) {
|
||
|
keywords = $$[$0].suggestKeywords;
|
||
|
} else {
|
||
|
// Right-to-left for cursor after TablePrimary
|
||
|
keywords = parser.getKeywordsForOptionalsLR([$$[$0], $$[$0-1], $$[$0-2]], [{ value: 'TABLESAMPLE', weight: 1 }, { value: 'AS', weight: 2 }, { value: 'TABLESAMPLE', weight: 3 }], [parser.isImpala(), true, parser.isHive()]);
|
||
|
}
|
||
|
if (keywords.length > 0) {
|
||
|
this.$.suggestKeywords = keywords;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1320:
|
||
|
|
||
|
this.$ = {
|
||
|
primary: $$[$0-2]
|
||
|
};
|
||
|
|
||
|
if ($$[$0-1]) {
|
||
|
this.$.primary.alias = $$[$0-1].alias;
|
||
|
parser.addTablePrimary({ subQueryAlias: $$[$0-1].alias });
|
||
|
parser.addSubqueryAliasLocation($$[$0-1].location, $$[$0-1].alias, $$[$0-2].identifierChain);
|
||
|
}
|
||
|
|
||
|
var keywords = [];
|
||
|
if ($$[$0] && $$[$0].suggestKeywords) {
|
||
|
keywords = $$[$0].suggestKeywords;
|
||
|
} else {
|
||
|
keywords = parser.getKeywordsForOptionalsLR([$$[$0], $$[$0-1]], [{ value: 'TABLESAMPLE', weight: 1 }, { value: 'AS', weight: 2 }], [parser.isImpala(), true]);
|
||
|
}
|
||
|
if (keywords.length > 0) {
|
||
|
this.$.suggestKeywords = keywords;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1321:
|
||
|
|
||
|
if ($$[$0-1]) {
|
||
|
parser.addTableAliasLocation($$[$0-1].location, $$[$0-1].alias, $$[$0-3].identifierChain);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1322: case 1323:
|
||
|
|
||
|
if ($$[$0-1]) {
|
||
|
$$[$0-3].alias = $$[$0-1].alias;
|
||
|
parser.addTableAliasLocation($$[$0-1].location, $$[$0-1].alias, $$[$0-3].identifierChain);
|
||
|
}
|
||
|
parser.addTablePrimary($$[$0-3]);
|
||
|
|
||
|
break;
|
||
|
case 1324:
|
||
|
|
||
|
if ($$[$0-1]) {
|
||
|
parser.addTablePrimary({ subQueryAlias: $$[$0-1].alias });
|
||
|
parser.addSubqueryAliasLocation($$[$0-1].location, $$[$0-1].alias);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1335:
|
||
|
|
||
|
parser.suggestKeywords(['BUCKET']);
|
||
|
|
||
|
break;
|
||
|
case 1336:
|
||
|
|
||
|
parser.suggestKeywords(['OUT OF']);
|
||
|
|
||
|
break;
|
||
|
case 1337:
|
||
|
|
||
|
parser.suggestKeywords(['OF']);
|
||
|
|
||
|
break;
|
||
|
case 1338:
|
||
|
|
||
|
if (!$$[$0-2]) {
|
||
|
parser.suggestKeywords(['ON']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1340:
|
||
|
|
||
|
if ($$[$0-2].indexOf('.') === -1 ) {
|
||
|
parser.suggestKeywords(['PERCENT', 'ROWS']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['PERCENT']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1342:
|
||
|
this.$ = { suggestKeywords: ['REPEATABLE()'] };
|
||
|
break;
|
||
|
case 1344:
|
||
|
|
||
|
parser.suggestKeywords(['SYSTEM()']);
|
||
|
|
||
|
break;
|
||
|
case 1349:
|
||
|
|
||
|
parser.pushQueryState();
|
||
|
|
||
|
break;
|
||
|
case 1350:
|
||
|
|
||
|
parser.popQueryState();
|
||
|
|
||
|
break;
|
||
|
case 1352:
|
||
|
|
||
|
if ($$[$0-1]) {
|
||
|
$$[$0-2].alias = $$[$0-1].alias;
|
||
|
parser.addTablePrimary({ subQueryAlias: $$[$0-1].alias });
|
||
|
parser.addSubqueryAliasLocation($$[$0-1].location, $$[$0-1].alias, $$[$0-2].identifierChain);
|
||
|
}
|
||
|
this.$ = $$[$0-2];
|
||
|
|
||
|
break;
|
||
|
case 1355:
|
||
|
|
||
|
var subQuery = parser.getSubQuery($$[$0]);
|
||
|
subQuery.columns.forEach(function (column) {
|
||
|
parser.expandIdentifierChain({ wrapper: column });
|
||
|
delete column.linked;
|
||
|
});
|
||
|
parser.popQueryState(subQuery);
|
||
|
this.$ = subQuery;
|
||
|
|
||
|
break;
|
||
|
case 1372: case 1373:
|
||
|
this.$ = { alias: $$[$0], location: _$[$0] };
|
||
|
break;
|
||
|
case 1378:
|
||
|
|
||
|
if ($$[$0-1] && $$[$0].lateralView) {
|
||
|
$$[$0-1].lateralViews.push($$[$0].lateralView);
|
||
|
this.$ = $$[$0-1];
|
||
|
} else if ($$[$0].lateralView) {
|
||
|
this.$ = { lateralViews: [ $$[$0].lateralView ] };
|
||
|
}
|
||
|
if ($$[$0].suggestKeywords) {
|
||
|
this.$.suggestKeywords = $$[$0].suggestKeywords
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1380:
|
||
|
|
||
|
if (!$$[$0]) {
|
||
|
$$[$0-1].suggestKeywords = ['OVER'];
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1389:
|
||
|
|
||
|
parser.suggestKeywords(['OVER']);
|
||
|
|
||
|
break;
|
||
|
case 1394: case 1395:
|
||
|
|
||
|
parser.addFunctionLocation(_$[$0-1], $$[$0-1]);
|
||
|
if ($$[$0].expression) {
|
||
|
this.$ = { function: $$[$0-1], expression: $$[$0].expression, types: parser.findReturnTypes($$[$0-1]) }
|
||
|
} else {
|
||
|
this.$ = { function: $$[$0-1], types: parser.findReturnTypes($$[$0-1]) }
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1405:
|
||
|
this.$ = { expression: $$[$0-1] };
|
||
|
break;
|
||
|
case 1406:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
this.$ = { position: 1 }
|
||
|
|
||
|
break;
|
||
|
case 1407:
|
||
|
|
||
|
parser.suggestValueExpressionKeywords($$[$0-1]);
|
||
|
|
||
|
break;
|
||
|
case 1415: case 1503: case 1569:
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-2]) };
|
||
|
break;
|
||
|
case 1416:
|
||
|
this.$ = { function: $$[$0-3], expression: $$[$0-2], types: parser.findReturnTypes($$[$0-3]) };
|
||
|
break;
|
||
|
case 1417:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.applyArgumentTypesToSuggestions($$[$0-3], 1);
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-3]) };
|
||
|
|
||
|
break;
|
||
|
case 1418:
|
||
|
|
||
|
parser.suggestValueExpressionKeywords($$[$0-2]);
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-4]) };
|
||
|
|
||
|
break;
|
||
|
case 1419:
|
||
|
|
||
|
parser.applyArgumentTypesToSuggestions($$[$0-3], $$[$0-1].position);
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-3]) };
|
||
|
|
||
|
break;
|
||
|
case 1427: case 1428:
|
||
|
|
||
|
if (parser.yy.result.suggestFunctions) {
|
||
|
parser.suggestAggregateFunctions();
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1429:
|
||
|
|
||
|
if (!$$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords([{ value: 'PARTITION BY', weight: 2 }, { value: 'ORDER BY', weight: 1 }]);
|
||
|
} else if (!$$[$0-2]) {
|
||
|
parser.suggestKeywords(['PARTITION BY']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1430:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestValueExpressionKeywords($$[$0-3], [{ value: 'ORDER BY', weight: 2 }]);
|
||
|
} else {
|
||
|
parser.suggestValueExpressionKeywords($$[$0-3]);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1434: case 1753: case 2237: case 2238: case 2241: case 2251: case 2285: case 2294: case 2312: case 2367: case 2368: case 2373: case 2378: case 2382:
|
||
|
|
||
|
parser.suggestKeywords(['BY']);
|
||
|
|
||
|
break;
|
||
|
case 1439:
|
||
|
|
||
|
// Only allowed in last order by
|
||
|
delete parser.yy.result.suggestAnalyticFunctions;
|
||
|
|
||
|
break;
|
||
|
case 1440:
|
||
|
|
||
|
var keywords = [];
|
||
|
if ($$[$0-2].suggestKeywords) {
|
||
|
keywords = parser.createWeightedKeywords($$[$0-2].suggestKeywords, 2);
|
||
|
}
|
||
|
if (!$$[$0]) {
|
||
|
keywords = keywords.concat([{ value: 'RANGE BETWEEN', weight: 1 }, { value: 'ROWS BETWEEN', weight: 1 }]);
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
|
||
|
break;
|
||
|
case 1446:
|
||
|
|
||
|
parser.suggestKeywords(parser.isHive() ? ['BETWEEN', 'UNBOUNDED'] : ['BETWEEN']);
|
||
|
|
||
|
break;
|
||
|
case 1447:
|
||
|
|
||
|
if (!$$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords(['CURRENT ROW', 'UNBOUNDED PRECEDING']);
|
||
|
} else if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['AND']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1450:
|
||
|
|
||
|
if (!$$[$0-1] && parser.isHive()) {
|
||
|
parser.suggestKeywords(['PRECEDING']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1452:
|
||
|
|
||
|
lexer.popState();
|
||
|
|
||
|
break;
|
||
|
case 1453:
|
||
|
|
||
|
lexer.begin('hdfs');
|
||
|
|
||
|
break;
|
||
|
case 1455:
|
||
|
|
||
|
parser.suggestHdfs({ path: $$[$0-3] });
|
||
|
|
||
|
break;
|
||
|
case 1456:
|
||
|
|
||
|
parser.suggestHdfs({ path: $$[$0-2] });
|
||
|
|
||
|
break;
|
||
|
case 1457:
|
||
|
|
||
|
parser.suggestHdfs({ path: $$[$0-1] });
|
||
|
|
||
|
break;
|
||
|
case 1458:
|
||
|
|
||
|
parser.suggestHdfs({ path: '' });
|
||
|
|
||
|
break;
|
||
|
case 1459:
|
||
|
|
||
|
parser.suggestHdfs({ path: '' });
|
||
|
|
||
|
break;
|
||
|
case 1465:
|
||
|
|
||
|
parser.suggestKeywords(['PRECEDING']);
|
||
|
|
||
|
break;
|
||
|
case 1466: case 1476:
|
||
|
|
||
|
parser.suggestKeywords(['ROW']);
|
||
|
|
||
|
break;
|
||
|
case 1475:
|
||
|
|
||
|
parser.suggestKeywords(['CURRENT ROW', 'UNBOUNDED FOLLOWING']);
|
||
|
|
||
|
break;
|
||
|
case 1477:
|
||
|
|
||
|
parser.suggestKeywords(['FOLLOWING']);
|
||
|
|
||
|
break;
|
||
|
case 1483:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.suggestAggregateFunctions();
|
||
|
parser.suggestSelectListAliases(true);
|
||
|
|
||
|
break;
|
||
|
case 1484:
|
||
|
|
||
|
parser.suggestAggregateFunctions();
|
||
|
parser.suggestSelectListAliases(true);
|
||
|
|
||
|
break;
|
||
|
case 1490: case 1495:
|
||
|
this.$ = { types: [ $$[$0-1].toUpperCase() ] };
|
||
|
break;
|
||
|
case 1492:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
this.$ = { types: [ $$[$0-1].toUpperCase() ] };
|
||
|
|
||
|
break;
|
||
|
case 1493: case 1494:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
this.$ = { types: [ 'T' ] };
|
||
|
|
||
|
break;
|
||
|
case 1498:
|
||
|
|
||
|
parser.suggestValueExpressionKeywords($$[$0-3], [{ value: 'AS', weight: 2 }]);
|
||
|
this.$ = { types: [ $$[$0-1].toUpperCase() ] };
|
||
|
|
||
|
break;
|
||
|
case 1499:
|
||
|
|
||
|
parser.suggestValueExpressionKeywords($$[$0-2], [{ value: 'AS', weight: 2 }]);
|
||
|
this.$ = { types: [ 'T' ] };
|
||
|
|
||
|
break;
|
||
|
case 1500: case 1501:
|
||
|
|
||
|
parser.suggestKeywords(parser.getTypeKeywords());
|
||
|
this.$ = { types: [ 'T' ] };
|
||
|
|
||
|
break;
|
||
|
case 1502: case 1524:
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-3]) };
|
||
|
break;
|
||
|
case 1504: case 1525: case 1568:
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-4]) };
|
||
|
break;
|
||
|
case 1505:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
var keywords = parser.getSelectListKeywords();
|
||
|
if (!$$[$0-2]) {
|
||
|
keywords.push('DISTINCT');
|
||
|
if (parser.isImpala()) {
|
||
|
keywords.push('ALL');
|
||
|
}
|
||
|
if (parser.yy.result.suggestKeywords) {
|
||
|
keywords = parser.yy.result.suggestKeywords.concat(keywords);
|
||
|
}
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-4]) };
|
||
|
|
||
|
break;
|
||
|
case 1506: case 1527: case 1571:
|
||
|
|
||
|
parser.suggestValueExpressionKeywords($$[$0-2]);
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-5]) };
|
||
|
|
||
|
break;
|
||
|
case 1507:
|
||
|
|
||
|
if ($$[$0-1].cursorAtStart) {
|
||
|
var keywords = parser.getSelectListKeywords();
|
||
|
if (!$$[$0-2]) {
|
||
|
keywords.push('DISTINCT');
|
||
|
if (parser.isImpala()) {
|
||
|
keywords.push('ALL');
|
||
|
}
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
}
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-4]) };
|
||
|
|
||
|
break;
|
||
|
case 1508: case 1512:
|
||
|
this.$ = { types: ['INT'] };
|
||
|
break;
|
||
|
case 1509:
|
||
|
|
||
|
parser.suggestKeywords(['DAY', 'DAYOFWEEK', 'HOUR', 'MINUTE', 'MONTH', 'QUARTER', 'SECOND', 'WEEK', 'YEAR']);
|
||
|
this.$ = { types: ['INT'] }
|
||
|
|
||
|
break;
|
||
|
case 1510: case 1514:
|
||
|
|
||
|
parser.suggestKeywords(['FROM']);
|
||
|
this.$ = { types: ['INT'] }
|
||
|
|
||
|
break;
|
||
|
case 1511:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
this.$ = { types: ['INT'] }
|
||
|
|
||
|
break;
|
||
|
case 1513:
|
||
|
|
||
|
parser.suggestKeywords(['DAY', 'DAYOFWEEK', 'HOUR', 'MINUTE', 'MONTH', 'QUARTER', 'SECOND', 'WEEK', 'YEAR']);
|
||
|
this.$ = { types: ['INT'] }
|
||
|
|
||
|
break;
|
||
|
case 1526:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
var keywords = parser.getSelectListKeywords(true);
|
||
|
if (!$$[$0-2]) {
|
||
|
if ($$[$0-4].toLowerCase() === 'group_concat') {
|
||
|
keywords.push('ALL');
|
||
|
} else if (parser.isImpala()) {
|
||
|
keywords.push('ALL');
|
||
|
keywords.push('DISTINCT');
|
||
|
} else {
|
||
|
keywords.push('DISTINCT');
|
||
|
}
|
||
|
}
|
||
|
if (parser.yy.result.suggestKeywords) {
|
||
|
keywords = parser.yy.result.suggestKeywords.concat(keywords);
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
parser.applyArgumentTypesToSuggestions($$[$0-4], 1);
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-4]) };
|
||
|
|
||
|
break;
|
||
|
case 1528:
|
||
|
|
||
|
if ($$[$0-1].cursorAtStart) {
|
||
|
var keywords = parser.getSelectListKeywords(true);
|
||
|
if (!$$[$0-2]) {
|
||
|
if ($$[$0-4].toLowerCase() === 'group_concat') {
|
||
|
keywords.push('ALL');
|
||
|
} else if (parser.isImpala()) {
|
||
|
keywords.push('ALL');
|
||
|
keywords.push('DISTINCT');
|
||
|
} else {
|
||
|
keywords.push('DISTINCT');
|
||
|
}
|
||
|
}
|
||
|
if (parser.yy.result.suggestKeywords) {
|
||
|
keywords = parser.yy.result.suggestKeywords.concat(keywords);
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
}
|
||
|
if (parser.yy.result.suggestFunctions && !parser.yy.result.suggestFunctions.types) {
|
||
|
parser.applyArgumentTypesToSuggestions($$[$0-4], $$[$0-1].position);
|
||
|
}
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-4]) };
|
||
|
|
||
|
break;
|
||
|
case 1554:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.applyTypeToSuggestions($$[$0-2].toLowerCase() === 'from' ? ['STRING'] : ['TIMESTAMP']);
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-5]) };
|
||
|
|
||
|
break;
|
||
|
case 1555:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.applyTypeToSuggestions($$[$0-1].toLowerCase() === 'from' ? ['STRING'] : ['TIMESTAMP']);
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-4]) };
|
||
|
|
||
|
break;
|
||
|
case 1556:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.applyTypeToSuggestions(['STRING', 'TIMESTAMP']);
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-3]) };
|
||
|
|
||
|
break;
|
||
|
case 1557:
|
||
|
|
||
|
parser.applyTypeToSuggestions($$[$0-2].toLowerCase() === 'from' ? ['STRING'] : ['TIMESTAMP']);
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-5]) };
|
||
|
|
||
|
break;
|
||
|
case 1558:
|
||
|
|
||
|
parser.applyTypeToSuggestions($$[$0-1].toLowerCase() === 'from' ? ['STRING'] : ['TIMESTAMP']);
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-4]) };
|
||
|
|
||
|
break;
|
||
|
case 1559:
|
||
|
|
||
|
parser.applyTypeToSuggestions(['STRING', 'TIMESTAMP']);
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-3]) };
|
||
|
|
||
|
break;
|
||
|
case 1560:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.applyTypeToSuggestions($$[$0-2].toLowerCase() === 'from' ? ['TIMESTAMP'] : ['STRING']);
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-5]) };
|
||
|
|
||
|
break;
|
||
|
case 1561:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.applyTypeToSuggestions($$[$0-1].toLowerCase() === 'from' ? ['TIMESTAMP'] : ['STRING']);
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-4]) };
|
||
|
|
||
|
break;
|
||
|
case 1562:
|
||
|
|
||
|
parser.applyTypeToSuggestions($$[$0-2].toLowerCase() === 'from' ? ['TIMESTAMP'] : ['STRING']);
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-5]) };
|
||
|
|
||
|
break;
|
||
|
case 1563:
|
||
|
|
||
|
parser.applyTypeToSuggestions($$[$0-1].toLowerCase() === 'from' ? ['TIMESTAMP'] : ['STRING']);
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-4]) };
|
||
|
|
||
|
break;
|
||
|
case 1564:
|
||
|
|
||
|
if ($$[$0-3].types[0] === 'STRING') {
|
||
|
parser.suggestValueExpressionKeywords($$[$0-3], ['FROM']);
|
||
|
} else {
|
||
|
parser.suggestValueExpressionKeywords($$[$0-3]);
|
||
|
}
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-5]) };
|
||
|
|
||
|
break;
|
||
|
case 1565:
|
||
|
|
||
|
if ($$[$0-2].types[0] === 'STRING') {
|
||
|
parser.suggestValueExpressionKeywords($$[$0-2], ['FROM']);
|
||
|
} else {
|
||
|
parser.suggestValueExpressionKeywords($$[$0-2]);
|
||
|
}
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-4]) };
|
||
|
|
||
|
break;
|
||
|
case 1570:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.applyArgumentTypesToSuggestions($$[$0-4], 1);
|
||
|
var keywords = parser.getSelectListKeywords(true);
|
||
|
if (!$$[$0-2]) {
|
||
|
keywords.push('DISTINCT');
|
||
|
if (parser.isImpala()) {
|
||
|
keywords.push('ALL');
|
||
|
}
|
||
|
}
|
||
|
if (parser.yy.result.suggestKeywords) {
|
||
|
keywords = parser.yy.result.suggestKeywords.concat(keywords);
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-4]) };
|
||
|
|
||
|
break;
|
||
|
case 1572:
|
||
|
|
||
|
if (parser.yy.result.suggestFunctions && ! parser.yy.result.suggestFunctions.types) {
|
||
|
parser.applyArgumentTypesToSuggestions($$[$0-4], 1);
|
||
|
}
|
||
|
this.$ = { types: parser.findReturnTypes($$[$0-4]) };
|
||
|
|
||
|
break;
|
||
|
case 1573:
|
||
|
this.$ = { lateralView: { udtf: $$[$0-2], tableAlias: $$[$0-1], columnAliases: $$[$0] }};
|
||
|
break;
|
||
|
case 1574:
|
||
|
|
||
|
if ($$[$0-1].function.toLowerCase() === 'explode') {
|
||
|
this.$ = { lateralView: { udtf: $$[$0-1], tableAlias: $$[$0], columnAliases: ['key', 'value'] }, suggestKeywords: ['AS'] };
|
||
|
} else if ($$[$0-1].function.toLowerCase() === 'posexplode') {
|
||
|
this.$ = { lateralView: { udtf: $$[$0-1], tableAlias: $$[$0], columnAliases: ['pos', 'val'] }, suggestKeywords: ['AS'] };
|
||
|
} else {
|
||
|
this.$ = { lateralView: { udtf: $$[$0-1], tableAlias: $$[$0], columnAliases: [] }, suggestKeywords: ['AS'] };
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1575:
|
||
|
this.$ = { lateralView: { udtf: $$[$0-1], columnAliases: $$[$0] }};
|
||
|
break;
|
||
|
case 1582:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords([{ value: 'OUTER', weight: 2 }, { value: 'explode', weight: 1 }, { value: 'posexplode', weight: 1 }]);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['explode', 'posexplode']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1583:
|
||
|
|
||
|
parser.suggestKeywords(['VIEW']);
|
||
|
|
||
|
break;
|
||
|
case 1587:
|
||
|
this.$ = [ $$[$0-2], $$[$0] ];
|
||
|
break;
|
||
|
case 1591:
|
||
|
this.$ = { inValueEdit: true };
|
||
|
break;
|
||
|
case 1592:
|
||
|
this.$ = { inValueEdit: true, cursorAtStart: true };
|
||
|
break;
|
||
|
case 1593: case 1594: case 1595: case 1596: case 1597:
|
||
|
this.$ = { suggestKeywords: ['NOT'] };
|
||
|
break;
|
||
|
case 1603: case 1604: case 1605: case 1606: case 1607:
|
||
|
|
||
|
parser.suggestFunctions({ types: [ 'STRING' ] });
|
||
|
parser.suggestColumns({ types: [ 'STRING' ] });
|
||
|
this.$ = { types: ['BOOLEAN'] }
|
||
|
|
||
|
break;
|
||
|
case 1608: case 1610:
|
||
|
this.$ = parser.findCaseType($$[$0-1]);
|
||
|
break;
|
||
|
case 1609: case 1612:
|
||
|
|
||
|
$$[$0-3].caseTypes.push($$[$0-1]);
|
||
|
this.$ = parser.findCaseType($$[$0-3]);
|
||
|
|
||
|
break;
|
||
|
case 1611:
|
||
|
|
||
|
parser.suggestValueExpressionKeywords($$[$0-1], ['END']);
|
||
|
$$[$0-3].caseTypes.push($$[$0-1]);
|
||
|
this.$ = parser.findCaseType($$[$0-3]);
|
||
|
|
||
|
break;
|
||
|
case 1613:
|
||
|
this.$ = parser.findCaseType($$[$0-2]);
|
||
|
break;
|
||
|
case 1614:
|
||
|
|
||
|
if ($$[$0].toLowerCase() !== 'end') {
|
||
|
parser.suggestValueExpressionKeywords($$[$0-3], [{ value: 'END', weight: 3 }, { value: 'ELSE', weight: 2 }, { value: 'WHEN', weight: 1 }]);
|
||
|
} else {
|
||
|
parser.suggestValueExpressionKeywords($$[$0-3], [{ value: 'ELSE', weight: 2 }, { value: 'WHEN', weight: 1 }]);
|
||
|
}
|
||
|
this.$ = parser.findCaseType($$[$0-3]);
|
||
|
|
||
|
break;
|
||
|
case 1615:
|
||
|
|
||
|
if ($$[$0].toLowerCase() !== 'end') {
|
||
|
parser.suggestValueExpressionKeywords($$[$0-2], [{ value: 'END', weight: 3 }, { value: 'ELSE', weight: 2 }, { value: 'WHEN', weight: 1 }]);
|
||
|
} else {
|
||
|
parser.suggestValueExpressionKeywords($$[$0-2], [{ value: 'ELSE', weight: 2 }, { value: 'WHEN', weight: 1 }]);
|
||
|
}
|
||
|
this.$ = parser.findCaseType($$[$0-2]);
|
||
|
|
||
|
break;
|
||
|
case 1616:
|
||
|
|
||
|
$$[$0-3].caseTypes.push($$[$0-1]);
|
||
|
this.$ = parser.findCaseType($$[$0-3]);
|
||
|
this.$.suggestFilters = $$[$0-1].suggestFilters
|
||
|
|
||
|
break;
|
||
|
case 1617:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
this.$ = parser.findCaseType($$[$0-3]);
|
||
|
|
||
|
break;
|
||
|
case 1618:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
this.$ = { types: [ 'T' ], typeSet: true };
|
||
|
|
||
|
break;
|
||
|
case 1619:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.suggestKeywords(['WHEN']);
|
||
|
this.$ = $$[$0-1];
|
||
|
|
||
|
break;
|
||
|
case 1620:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.suggestKeywords(['WHEN']);
|
||
|
this.$ = { types: [ 'T' ] };
|
||
|
|
||
|
break;
|
||
|
case 1623:
|
||
|
this.$ = { caseTypes: [ $$[$0] ], lastType: $$[$0] };
|
||
|
break;
|
||
|
case 1624:
|
||
|
|
||
|
$$[$0-1].caseTypes.push($$[$0]);
|
||
|
this.$ = { caseTypes: $$[$0-1].caseTypes, lastType: $$[$0] };
|
||
|
|
||
|
break;
|
||
|
case 1628:
|
||
|
|
||
|
parser.suggestValueExpressionKeywords($$[$0-2], ['WHEN']);
|
||
|
|
||
|
break;
|
||
|
case 1631:
|
||
|
this.$ = { caseTypes: [{ types: ['T'] }], suggestFilters: $$[$0].suggestFilters };
|
||
|
break;
|
||
|
case 1632:
|
||
|
this.$ = { caseTypes: [{ types: ['T'] }], suggestFilters: $$[$0-1].suggestFilters };
|
||
|
break;
|
||
|
case 1633:
|
||
|
this.$ = { caseTypes: [$$[$0]], suggestFilters: $$[$0-2].suggestFilters };
|
||
|
break;
|
||
|
case 1634: case 1635:
|
||
|
this.$ = { caseTypes: [$$[$0]], suggestFilters: $$[$0].suggestFilters };
|
||
|
break;
|
||
|
case 1636:
|
||
|
|
||
|
parser.suggestKeywords(['WHEN']);
|
||
|
this.$ = { caseTypes: [{ types: ['T'] }] };
|
||
|
|
||
|
break;
|
||
|
case 1637:
|
||
|
|
||
|
parser.suggestKeywords(['WHEN']);
|
||
|
this.$ = { caseTypes: [$$[$0]] };
|
||
|
|
||
|
break;
|
||
|
case 1638:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.suggestKeywords(['WHEN']);
|
||
|
this.$ = { caseTypes: [{ types: ['T'] }] };
|
||
|
|
||
|
break;
|
||
|
case 1639:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.suggestKeywords(['WHEN']);
|
||
|
this.$ = { caseTypes: [{ types: ['T'] }] };
|
||
|
|
||
|
break;
|
||
|
case 1640: case 1642:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
this.$ = { caseTypes: [{ types: ['T'] }], suggestFilters: true };
|
||
|
|
||
|
break;
|
||
|
case 1641:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
parser.suggestKeywords(['THEN']);
|
||
|
this.$ = { caseTypes: [{ types: ['T'] }], suggestFilters: true };
|
||
|
|
||
|
break;
|
||
|
case 1643:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
this.$ = { caseTypes: [$$[$0]], suggestFilters: true };
|
||
|
|
||
|
break;
|
||
|
case 1644:
|
||
|
|
||
|
parser.suggestValueExpressionKeywords($$[$0-1], ['THEN']);
|
||
|
this.$ = { caseTypes: [{ types: ['T'] }] };
|
||
|
|
||
|
break;
|
||
|
case 1645:
|
||
|
|
||
|
parser.suggestValueExpressionKeywords($$[$0-2], ['THEN']);
|
||
|
this.$ = { caseTypes: [{ types: ['T'] }] };
|
||
|
|
||
|
break;
|
||
|
case 1646: case 1647: case 1648: case 1649:
|
||
|
|
||
|
parser.valueExpressionSuggest();
|
||
|
this.$ = { caseTypes: [{ types: ['T'] }] };
|
||
|
|
||
|
break;
|
||
|
case 1664:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['DATABASE', 'INDEX', 'SCHEMA', 'TABLE', 'VIEW']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['TABLE', 'VIEW']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1665: case 1667:
|
||
|
|
||
|
parser.addDatabaseLocation(_$[$0-3], [ { name: $$[$0-3] } ]);
|
||
|
|
||
|
break;
|
||
|
case 1666:
|
||
|
|
||
|
parser.addDatabaseLocation(_$[$0-2], [ { name: $$[$0-2] } ]);
|
||
|
|
||
|
break;
|
||
|
case 1668:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestDatabases();
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1669:
|
||
|
|
||
|
parser.addDatabaseLocation(_$[$0-1], [ { name: $$[$0-1] } ]);
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['SET DBPROPERTIES', 'SET LOCATION', 'SET OWNER']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1670:
|
||
|
|
||
|
parser.addDatabaseLocation(_$[$0-2], [ { name: $$[$0-2] } ]);
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['DBPROPERTIES', 'LOCATION', 'OWNER']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1671: case 1965:
|
||
|
|
||
|
parser.addDatabaseLocation(_$[$0-2], [ { name: $$[$0-2] } ]);
|
||
|
|
||
|
break;
|
||
|
case 1672:
|
||
|
|
||
|
parser.addDatabaseLocation(_$[$0-3], [ { name: $$[$0-3] } ]);
|
||
|
parser.suggestKeywords(['GROUP', 'ROLE', 'USER']);
|
||
|
|
||
|
break;
|
||
|
case 1673:
|
||
|
|
||
|
parser.addDatabaseLocation(_$[$0-3], [ { name: $$[$0-3] } ]);
|
||
|
|
||
|
break;
|
||
|
case 1675: case 1758: case 2313: case 2686: case 3010: case 3222: case 3238: case 3240:
|
||
|
|
||
|
parser.suggestKeywords(['ON']);
|
||
|
|
||
|
break;
|
||
|
case 1679:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['PARTITION', 'REBUILD']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['REBUILD']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1700:
|
||
|
|
||
|
if (!$$[$0-1] && parser.isImpala()) {
|
||
|
parser.suggestKeywords([{ value: 'IF NOT EXISTS', weight: 4 }, { value: 'COLUMNS', weight: 3 }, { value: 'PARTITION', weight: 2 }, { value: 'RANGE PARTITION', weight: 1 }]);
|
||
|
} else if (!$$[$0-1] && parser.isHive()) {
|
||
|
parser.suggestKeywords([{ value: 'IF NOT EXISTS', weight: 3 }, { value: 'COLUMNS', weight: 2 }, { value: 'CONSTRAINT', weight: 1 }, { value: 'PARTITION', weight: 1 }]);
|
||
|
} else if (parser.isImpala()) {
|
||
|
parser.suggestKeywords([{ value: 'PARTITION', weight: 2 }, { value: 'RANGE PARTITION', weight: 1 }]);
|
||
|
} else if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['PARTITION']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1701: case 1722: case 1992:
|
||
|
|
||
|
parser.suggestKeywords(['COLUMNS']);
|
||
|
|
||
|
break;
|
||
|
case 1706:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
if (!$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords(['LOCATION', 'PARTITION']);
|
||
|
} else if ($$[$0-2] && $$[$0-2].suggestKeywords) {
|
||
|
var keywords = parser.createWeightedKeywords($$[$0-2].suggestKeywords, 2);
|
||
|
keywords.push({ value: 'PARTITION', weight: 1 });
|
||
|
parser.suggestKeywords(keywords);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['PARTITION']);
|
||
|
}
|
||
|
} else if (parser.isImpala()) {
|
||
|
if (!$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords(['LOCATION', 'CACHED IN', 'UNCACHED']);
|
||
|
} else if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['CACHED IN', 'UNCACHED']);
|
||
|
} else if ($$[$0-1] && $$[$0-1].suggestKeywords) {
|
||
|
parser.suggestKeywords($$[$0-1].suggestKeywords);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1708: case 1741: case 1749: case 1761: case 1839: case 1865: case 3294:
|
||
|
|
||
|
parser.suggestKeywords(['PARTITION']);
|
||
|
|
||
|
break;
|
||
|
case 1709: case 1866:
|
||
|
|
||
|
parser.suggestKeywords(['VALUE']);
|
||
|
|
||
|
break;
|
||
|
case 1713:
|
||
|
|
||
|
parser.suggestKeywords(['FOREIGN KEY', 'PRIMARY KEY']);
|
||
|
|
||
|
break;
|
||
|
case 1720:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['ADD COLUMNS', 'ADD IF NOT EXISTS', 'ADD PARTITION', 'ARCHIVE PARTITION', 'CHANGE',
|
||
|
'CLUSTERED BY', 'CONCATENATE', 'COMPACT', 'DISABLE NO_DROP', 'DISABLE OFFLINE', 'DROP', 'ENABLE NO_DROP',
|
||
|
'ENABLE OFFLINE', 'EXCHANGE PARTITION', 'NOT SKEWED', 'NOT STORED AS DIRECTORIES', 'PARTITION',
|
||
|
'RECOVER PARTITIONS', 'RENAME TO', 'REPLACE COLUMNS', 'SET FILEFORMAT', 'SET LOCATION', 'SET OWNER', 'SET SERDE',
|
||
|
'SET SERDEPROPERTIES', 'SET SKEWED LOCATION', 'SET TBLPROPERTIES', 'SKEWED BY', 'TOUCH', 'UNARCHIVE PARTITION']);
|
||
|
} else if (parser.isImpala()) {
|
||
|
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',
|
||
|
'REPLACE COLUMNS', 'SET CACHED IN', 'SET COLUMN STATS', 'SET FILEFORMAT', 'SET LOCATION', 'SET ROW FORMAT',
|
||
|
'SET SERDEPROPERTIES', 'SET TBLPROPERTIES', 'SET UNCACHED']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1721:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['ADD COLUMNS', 'CHANGE', 'COMPACT', 'CONCATENATE', 'DISABLE NO_DROP', 'DISABLE OFFLINE',
|
||
|
'ENABLE NO_DROP', 'ENABLE OFFLINE', 'RENAME TO PARTITION', 'REPLACE COLUMNS', 'SET FILEFORMAT', 'SET LOCATION',
|
||
|
'SET SERDE', 'SET SERDEPROPERTIES']);
|
||
|
} else if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['SET CACHED IN', 'SET FILEFORMAT', 'SET LOCATION', 'SET ROW FORMAT',
|
||
|
'SET SERDEPROPERTIES', 'SET TBLPROPERTIES', 'SET UNCACHED']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1723:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['FILEFORMAT', 'LOCATION', 'SERDE', 'SERDEPROPERTIES']);
|
||
|
} else if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['CACHED IN', 'FILEFORMAT', 'LOCATION', 'ROW FORMAT', 'SERDEPROPERTIES','TBLPROPERTIES', 'UNCACHED']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1724:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['FILEFORMAT', 'LOCATION', 'OWNER', 'SERDE', 'SERDEPROPERTIES', 'SKEWED LOCATION', 'TBLPROPERTIES']);
|
||
|
} else if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['CACHED IN', 'COLUMN STATS', 'FILEFORMAT', 'LOCATION', 'ROW FORMAT', 'SERDEPROPERTIES', 'TBLPROPERTIES', 'UNCACHED']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1726: case 1953: case 2744: case 2760:
|
||
|
|
||
|
parser.suggestKeywords(['TO']);
|
||
|
|
||
|
break;
|
||
|
case 1728: case 1750: case 2246:
|
||
|
|
||
|
parser.suggestKeywords(['PARTITIONS']);
|
||
|
|
||
|
break;
|
||
|
case 1745:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['SKEWED', 'STORED AS DIRECTORIES']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1746: case 1942:
|
||
|
|
||
|
parser.suggestKeywords(['AS DIRECTORIES']);
|
||
|
|
||
|
break;
|
||
|
case 1747: case 1943:
|
||
|
|
||
|
parser.suggestKeywords(['DIRECTORIES']);
|
||
|
|
||
|
break;
|
||
|
case 1748:
|
||
|
|
||
|
parser.suggestKeywords(['TO PARTITION']);
|
||
|
|
||
|
break;
|
||
|
case 1751: case 2424: case 2443:
|
||
|
|
||
|
parser.suggestKeywords(['LOCATION']);
|
||
|
|
||
|
break;
|
||
|
case 1754: case 2740: case 2745: case 2749: case 2816: case 2817: case 2818: case 2851: case 2859: case 2862: case 2865: case 2870: case 2873:
|
||
|
|
||
|
parser.suggestKeywords(['GROUP', 'ROLE', 'USER']);
|
||
|
|
||
|
break;
|
||
|
case 1759:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['STORED AS DIRECTORIES']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1763: case 1770: case 1804: case 1807: case 1809:
|
||
|
|
||
|
parser.addColumnLocation($$[$0-3].location, [ $$[$0-3].identifier ]);
|
||
|
|
||
|
break;
|
||
|
case 1764:
|
||
|
|
||
|
parser.addColumnLocation($$[$0-2].location, [ $$[$0-2].identifier ]);
|
||
|
|
||
|
break;
|
||
|
case 1765: case 1773: case 1774:
|
||
|
|
||
|
parser.addColumnLocation($$[$0-1].location, [ $$[$0-1].identifier ]);
|
||
|
|
||
|
break;
|
||
|
case 1766:
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['COLUMN']);
|
||
|
}
|
||
|
parser.suggestColumns();
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1767:
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['DROP DEFAULT', 'SET BLOCK_SIZE', 'SET COMMENT', 'SET COMPRESSION', 'SET DEFAULT',
|
||
|
'SET ENCODING']);
|
||
|
parser.addColumnLocation($$[$0-1].location, [ $$[$0-1].identifier ]);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1768:
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['DEFAULT']);
|
||
|
parser.addColumnLocation($$[$0-2].location, [ $$[$0-2].identifier ]);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1769:
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['BLOCK_SIZE', 'COMMENT', 'COMPRESSION', 'DEFAULT', 'ENCODING']);
|
||
|
parser.addColumnLocation($$[$0-2].location, [ $$[$0-2].identifier ]);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1771: case 2022: case 2668: case 3171: case 3295:
|
||
|
|
||
|
parser.suggestKeywords(['STATS']);
|
||
|
|
||
|
break;
|
||
|
case 1791:
|
||
|
|
||
|
parser.suggestIdentifiers(['\'avgSize\'', '\'maxSize\'', '\'numDVs\'', '\'numNulls\'']);
|
||
|
|
||
|
break;
|
||
|
case 1806:
|
||
|
|
||
|
if (parser.isHive() && !$$[$0-1]) {
|
||
|
parser.suggestKeywords(['COLUMN']);
|
||
|
}
|
||
|
parser.suggestColumns();
|
||
|
|
||
|
break;
|
||
|
case 1808:
|
||
|
|
||
|
if (parser.isHive() && !$$[$0-2] && !$$[$0-1]) {
|
||
|
if ($$[$0-3].suggestKeywords) {
|
||
|
var keywords = parser.createWeightedKeywords($$[$0-3].suggestKeywords, 3);
|
||
|
keywords = keywords.concat([{ value: 'AFTER', weight: 2 }, { value: 'FIRST', weight: 2 }, { value: 'CASCADE', weight: 1 }, { value: 'RESTRICT', weight: 1 }]);
|
||
|
parser.suggestKeywords(keywords);
|
||
|
} else {
|
||
|
parser.suggestKeywords([{ value: 'AFTER', weight: 2 }, { value: 'FIRST', weight: 2 }, { value: 'CASCADE', weight: 1 }, { value: 'RESTRICT', weight: 1 }]);
|
||
|
}
|
||
|
} else if (parser.isHive() && $$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords(['CASCADE', 'RESTRICT']);
|
||
|
}
|
||
|
parser.addColumnLocation($$[$0-4].location, [ $$[$0-4].identifier ]);
|
||
|
|
||
|
break;
|
||
|
case 1810:
|
||
|
|
||
|
if (!$$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords(['AND WAIT', 'WITH OVERWRITE TBLPROPERTIES']);
|
||
|
} else if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['WITH OVERWRITE TBLPROPERTIES']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1813:
|
||
|
|
||
|
parser.suggestKeywords(['NO_DROP', 'OFFLINE']);
|
||
|
|
||
|
break;
|
||
|
case 1815: case 2332:
|
||
|
|
||
|
parser.suggestFileFormats();
|
||
|
|
||
|
break;
|
||
|
case 1818:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['WITH REPLICATION =']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1820:
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['FORMAT']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1821: case 2956:
|
||
|
|
||
|
parser.suggestKeywords(['DELIMITED']);
|
||
|
|
||
|
break;
|
||
|
case 1824:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['WITH SERDEPROPERTIES']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1828:
|
||
|
|
||
|
parser.suggestKeywords(['WAIT']);
|
||
|
|
||
|
break;
|
||
|
case 1831:
|
||
|
|
||
|
parser.suggestKeywords(['OVERWRITE TBLPROPERTIES']);
|
||
|
|
||
|
break;
|
||
|
case 1832:
|
||
|
|
||
|
parser.suggestKeywords(['TBLPROPERTIES']);
|
||
|
|
||
|
break;
|
||
|
case 1835:
|
||
|
|
||
|
if (parser.isHive() && !$$[$0-1]) {
|
||
|
parser.suggestKeywords(['CASCADE', 'RESTRICT']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1840:
|
||
|
|
||
|
parser.suggestKeywords(['WITH TABLE']);
|
||
|
|
||
|
break;
|
||
|
case 1841: case 1960: case 1974: case 2536: case 2560: case 2700: case 3090: case 3099: case 3226:
|
||
|
|
||
|
parser.suggestKeywords(['TABLE']);
|
||
|
|
||
|
break;
|
||
|
case 1859:
|
||
|
|
||
|
parser.addColumnLocation($$[$0].location, [ $$[$0].identifier ]);
|
||
|
|
||
|
break;
|
||
|
case 1860:
|
||
|
|
||
|
if (parser.isHive() && !$$[$0-1]) {
|
||
|
parser.suggestKeywords([{ value: 'CONSTRAINT', weight: 1}, { value: 'PARTITION', weight: 1}, { value: 'IF EXISTS', weight: 2 }]);
|
||
|
} else if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['PARTITION']);
|
||
|
} else if (parser.isImpala() && !$$[$0-1]) {
|
||
|
parser.suggestKeywords([{ value: 'COLUMN', weight: 1 }, { value: 'PARTITION', weight: 1 }, { value: 'RANGE PARTITION', weight: 1 }, { value: 'IF EXISTS', weight: 2 }]);
|
||
|
parser.suggestColumns();
|
||
|
} else if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['PARTITION', 'RANGE PARTITION']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1862:
|
||
|
|
||
|
if (parser.isHive() && !$$[$0-1]) {
|
||
|
parser.suggestKeywords(['PURGE']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1873: case 1976: case 2677:
|
||
|
|
||
|
if (parser.yy.result.suggestTables) {
|
||
|
parser.yy.result.suggestTables.onlyTables = true;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1874: case 1961: case 1975:
|
||
|
|
||
|
parser.suggestTables({ onlyTables: true });
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
|
||
|
break;
|
||
|
case 1899:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['CASCADE']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1907: case 1908: case 1909:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['PARTITION']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1925:
|
||
|
|
||
|
if (!$$[$0]) {
|
||
|
this.$ = { suggestKeywords: ['LOCATION'] };
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1949:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['AS', 'SET TBLPROPERTIES']);
|
||
|
} else if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['AS', 'RENAME TO']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['AS']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1950:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['TBLPROPERTIES']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1956: case 1962: case 2698:
|
||
|
|
||
|
if (parser.yy.result.suggestTables) {
|
||
|
parser.yy.result.suggestTables.onlyViews = true;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1957:
|
||
|
|
||
|
parser.suggestTables({ onlyViews: true });
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
|
||
|
break;
|
||
|
case 1959:
|
||
|
|
||
|
parser.suggestKeywords(['REPAIR TABLE']);
|
||
|
|
||
|
break;
|
||
|
case 1964: case 2435: case 2646:
|
||
|
|
||
|
parser.suggestKeywords(['FUNCTION']);
|
||
|
|
||
|
break;
|
||
|
case 1966:
|
||
|
|
||
|
parser.suggestKeywords(['ON DATABASE']);
|
||
|
|
||
|
break;
|
||
|
case 1967:
|
||
|
|
||
|
parser.suggestKeywords(['DATABASE']);
|
||
|
|
||
|
break;
|
||
|
case 1969:
|
||
|
|
||
|
parser.addDatabaseLocation(_$[$0-1], [ { name: $$[$0-1] } ]);
|
||
|
parser.suggestKeywords(['IS']);
|
||
|
|
||
|
break;
|
||
|
case 1970:
|
||
|
|
||
|
parser.addDatabaseLocation(_$[$0-2], [ { name: $$[$0-2] } ]);
|
||
|
parser.suggestKeywords(['NULL']);
|
||
|
|
||
|
break;
|
||
|
case 1973:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-6]);
|
||
|
|
||
|
break;
|
||
|
case 1978:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords([{ value: 'PARTITION', weight: 2 }, { value: 'COMPUTE STATISTICS', weight: 1 }]);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['COMPUTE STATISTICS']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 1979:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-3]);
|
||
|
parser.suggestKeywords(['STATISTICS']);
|
||
|
|
||
|
break;
|
||
|
case 1980:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-7]);
|
||
|
parser.suggestKeywords(parser.getKeywordsForOptionalsLR([$$[$0-2], $$[$0-1], $$[$0]], [{ value: 'FOR COLUMNS', weight: 3 }, { value: 'CACHE METADATA', weight: 2 }, { value: 'NOSCAN', weight: 1 }]));
|
||
|
|
||
|
break;
|
||
|
case 1981:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-7]);
|
||
|
parser.suggestKeywords(parser.getKeywordsForOptionalsLR([$$[$0-1], $$[$0]], [{ value: 'CACHE METADATA', weight: 2 }, { value: 'NOSCAN', weight: 1 }]));
|
||
|
|
||
|
break;
|
||
|
case 1982:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-7]);
|
||
|
parser.suggestKeywords(parser.getKeywordsForOptionalsLR([$$[$0]], [{ value: 'NOSCAN', weight: 1 }]));
|
||
|
|
||
|
break;
|
||
|
case 1983:
|
||
|
|
||
|
parser.suggestKeywords(['TABLE']);
|
||
|
parser.addTablePrimary($$[$0-1]);
|
||
|
|
||
|
break;
|
||
|
case 1984:
|
||
|
|
||
|
parser.suggestKeywords(['TABLE']);
|
||
|
parser.addTablePrimary($$[$0-6]);
|
||
|
|
||
|
break;
|
||
|
case 1996: case 2008:
|
||
|
|
||
|
parser.suggestKeywords(['METADATA']);
|
||
|
|
||
|
break;
|
||
|
case 2001:
|
||
|
|
||
|
parser.suggestTables();
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
parser.suggestKeywords(['FUNCTIONS']);
|
||
|
|
||
|
break;
|
||
|
case 2003: case 3062: case 3204:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['PARTITION']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2011:
|
||
|
|
||
|
parser.addTablePrimary($$[$0]);
|
||
|
parser.suggestKeywords(['METADATA']);
|
||
|
|
||
|
break;
|
||
|
case 2014:
|
||
|
|
||
|
parser.suggestKeywords(['STATS', 'INCREMENTAL STATS']);
|
||
|
|
||
|
break;
|
||
|
case 2017:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-1]);
|
||
|
parser.suggestKeywords(['STATS', 'INCREMENTAL STATS']);
|
||
|
|
||
|
break;
|
||
|
case 2018:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-3]);
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['TABLESAMPLE']);
|
||
|
} else if ($$[$0-1].suggestKeywords) {
|
||
|
parser.suggestKeywords($$[$0-1].suggestKeywords);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2021: case 2667:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-1]);
|
||
|
parser.suggestKeywords(['INCREMENTAL']);
|
||
|
|
||
|
break;
|
||
|
case 2023:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-1]);
|
||
|
parser.suggestKeywords(['STATS']);
|
||
|
|
||
|
break;
|
||
|
case 2026:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
if (!$$[$0]) {
|
||
|
parser.suggestKeywords(['PARTITION']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2041:
|
||
|
|
||
|
if ($$[$0-1]) {
|
||
|
parser.suggestKeywords(['TABLE']);
|
||
|
} else if (parser.isHive()) {
|
||
|
if ($$[$0-2]) {
|
||
|
parser.suggestKeywords(['EXTERNAL TABLE', 'FUNCTION', 'MACRO', 'TABLE']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['DATABASE', 'EXTERNAL TABLE', 'FUNCTION', 'INDEX', 'ROLE', 'SCHEMA', 'TABLE', 'TEMPORARY EXTERNAL TABLE', 'TEMPORARY FUNCTION', 'TEMPORARY MACRO', 'TEMPORARY TABLE', 'VIEW']);
|
||
|
}
|
||
|
} else if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['AGGREGATE FUNCTION', 'DATABASE', 'EXTERNAL TABLE', 'FUNCTION', 'ROLE', 'SCHEMA', 'TABLE', 'VIEW']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['DATABASE', 'ROLE', 'SCHEMA', 'TABLE', 'VIEW']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2044: case 2073:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['IF NOT EXISTS']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2046:
|
||
|
|
||
|
if (!$$[$0-2]) {
|
||
|
parser.suggestKeywords(['IF NOT EXISTS']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2049:
|
||
|
|
||
|
var keywords = [];
|
||
|
if (!$$[$0] && parser.isHive()) {
|
||
|
keywords.push('WITH DBPROPERTIES');
|
||
|
}
|
||
|
if (!$$[$0-1] && !$$[$0]) {
|
||
|
keywords.push('LOCATION');
|
||
|
}
|
||
|
if (!$$[$0-2] && !$$[$0-1] && !$$[$0]) {
|
||
|
keywords.push('COMMENT');
|
||
|
}
|
||
|
if (keywords.length > 0) {
|
||
|
parser.suggestKeywords(keywords);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2064:
|
||
|
|
||
|
parser.suggestKeywords(['DBPROPERTIES']);
|
||
|
|
||
|
break;
|
||
|
case 2087:
|
||
|
|
||
|
var keywords = [];
|
||
|
if (!$$[$0-11] && !$$[$0-10] && !$$[$0-9] && !$$[$0-8] && !$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
keywords.push({ value: 'LIKE', weight: 1 });
|
||
|
if (parser.isImpala()) {
|
||
|
keywords.push({ value: 'LIKE PARQUET', weight: 1 });
|
||
|
}
|
||
|
} else {
|
||
|
if (!$$[$0-10] && !$$[$0-9] && !$$[$0-8] && !$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
keywords.push({ value: 'COMMENT', weight: 11 });
|
||
|
}
|
||
|
if (!$$[$0-9] && !$$[$0-8] && !$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
keywords.push({ value: 'PARTITIONED BY', weight: 10 });
|
||
|
if (parser.isImpala()) {
|
||
|
keywords.push({ value: 'PARTITION BY', weight: 10 });
|
||
|
}
|
||
|
}
|
||
|
if (parser.isImpala() && !$$[$0-8] && !$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
keywords.push({ value: 'SORT BY', weight: 9 });
|
||
|
}
|
||
|
if (parser.isHive() && !$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
keywords.push({ value: 'CLUSTERED BY', weight: 8 });
|
||
|
}
|
||
|
if (parser.isHive() && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
keywords.push({ value: 'SKEWED BY', weight: 7 });
|
||
|
} else if (parser.isHive() && $$[$0-6] && $$[$0-6].suggestKeywords && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-2]) {
|
||
|
keywords = keywords.concat(parser.createWeightedKeywords($$[$0-6].suggestKeywords, 7)); // Get the last optional from SKEWED BY
|
||
|
}
|
||
|
if (!$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
keywords.push({ value: 'ROW FORMAT', weight: 6 });
|
||
|
keywords.push({ value: 'STORED AS', weight: 6 });
|
||
|
if (parser.isHive()) {
|
||
|
keywords.push({ value: 'STORED BY', weight: 6 });
|
||
|
}
|
||
|
} else if ($$[$0-5] && $$[$0-5].suggestKeywords && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
keywords = keywords.concat(parser.createWeightedKeywords($$[$0-5].suggestKeywords, 6));
|
||
|
}
|
||
|
if ((($$[$0-5] && $$[$0-5].storedBy) || parser.isImpala()) && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
keywords.push({ value: 'WITH SERDEPROPERTIES', weight: 5 });
|
||
|
}
|
||
|
if (!$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
keywords.push({ value: 'LOCATION', weight: 4 });
|
||
|
}
|
||
|
if (!$$[$0-2] && !$$[$0-1]) {
|
||
|
keywords.push({ value: 'TBLPROPERTIES', weight: 3 });
|
||
|
}
|
||
|
if (parser.isImpala() && !$$[$0-1]) {
|
||
|
keywords.push({ value: 'CACHED IN', weight: 2 }, { value: 'UNCACHED', weight: 2 });
|
||
|
}
|
||
|
if (parser.isImpala() && $$[$0-1] && $$[$0-1].suggestKeywords) {
|
||
|
keywords = keywords.concat(parser.createWeightedKeywords($$[$0-1].suggestKeywords, 2));
|
||
|
}
|
||
|
keywords.push({ value: 'AS', weight: 1 });
|
||
|
}
|
||
|
|
||
|
if (keywords.length > 0) {
|
||
|
parser.suggestKeywords(keywords);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2097:
|
||
|
|
||
|
parser.suggestTables();
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['PARQUET']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2103:
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['PRIMARY KEY']);
|
||
|
} else if (parser.isHive()) {
|
||
|
parser.suggestKeywords([{ value: 'PRIMARY KEY', weight: 2 }, { value: 'CONSTRAINT', weight: 1 }]);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2110: case 2112: case 2305:
|
||
|
|
||
|
parser.checkForKeywords($$[$0-1]);
|
||
|
|
||
|
break;
|
||
|
case 2111: case 2113:
|
||
|
|
||
|
parser.checkForKeywords($$[$0-3]);
|
||
|
|
||
|
break;
|
||
|
case 2114:
|
||
|
|
||
|
this.$ = $$[$0-2];
|
||
|
var keywords = [];
|
||
|
if (parser.isImpala()) {
|
||
|
if (!$$[$0]['primary']) {
|
||
|
keywords.push('PRIMARY KEY');
|
||
|
}
|
||
|
if (!$$[$0]['encoding']) {
|
||
|
keywords.push('ENCODING');
|
||
|
}
|
||
|
if (!$$[$0]['compression']) {
|
||
|
keywords.push('COMPRESSION');
|
||
|
}
|
||
|
if (!$$[$0]['default']) {
|
||
|
keywords.push('DEFAULT');
|
||
|
}
|
||
|
if (!$$[$0]['block_size']) {
|
||
|
keywords.push('BLOCK_SIZE');
|
||
|
}
|
||
|
if (!$$[$0]['null']) {
|
||
|
keywords.push('NOT NULL');
|
||
|
keywords.push('NULL');
|
||
|
}
|
||
|
}
|
||
|
if (!$$[$0]['comment']) {
|
||
|
keywords.push('COMMENT');
|
||
|
if (parser.isHive() && $$[$0-1].toLowerCase() === 'double') {
|
||
|
keywords.push({ value: 'PRECISION', weight: 2 });
|
||
|
}
|
||
|
}
|
||
|
if (keywords.length > 0) {
|
||
|
this.$.suggestKeywords = keywords;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2115: case 2151: case 2157: case 2158: case 2171: case 2174: case 2186: case 2188: case 2586:
|
||
|
|
||
|
parser.suggestKeywords(parser.getColumnDataTypeKeywords());
|
||
|
|
||
|
break;
|
||
|
case 2120:
|
||
|
|
||
|
this.$ = {};
|
||
|
this.$[$$[$0]] = true;
|
||
|
|
||
|
break;
|
||
|
case 2121:
|
||
|
|
||
|
$$[$0-1][$$[$0]] = true;
|
||
|
|
||
|
break;
|
||
|
case 2126:
|
||
|
this.$ = 'primary';
|
||
|
break;
|
||
|
case 2127:
|
||
|
this.$ = 'encoding';
|
||
|
break;
|
||
|
case 2128:
|
||
|
this.$ = 'compression';
|
||
|
break;
|
||
|
case 2129:
|
||
|
this.$ = 'default';
|
||
|
break;
|
||
|
case 2130:
|
||
|
this.$ = 'block_size';
|
||
|
break;
|
||
|
case 2131: case 2132:
|
||
|
this.$ = 'null';
|
||
|
break;
|
||
|
case 2133:
|
||
|
this.$ = 'comment';
|
||
|
break;
|
||
|
case 2135:
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['NULL']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2156: case 2470: case 2481: case 2504:
|
||
|
|
||
|
parser.suggestKeywords(parser.getTypeKeywords());
|
||
|
|
||
|
break;
|
||
|
case 2170: case 2173:
|
||
|
|
||
|
parser.suggestKeywords(['COMMENT']);
|
||
|
|
||
|
break;
|
||
|
case 2198:
|
||
|
|
||
|
parser.suggestKeywords(['CONSTRAINT']);
|
||
|
|
||
|
break;
|
||
|
case 2199: case 2202:
|
||
|
|
||
|
parser.suggestKeywords(['FOREIGN KEY']);
|
||
|
|
||
|
break;
|
||
|
case 2204:
|
||
|
|
||
|
parser.suggestKeywords(['PRIMARY KEY']);
|
||
|
|
||
|
break;
|
||
|
case 2208:
|
||
|
|
||
|
parser.suggestKeywords(['DISABLE NOVALIDATE']);
|
||
|
|
||
|
break;
|
||
|
case 2209:
|
||
|
|
||
|
parser.suggestKeywords(['NOVALIDATE']);
|
||
|
|
||
|
break;
|
||
|
case 2211: case 3097: case 3104: case 3111:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-4]);
|
||
|
|
||
|
break;
|
||
|
case 2212: case 2229: case 2231:
|
||
|
|
||
|
parser.suggestKeywords(['KEY']);
|
||
|
|
||
|
break;
|
||
|
case 2214:
|
||
|
|
||
|
parser.suggestKeywords(['REFERENCES']);
|
||
|
|
||
|
break;
|
||
|
case 2218:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
parser.suggestKeywords(['DISABLE NOVALIDATE']);
|
||
|
|
||
|
break;
|
||
|
case 2219:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-3]);
|
||
|
parser.suggestKeywords(['NOVALIDATE']);
|
||
|
|
||
|
break;
|
||
|
case 2220:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-5]);
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['NORELY', 'RELY']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2242:
|
||
|
|
||
|
parser.suggestKeywords(['HASH', 'RANGE']);
|
||
|
|
||
|
break;
|
||
|
case 2254: case 2259: case 2260:
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['PARTITION']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2267:
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['VALUE', 'VALUES']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2269: case 2574: case 3006:
|
||
|
|
||
|
parser.suggestFunctions();
|
||
|
|
||
|
break;
|
||
|
case 2270:
|
||
|
|
||
|
if ($$[$0].endsWithLessThanOrEqual && parser.isImpala()) {
|
||
|
parser.suggestKeywords(['VALUES']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2271: case 2274: case 2277:
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['<', '<=']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2272:
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['VALUES']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2275: case 2278:
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestFunctions();
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2288:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords([{ value: 'INTO', weight: 1 }, { value: 'SORTED BY', weight: 2 }]);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['INTO']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2289:
|
||
|
|
||
|
parser.suggestKeywords(['BUCKETS']);
|
||
|
|
||
|
break;
|
||
|
case 2310:
|
||
|
this.$ = { suggestKeywords: ['STORED AS DIRECTORIES'] };
|
||
|
break;
|
||
|
case 2320:
|
||
|
|
||
|
this.$ = parser.mergeSuggestKeywords($$[$0-1], $$[$0])
|
||
|
|
||
|
break;
|
||
|
case 2321:
|
||
|
|
||
|
this.$ = { storedBy: true }
|
||
|
|
||
|
break;
|
||
|
case 2322:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['AS', 'BY']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['AS']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2324:
|
||
|
|
||
|
parser.suggestKeywords(['FORMAT']);
|
||
|
|
||
|
break;
|
||
|
case 2325:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['DELIMITED', 'SERDE']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['DELIMITED']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2329:
|
||
|
this.$ = { suggestKeywords: ['STORED AS'] };
|
||
|
break;
|
||
|
case 2354:
|
||
|
|
||
|
if (!$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0]) {
|
||
|
this.$ = { suggestKeywords: [{ value: 'FIELDS TERMINATED BY', weight: 5 }, { value: 'COLLECTION ITEMS TERMINATED BY', weight: 4 }, { value: 'MAP KEYS TERMINATED BY', weight: 3 }, { value: 'LINES TERMINATED BY', weight: 2 }, { value: 'NULL DEFINED AS', weight: 1 }]};
|
||
|
} else if ($$[$0-4] && $$[$0-4].suggestKeywords && !$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0]) {
|
||
|
this.$ = { suggestKeywords: parser.createWeightedKeywords($$[$0-4].suggestKeywords, 5).concat([{ value: 'COLLECTION ITEMS TERMINATED BY', weight: 4 }, { value: 'MAP KEYS TERMINATED BY', weight: 3 }, { value: 'LINES TERMINATED BY', weight: 2 }, { value: 'NULL DEFINED AS', weight: 1 }]) };
|
||
|
} else if (!$$[$0-3] && !$$[$0-2] && !$$[$0-1] && !$$[$0]) {
|
||
|
this.$ = { suggestKeywords: [{ value: 'COLLECTION ITEMS TERMINATED BY', weight: 4 }, { value: 'MAP KEYS TERMINATED BY', weight: 3 }, { value: 'LINES TERMINATED BY', weight: 2 }, { value: 'NULL DEFINED AS', weight: 1 }] };
|
||
|
} else if (!$$[$0-2] && !$$[$0-1] && !$$[$0]) {
|
||
|
this.$ = { suggestKeywords: [{ value: 'MAP KEYS TERMINATED BY', weight: 3 }, { value: 'LINES TERMINATED BY', weight: 2 }, { value: 'NULL DEFINED AS', weight: 1 }] };
|
||
|
} else if (!$$[$0-1] && !$$[$0]) {
|
||
|
this.$ = { suggestKeywords: [{ value: 'LINES TERMINATED BY', weight: 2 }, { value: 'NULL DEFINED AS', weight: 1 }] };
|
||
|
} else if (!$$[$0]) {
|
||
|
this.$ = { suggestKeywords: [{ value: 'NULL DEFINED AS', weight: 1 }] };
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2360:
|
||
|
|
||
|
if (!$$[$0-1] && !$$[$0]) {
|
||
|
this.$ = { suggestKeywords: [{ value: 'FIELDS TERMINATED BY', weight: 2 }, { value: 'LINES TERMINATED BY', weight: 1 }] };
|
||
|
} else if ($$[$0-1] && $$[$0-1].suggestKeywords && !$$[$0]) {
|
||
|
this.$ = { suggestKeywords: parser.createWeightedKeywords($$[$0-1].suggestKeywords, 2).concat(['LINES TERMINATED BY']) };
|
||
|
} else if (!$$[$0]) {
|
||
|
this.$ = { suggestKeywords: [{ value: 'LINES TERMINATED BY', weight: 1 }] };
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2364:
|
||
|
this.$ = { suggestKeywords: ['ESCAPED BY'] };
|
||
|
break;
|
||
|
case 2366: case 2372: case 2377: case 2381:
|
||
|
|
||
|
parser.suggestKeywords(['TERMINATED BY']);
|
||
|
|
||
|
break;
|
||
|
case 2371:
|
||
|
|
||
|
parser.suggestKeywords(['ITEMS TERMINATED BY']);
|
||
|
|
||
|
break;
|
||
|
case 2376:
|
||
|
|
||
|
parser.suggestKeywords(['KEYS TERMINATED BY']);
|
||
|
|
||
|
break;
|
||
|
case 2385:
|
||
|
|
||
|
parser.suggestKeywords(['DEFINED AS']);
|
||
|
|
||
|
break;
|
||
|
case 2391: case 2392:
|
||
|
|
||
|
parser.suggestKeywords(['SERDEPROPERTIES']);
|
||
|
|
||
|
break;
|
||
|
case 2402:
|
||
|
|
||
|
parser.commitLocations();
|
||
|
|
||
|
break;
|
||
|
case 2404: case 2421: case 2437:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['IF NOT EXISTS']);
|
||
|
}
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
|
||
|
break;
|
||
|
case 2405:
|
||
|
|
||
|
if (!$$[$0-7]) {
|
||
|
parser.suggestKeywords(['IF NOT EXISTS']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2408:
|
||
|
|
||
|
var keywords = [{value: 'AS', weight: 1 }];
|
||
|
if (!$$[$0-1]) {
|
||
|
if (parser.isHive()) {
|
||
|
keywords.push({ value: 'TBLPROPERTIES', weight: 2 });
|
||
|
}
|
||
|
if (!$$[$0-2]) {
|
||
|
keywords.push({ value: 'COMMENT', weight: 3 });
|
||
|
}
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
|
||
|
break;
|
||
|
case 2422:
|
||
|
|
||
|
if (!$$[$0-6]) {
|
||
|
parser.suggestKeywords(['IF NOT EXISTS']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2423: case 2442:
|
||
|
|
||
|
parser.suggestKeywords(['RETURNS']);
|
||
|
|
||
|
break;
|
||
|
case 2425:
|
||
|
|
||
|
parser.suggestKeywords(['SYMBOL']);
|
||
|
|
||
|
break;
|
||
|
case 2436:
|
||
|
|
||
|
if (!$$[$0-13]) {
|
||
|
parser.suggestKeywords(['IF NOT EXISTS']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2444:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords([{value: 'INIT_FN', weight: 2 }, {value: 'UPDATE_FN', weight: 1 }]);
|
||
|
} else {
|
||
|
parser.suggestKeywords([{value: 'UPDATE_FN', weight: 1 }]);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2445:
|
||
|
|
||
|
parser.suggestKeywords(['MERGE_FN']);
|
||
|
|
||
|
break;
|
||
|
case 2446:
|
||
|
|
||
|
if (!$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords([{value: 'PREPARE_FN', weight: 5 }, {value: 'CLOSE_FN', weight: 4 }, {value: 'SERIALIZE_FN', weight: 3 }, {value: 'FINALIZE_FN', weight: 2 }, {value: 'INTERMEDIATE', weight: 1 }]);
|
||
|
} else if ($$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords([{value: 'CLOSE_FN', weight: 4 }, {value: 'SERIALIZE_FN', weight: 3 }, {value: 'FINALIZE_FN', weight: 2 }, {value: 'INTERMEDIATE', weight: 1 }]);
|
||
|
} else if ($$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords([{value: 'SERIALIZE_FN', weight: 3 }, {value: 'FINALIZE_FN', weight: 2 }, {value: 'INTERMEDIATE', weight: 1 }]);
|
||
|
} else if ($$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords([{value: 'FINALIZE_FN', weight: 2 }, {value: 'INTERMEDIATE', weight: 1 }]);
|
||
|
} else if ($$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords([{value: 'INTERMEDIATE', weight: 1 }]);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2465:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['USING']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['ARCHIVE', 'FILE', 'JAR']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2471:
|
||
|
|
||
|
parser.suggestKeywords(['...']);
|
||
|
|
||
|
break;
|
||
|
case 2506:
|
||
|
|
||
|
parser.suggestFunctions();
|
||
|
parser.suggestAggregateFunctions();
|
||
|
parser.suggestAnalyticFunctions();
|
||
|
|
||
|
break;
|
||
|
case 2509:
|
||
|
|
||
|
parser.suggestKeywords(['ARCHIVE', 'FILE', 'JAR']);
|
||
|
|
||
|
break;
|
||
|
case 2521:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['COMMENT']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2525: case 2527:
|
||
|
this.$ = $$[$0-3];
|
||
|
break;
|
||
|
case 2535:
|
||
|
|
||
|
parser.suggestKeywords(['ON TABLE']);
|
||
|
|
||
|
break;
|
||
|
case 2541: case 2551:
|
||
|
|
||
|
parser.suggestKeywords(['\'BITMAP\'', '\'COMPACT\'']);
|
||
|
|
||
|
break;
|
||
|
case 2549:
|
||
|
|
||
|
if (!$$[$0-7] && !$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords([{ value: 'WITH DEFERRED REBUILD', weight: 7 }, { value: 'IDXPROPERTIES', weight: 6 }, { value: 'IN TABLE', weight: 5 }, { value: 'ROW FORMAT', weight: 4 }, { value: 'STORED AS', weight: 4 }, { value: 'STORED BY', weight: 4 }, { value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
|
||
|
} else if (!$$[$0-6] && !$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords([{ value: 'IDXPROPERTIES', weight: 6 }, { value: 'IN TABLE', weight: 5 }, { value: 'ROW FORMAT', weight: 4 }, { value: 'STORED AS', weight: 4 }, { value: 'STORED BY', weight: 4 }, { value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
|
||
|
} else if (!$$[$0-5] && !$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords([{ value: 'IN TABLE', weight: 5 }, { value: 'ROW FORMAT', weight: 4 }, { value: 'STORED AS', weight: 4 }, { value: 'STORED BY', weight: 4 }, { value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
|
||
|
} else if (!$$[$0-4] && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords([{ value: 'ROW FORMAT', weight: 4 }, { value: 'STORED AS', weight: 4 }, { value: 'STORED BY', weight: 4 }, { value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
|
||
|
} else if ($$[$0-4] && $$[$0-4].suggestKeywords && !$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords(parser.createWeightedKeywords($$[$0-4].suggestKeywords, 4).concat([{ value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]));
|
||
|
} else if (!$$[$0-3] && !$$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords([{ value: 'LOCATION', weight: 3 }, { value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
|
||
|
} else if (!$$[$0-2] && !$$[$0-1]) {
|
||
|
parser.suggestKeywords([{ value: 'TBLPROPERTIES', weight: 2 }, { value: 'COMMENT', weight: 1 }]);
|
||
|
} else if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords([{ value: 'COMMENT', weight: 1 }]);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2554:
|
||
|
|
||
|
parser.suggestKeywords(['DEFERRED REBUILD']);
|
||
|
|
||
|
break;
|
||
|
case 2555:
|
||
|
|
||
|
parser.suggestKeywords(['REBUILD']);
|
||
|
|
||
|
break;
|
||
|
case 2600: case 2602:
|
||
|
|
||
|
parser.addCommonTableExpressions($$[$0-1]);
|
||
|
|
||
|
break;
|
||
|
case 2626:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['DATABASE', 'FUNCTION', 'INDEX', 'ROLE', 'SCHEMA', 'TABLE', 'TEMPORARY FUNCTION', 'TEMPORARY MACRO', 'VIEW']);
|
||
|
} else if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['AGGREGATE FUNCTION', 'DATABASE', 'FUNCTION', 'INCREMENTAL STATS', 'ROLE', 'SCHEMA', 'STATS', 'TABLE', 'VIEW']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['ROLE', 'SCHEMA', 'TABLE', 'VIEW']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2630:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['IF EXISTS']);
|
||
|
}
|
||
|
parser.suggestDatabases();
|
||
|
|
||
|
break;
|
||
|
case 2631:
|
||
|
|
||
|
if (parser.isHive() || parser.isImpala()) {
|
||
|
parser.suggestKeywords(['CASCADE', 'RESTRICT']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2633: case 2642: case 2647:
|
||
|
|
||
|
if (!$$[$0-3]) {
|
||
|
parser.suggestKeywords(['IF EXISTS']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2640: case 2641:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['IF EXISTS']);
|
||
|
}
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
|
||
|
break;
|
||
|
case 2644:
|
||
|
|
||
|
parser.suggestKeywords(['AGGREGATE']);
|
||
|
|
||
|
break;
|
||
|
case 2654: case 2659: case 2691:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['IF EXISTS']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2655:
|
||
|
|
||
|
if (!$$[$0-2]) {
|
||
|
parser.suggestKeywords(['IF EXISTS']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2666:
|
||
|
|
||
|
parser.addTablePrimary($$[$0]);
|
||
|
parser.suggestKeywords(['INCREMENTAL']);
|
||
|
|
||
|
break;
|
||
|
case 2672: case 3264:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-1]);
|
||
|
parser.suggestKeywords(['PARTITION']);
|
||
|
|
||
|
break;
|
||
|
case 2676:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['IF EXISTS']);
|
||
|
}
|
||
|
parser.suggestTables({ onlyTables: true });
|
||
|
parser.suggestDatabases({
|
||
|
appendDot: true
|
||
|
});
|
||
|
|
||
|
break;
|
||
|
case 2679:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['PURGE']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2684:
|
||
|
|
||
|
parser.suggestKeywords(['IF EXISTS']);
|
||
|
|
||
|
break;
|
||
|
case 2690:
|
||
|
|
||
|
parser.suggestKeywords(['FUNCTION', 'MACRO']);
|
||
|
|
||
|
break;
|
||
|
case 2694:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['IF EXISTS']);
|
||
|
}
|
||
|
parser.suggestTables({ onlyViews: true });
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
|
||
|
break;
|
||
|
case 2695:
|
||
|
|
||
|
parser.addTablePrimary($$[$0]);
|
||
|
if (!$$[$0-2]) {
|
||
|
parser.suggestKeywords(['IF EXISTS']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2701:
|
||
|
|
||
|
parser.suggestTables();
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
if (parser.isImpala() && !$$[$0-2]) {
|
||
|
parser.suggestKeywords(['IF EXISTS']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2704:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
if (parser.isHive() && !$$[$0-1]) {
|
||
|
parser.suggestKeywords(['PARTITION']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2706:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
if (parser.isImpala() && !$$[$0-3]) {
|
||
|
parser.suggestKeywords(['IF EXISTS']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2709: case 2864: case 2869: case 2872: case 2876: case 2884:
|
||
|
|
||
|
parser.suggestKeywords(['FROM']);
|
||
|
|
||
|
break;
|
||
|
case 2711:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
if (!$$[$0]) {
|
||
|
parser.suggestKeywords(['WHERE']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2715:
|
||
|
|
||
|
parser.suggestKeywords(['FROM']);
|
||
|
if (parser.isImpala() && !$$[$0-1]) {
|
||
|
parser.suggestTables();
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2718:
|
||
|
|
||
|
var keywords = [{ value: 'FULL JOIN', weight: 1 }, { value: 'FULL OUTER JOIN', weight: 1 }, { value: 'JOIN', weight: 1 }, { value: 'LEFT JOIN', weight: 1 }, { value: 'LEFT OUTER JOIN', weight: 1 }, { value: 'RIGHT JOIN', weight: 1 }, { value: 'RIGHT OUTER JOIN', weight: 1 }, { value: 'INNER JOIN', weight: 1 }, { value: 'LEFT ANTI JOIN', weight: 1 }, { value: 'LEFT SEMI JOIN', weight: 1 }, { value: 'RIGHT ANTI JOIN', weight: 1 }, { value: 'RIGHT SEMI JOIN', weight: 1 }];
|
||
|
if (!$$[$0]) {
|
||
|
keywords.push({ value: 'WHERE', weight: 3 });
|
||
|
}
|
||
|
if ($$[$0-2].suggestJoinConditions) {
|
||
|
parser.suggestJoinConditions($$[$0-2].suggestJoinConditions);
|
||
|
}
|
||
|
if ($$[$0-2].suggestJoins) {
|
||
|
parser.suggestJoins($$[$0-2].suggestJoins);
|
||
|
}
|
||
|
if ($$[$0-2].suggestKeywords) {
|
||
|
keywords = keywords.concat(parser.createWeightedKeywords($$[$0-2].suggestKeywords, 2));
|
||
|
}
|
||
|
if (keywords.length > 0) {
|
||
|
parser.suggestKeywords(keywords);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2727:
|
||
|
|
||
|
parser.suggestKeywords(['TRANSACTIONS']);
|
||
|
|
||
|
break;
|
||
|
case 2736:
|
||
|
|
||
|
parser.suggestKeywords(['ALL', 'ALTER', 'CREATE', 'DELETE', 'DROP', 'INDEX', 'INSERT', 'LOCK', 'ROLE', 'SELECT', 'UPDATE']);
|
||
|
|
||
|
break;
|
||
|
case 2739:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['ON', 'TO']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['TO']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2742: case 2762: case 2764:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['WITH GRANT OPTION']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2747: case 2751:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['WITH ADMIN OPTION']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2753: case 2877:
|
||
|
|
||
|
parser.suggestKeywords(['ALL', 'ALTER', 'CREATE', 'DROP', 'INSERT', 'REFRESH', 'ROLE', 'SELECT']);
|
||
|
|
||
|
break;
|
||
|
case 2754:
|
||
|
|
||
|
parser.suggestKeywords(['TO GROUP']);
|
||
|
|
||
|
break;
|
||
|
case 2755: case 2879: case 3277: case 3278:
|
||
|
|
||
|
parser.suggestKeywords(['GROUP']);
|
||
|
|
||
|
break;
|
||
|
case 2757: case 2881:
|
||
|
|
||
|
if ($$[$0-1].isCreate) {
|
||
|
parser.suggestKeywords(['ON DATABASE', 'ON SERVER']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['ON DATABASE', 'ON SERVER', 'ON TABLE', 'ON URI']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2758:
|
||
|
|
||
|
if ($$[$0-2].isCreate) {
|
||
|
parser.suggestKeywords(['DATABASE', 'SERVER']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['DATABASE', 'SERVER', 'TABLE', 'URI']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2761: case 2868: case 2885: case 3227:
|
||
|
|
||
|
parser.suggestKeywords(['ROLE']);
|
||
|
|
||
|
break;
|
||
|
case 2768:
|
||
|
|
||
|
parser.suggestKeywords(['DATABASE', 'TABLE']);
|
||
|
parser.suggestTables();
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
|
||
|
break;
|
||
|
case 2784:
|
||
|
|
||
|
if ($$[$0].toUpperCase() === 'ALL') {
|
||
|
this.$ = { singleAll: true };
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2790: case 2791: case 2792: case 2855:
|
||
|
|
||
|
parser.suggestKeywords(['ALL', 'ALTER', 'CREATE', 'DELETE', 'DROP', 'INDEX', 'INSERT', 'LOCK', 'SELECT', 'SHOW_DATABASE', 'UPDATE']);
|
||
|
|
||
|
break;
|
||
|
case 2808:
|
||
|
this.$ = { isCreate: true };
|
||
|
break;
|
||
|
case 2830:
|
||
|
|
||
|
parser.suggestKeywords(['GRANT OPTION']);
|
||
|
|
||
|
break;
|
||
|
case 2831: case 2832: case 2836: case 2888:
|
||
|
|
||
|
parser.suggestKeywords(['OPTION']);
|
||
|
|
||
|
break;
|
||
|
case 2835:
|
||
|
|
||
|
parser.suggestKeywords(['ADMIN OPTION']);
|
||
|
|
||
|
break;
|
||
|
case 2847:
|
||
|
|
||
|
parser.suggestKeywords(['ADMIN OPTION FOR', 'ALL', 'ALL GRANT OPTION FROM', 'ALL PRIVILEGES FROM', 'ALTER', 'CREATE', 'DELETE', 'DROP', 'GRANT OPTION FOR', 'INDEX', 'INSERT', 'LOCK', 'ROLE', 'SELECT', 'UPDATE']);
|
||
|
|
||
|
break;
|
||
|
case 2850:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
if ($$[$0-2].singleAll) {
|
||
|
parser.suggestKeywords(['FROM', 'GRANT OPTION', 'ON', 'PRIVILEGES FROM']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['FROM', 'ON']);
|
||
|
}
|
||
|
} else {
|
||
|
parser.suggestKeywords(['FROM']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2853:
|
||
|
|
||
|
parser.suggestKeywords(['OPTION FOR']);
|
||
|
|
||
|
break;
|
||
|
case 2854: case 2867:
|
||
|
|
||
|
parser.suggestKeywords(['FOR']);
|
||
|
|
||
|
break;
|
||
|
case 2858:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['FROM', 'ON']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['FROM']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2861:
|
||
|
|
||
|
if ($$[$0-1].toUpperCase() === 'ADMIN') {
|
||
|
parser.suggestKeywords(['FROM', 'OPTION FOR']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['FROM']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2878:
|
||
|
|
||
|
parser.suggestKeywords(['FROM GROUP']);
|
||
|
|
||
|
break;
|
||
|
case 2882:
|
||
|
|
||
|
if ($$[$0-2].isCreate) {
|
||
|
parser.suggestKeywords(['DATABASE', 'SERVER']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['DATABASE', 'SERVER', 'TABLE', 'URI']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2899:
|
||
|
|
||
|
var keywords = [];
|
||
|
if ($$[$0-1].suggestKeywords) {
|
||
|
keywords = parser.createWeightedKeywords($$[$0-1].suggestKeywords, 2).concat([{ value: 'SELECT', weight: 1}]);
|
||
|
} else {
|
||
|
keywords = ['SELECT'];
|
||
|
}
|
||
|
if ($$[$0-1].addValues) {
|
||
|
keywords.push({ weight: 1.1, value: 'VALUES' });
|
||
|
}
|
||
|
if (keywords.length > 0) {
|
||
|
parser.suggestKeywords(keywords);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2902:
|
||
|
|
||
|
if (!$$[$0].keepTables) {
|
||
|
delete parser.yy.result.suggestTables;
|
||
|
delete parser.yy.result.suggestDatabases;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2906:
|
||
|
|
||
|
parser.suggestKeywords(['INSERT INTO', 'INSERT OVERWRITE', 'SELECT']);
|
||
|
|
||
|
break;
|
||
|
case 2907:
|
||
|
|
||
|
if ($$[$0-1].cursorAtEnd) {
|
||
|
parser.checkForSelectListKeywords($$[$0-1]);
|
||
|
var keywords = parser.yy.result.suggestKeywords || [];
|
||
|
if ($$[$0].suggestKeywords) {
|
||
|
keywords = keywords.concat($$[$0].suggestKeywords);
|
||
|
}
|
||
|
if (keywords.length > 0) {
|
||
|
parser.suggestKeywords(keywords);
|
||
|
}
|
||
|
}
|
||
|
delete parser.yy.result.suggestTables;
|
||
|
delete parser.yy.result.suggestDatabases;
|
||
|
|
||
|
break;
|
||
|
case 2908:
|
||
|
|
||
|
if ($$[$0].cursorAtStart) {
|
||
|
parser.checkForSelectListKeywords($$[$0-1].tableExpression);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2909:
|
||
|
|
||
|
$$[$0-2].owner = 'insert';
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
if (!$$[$0-1] && !$$[$0]) {
|
||
|
this.$ = { suggestKeywords: ['PARTITION'] }
|
||
|
} else if (!$$[$0]) {
|
||
|
this.$ = { suggestKeywords: ['IF NOT EXISTS'] }
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2910:
|
||
|
|
||
|
if (!$$[$0-1] && !$$[$0]) {
|
||
|
this.$ = { suggestKeywords: [{ value: 'ROW FORMAT', weight: 2 }, { value: 'STORED AS', weight: 1}] };
|
||
|
} else if (!$$[$0]) {
|
||
|
this.$ = { suggestKeywords: ['STORED AS'] };
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2911:
|
||
|
|
||
|
if (!$$[$0-1] && !$$[$0]) {
|
||
|
this.$ = { suggestKeywords: [{ value: 'ROW FORMAT', weight: 2 }, { value: 'STORED AS', weight: 1}] };
|
||
|
} else if (!$$[$0]) {
|
||
|
this.$ = { suggestKeywords: ['STORED AS'] };
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2912:
|
||
|
|
||
|
$$[$0-2].owner = 'insert';
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
if (!$$[$0-1] && !$$[$0]) {
|
||
|
this.$ = { suggestKeywords: ['PARTITION'], addValues: true };
|
||
|
} else if (!$$[$0]) {
|
||
|
this.$ = { addValues: true };
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2913:
|
||
|
|
||
|
parser.suggestKeywords(['OVERWRITE', 'INTO']);
|
||
|
|
||
|
break;
|
||
|
case 2914:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['DIRECTORY', 'LOCAL DIRECTORY', 'TABLE']);
|
||
|
}
|
||
|
parser.suggestTables();
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
this.$ = { keepTables: true }
|
||
|
|
||
|
break;
|
||
|
case 2915: case 2926:
|
||
|
|
||
|
this.$ = { keepTables: true }
|
||
|
|
||
|
break;
|
||
|
case 2916: case 2927: case 2928: case 2990: case 2991:
|
||
|
|
||
|
$$[$0-2].owner = 'insert';
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
if (parser.yy.result.suggestColumns) {
|
||
|
parser.yy.result.suggestColumns.owner = 'insert';
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2917: case 2942:
|
||
|
|
||
|
$$[$0-2].owner = 'insert';
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
|
||
|
break;
|
||
|
case 2918:
|
||
|
|
||
|
parser.suggestKeywords(['DIRECTORY']);
|
||
|
|
||
|
break;
|
||
|
case 2925:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['TABLE']);
|
||
|
}
|
||
|
parser.suggestTables();
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
this.$ = { keepTables: true }
|
||
|
|
||
|
break;
|
||
|
case 2938:
|
||
|
|
||
|
if ($$[$0-1].suggestKeywords) {
|
||
|
parser.suggestKeywords(parser.createWeightedKeywords($$[$0-1].suggestKeywords, 2).concat([{ value: 'SELECT', weight: 1}]));
|
||
|
} else {
|
||
|
parser.suggestKeywords(['SELECT']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2939:
|
||
|
|
||
|
if ($$[$0-1].cursorAtEnd) {
|
||
|
parser.checkForSelectListKeywords($$[$0-1]);
|
||
|
var keywords = parser.yy.result.suggestKeywords || [];
|
||
|
if ($$[$0].suggestKeywords) {
|
||
|
keywords = keywords.concat($$[$0].suggestKeywords);
|
||
|
}
|
||
|
if (keywords.length > 0) {
|
||
|
parser.suggestKeywords(keywords);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2941:
|
||
|
|
||
|
$$[$0-3].owner = 'insert';
|
||
|
parser.addTablePrimary($$[$0-3]);
|
||
|
|
||
|
break;
|
||
|
case 2943: case 2980: case 3016:
|
||
|
|
||
|
parser.suggestKeywords(['INTO']);
|
||
|
|
||
|
break;
|
||
|
case 2944: case 2981: case 2987:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['TABLE']);
|
||
|
}
|
||
|
parser.suggestTables();
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
|
||
|
break;
|
||
|
case 2946:
|
||
|
|
||
|
$$[$0-1].owner = 'insert';
|
||
|
parser.addTablePrimary($$[$0-1]);
|
||
|
parser.suggestKeywords(['VALUES']);
|
||
|
|
||
|
break;
|
||
|
case 2955:
|
||
|
|
||
|
parser.suggestKeywords(['FORMAT DELIMITED']);
|
||
|
|
||
|
break;
|
||
|
case 2958:
|
||
|
this.$ = { selectList: $$[$0] };
|
||
|
break;
|
||
|
case 2959:
|
||
|
|
||
|
this.$ = $$[$0-1];
|
||
|
this.$.cursorAtEnd = true;
|
||
|
|
||
|
break;
|
||
|
case 2960:
|
||
|
|
||
|
parser.selectListNoTableSuggest($$[$0], $$[$0-2]);
|
||
|
|
||
|
break;
|
||
|
case 2961:
|
||
|
|
||
|
var keywords = parser.getSelectListKeywords();
|
||
|
if (!$$[$0-2] || $$[$0-2] === 'ALL') {
|
||
|
parser.suggestAggregateFunctions();
|
||
|
parser.suggestAnalyticFunctions();
|
||
|
}
|
||
|
if (!$$[$0-1] && !$$[$0-2]) {
|
||
|
keywords.push({ value: 'ALL', weight: 2 });
|
||
|
keywords.push({ value: 'DISTINCT', weight: 2 });
|
||
|
}
|
||
|
if (parser.isImpala() && !$$[$0-1]) {
|
||
|
keywords.push({ value: 'STRAIGHT_JOIN', weight: 1 });
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
parser.suggestFunctions();
|
||
|
parser.suggestColumns();
|
||
|
|
||
|
break;
|
||
|
case 2969:
|
||
|
|
||
|
var keywords = $$[$0-2].suggestKeywords && !$$[$0-1] ? parser.createWeightedKeywords($$[$0-2].suggestKeywords, 2) : [];
|
||
|
if (!$$[$0-1]) {
|
||
|
keywords = keywords.concat(['[NOSHUFFLE]', '[SHUFFLE]', 'SELECT', 'VALUES'])
|
||
|
} else {
|
||
|
keywords = keywords.concat(['SELECT'])
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
|
||
|
break;
|
||
|
case 2979:
|
||
|
|
||
|
$$[$0-1].owner = 'upsert';
|
||
|
parser.addTablePrimary($$[$0-1]);
|
||
|
|
||
|
break;
|
||
|
case 2982:
|
||
|
|
||
|
if (!$$[$0-3]) {
|
||
|
parser.suggestKeywords(['TABLE']);
|
||
|
}
|
||
|
$$[$0-1].owner = 'upsert';
|
||
|
parser.addTablePrimary($$[$0-1]);
|
||
|
|
||
|
break;
|
||
|
case 2984:
|
||
|
|
||
|
$$[$0-1].owner = 'upsert';
|
||
|
parser.addTablePrimary($$[$0-1]);
|
||
|
if (parser.yy.result.suggestColumns) {
|
||
|
parser.yy.result.suggestColumns.owner = 'upsert';
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2985:
|
||
|
|
||
|
$$[$0-2].owner = 'insert';
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
if (!$$[$0]) {
|
||
|
this.$ = { suggestKeywords: ['PARTITION'] };
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 2986:
|
||
|
|
||
|
parser.suggestKeywords(['INTO', 'OVERWRITE']);
|
||
|
|
||
|
break;
|
||
|
case 2988:
|
||
|
|
||
|
if (!$$[$0-4]) {
|
||
|
parser.suggestKeywords(['TABLE']);
|
||
|
}
|
||
|
$$[$0-2].owner = 'insert';
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
|
||
|
break;
|
||
|
case 3013:
|
||
|
|
||
|
parser.suggestValueExpressionKeywords($$[$0-1], [{ value: 'WHEN', weight: 2 }]);
|
||
|
|
||
|
break;
|
||
|
case 3015:
|
||
|
|
||
|
$$[$0-6].alias = $$[$0-4];
|
||
|
parser.addTablePrimary($$[$0-6]);
|
||
|
if ($$[$0-2].subQuery) {
|
||
|
parser.addTablePrimary({ subQueryAlias: $$[$0] });
|
||
|
} else {
|
||
|
$$[$0-2].alias = $$[$0];
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3017:
|
||
|
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
parser.suggestTables();
|
||
|
|
||
|
break;
|
||
|
case 3019:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-1]);
|
||
|
parser.suggestKeywords(['AS T USING']);
|
||
|
|
||
|
break;
|
||
|
case 3020:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
parser.suggestKeywords(['T USING']);
|
||
|
|
||
|
break;
|
||
|
case 3021:
|
||
|
|
||
|
$$[$0-3].alias = $$[$0-1];
|
||
|
parser.addTablePrimary($$[$0-3]);
|
||
|
parser.suggestKeywords(['USING']);
|
||
|
|
||
|
break;
|
||
|
case 3022:
|
||
|
|
||
|
$$[$0-4].alias = $$[$0-2];
|
||
|
parser.addTablePrimary($$[$0-4]);
|
||
|
parser.suggestDatabases({ appendDot: true });
|
||
|
parser.suggestTables();
|
||
|
|
||
|
break;
|
||
|
case 3023:
|
||
|
|
||
|
$$[$0-4].alias = $$[$0-2];
|
||
|
parser.addTablePrimary($$[$0-4]);
|
||
|
|
||
|
break;
|
||
|
case 3024:
|
||
|
|
||
|
$$[$0-5].alias = $$[$0-3];
|
||
|
parser.addTablePrimary($$[$0-5]);
|
||
|
parser.suggestKeywords(['AS S ON']);
|
||
|
|
||
|
break;
|
||
|
case 3025:
|
||
|
|
||
|
$$[$0-6].alias = $$[$0-4];
|
||
|
parser.addTablePrimary($$[$0-6]);
|
||
|
parser.suggestKeywords(['S ON']);
|
||
|
|
||
|
break;
|
||
|
case 3034:
|
||
|
|
||
|
if ($$[$0].suggestThenKeywords) {
|
||
|
parser.suggestKeywords(['DELETE', 'INSERT VALUES', 'UPDATE SET']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3035: case 3037:
|
||
|
|
||
|
if (!$$[$0-1].notPresent) {
|
||
|
parser.suggestKeywords(['WHEN']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3036:
|
||
|
|
||
|
if (!$$[$0-1].notPresent && $$[$0].suggestThenKeywords) {
|
||
|
var keywords = [];
|
||
|
if (!$$[$0-1].isDelete) {
|
||
|
keywords.push('DELETE');
|
||
|
}
|
||
|
if (!$$[$0-1].isInsert) {
|
||
|
keywords.push('INSERT VALUES');
|
||
|
}
|
||
|
if (!$$[$0-1].isUpdate) {
|
||
|
keywords.push('UPDATE SET');
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3038:
|
||
|
|
||
|
if (!$$[$0-1].notPresent && $$[$0].suggestThenKeywords) {
|
||
|
var keywords = [];
|
||
|
if (!$$[$0-2].isDelete && !$$[$0-1].isDelete) {
|
||
|
keywords.push('DELETE');
|
||
|
}
|
||
|
if (!$$[$0-2].isInsert && !$$[$0-1].isInsert) {
|
||
|
keywords.push('INSERT VALUES');
|
||
|
}
|
||
|
if (!$$[$0-2].isUpdate && !$$[$0-1].isUpdate) {
|
||
|
keywords.push('UPDATE SET');
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3039:
|
||
|
this.$ = { notPresent: !!$$[$0-4], isDelete: $$[$0].isDelete, isInsert: $$[$0].isInsert, isUpdate: $$[$0].isUpdate };
|
||
|
break;
|
||
|
case 3040:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['NOT MATCHED', 'MATCHED']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['MATCHED']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3041:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['AND', 'THEN']);
|
||
|
} else {
|
||
|
parser.suggestValueExpressionKeywords($$[$0-1], [{ value: 'THEN', weight: 2 }]);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3043:
|
||
|
this.$ = { suggestThenKeywords: true };
|
||
|
break;
|
||
|
case 3048:
|
||
|
this.$ = { isUpdate: true };
|
||
|
break;
|
||
|
case 3049:
|
||
|
this.$ = { isDelete: true };
|
||
|
break;
|
||
|
case 3050:
|
||
|
this.$ = { isInsert: true };
|
||
|
break;
|
||
|
case 3051:
|
||
|
|
||
|
parser.suggestKeywords(['SET']);
|
||
|
|
||
|
break;
|
||
|
case 3055:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['DATA LOCAL INPATH', 'DATA INPATH']);
|
||
|
} else if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['DATA INPATH']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3056:
|
||
|
|
||
|
if (parser.isHive() && !$$[$0-1]) {
|
||
|
parser.suggestKeywords(['INPATH', 'LOCAL INPATH']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['INPATH']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3058:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['OVERWRITE INTO TABLE', 'INTO TABLE']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['INTO TABLE']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3059:
|
||
|
|
||
|
parser.suggestKeywords([ 'TABLE' ]);
|
||
|
|
||
|
break;
|
||
|
case 3077:
|
||
|
|
||
|
if (!$$[$0]) {
|
||
|
parser.suggestKeywords(['EXTERNAL TABLE', 'FROM', 'TABLE']);
|
||
|
} else if (!$$[$0].hasExternal) {
|
||
|
parser.suggestKeywords(['EXTERNAL']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3078:
|
||
|
|
||
|
if ($$[$0-1].suggestKeywords) {
|
||
|
parser.suggestKeywords(parser.createWeightedKeywords($$[$0-1].suggestKeywords, 2).concat(['FROM']));
|
||
|
} else {
|
||
|
parser.suggestKeywords(['FROM']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3082:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['LOCATION']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3083:
|
||
|
|
||
|
if (!$$[$0-4]) {
|
||
|
parser.suggestKeywords(['EXTERNAL TABLE', 'TABLE']);
|
||
|
} else if (!$$[$0-4].hasExternal) {
|
||
|
parser.suggestKeywords(['EXTERNAL']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3085:
|
||
|
|
||
|
if ($$[$0-5].suggestKeywords) {
|
||
|
parser.suggestKeywords(parser.createWeightedKeywords($$[$0-5].suggestKeywords, 2).concat(['FROM']));
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3088:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-1]);
|
||
|
if (!$$[$0]) {
|
||
|
this.$ = { hasExternal: true, suggestKeywords: ['PARTITION'] };
|
||
|
} else {
|
||
|
this.$ = { hasExternal: true }
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3089:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-1]);
|
||
|
if (!$$[$0]) {
|
||
|
this.$ = { suggestKeywords: ['PARTITION'] };
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3098: case 3112: case 3113:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-9]);
|
||
|
|
||
|
break;
|
||
|
case 3102:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords([{ weight: 2, value: 'PARTITION' }, { weight: 1, value: 'TO' }]);
|
||
|
} else {
|
||
|
parser.suggestKeywords([ 'TO' ]);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3105:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-5]);
|
||
|
parser.suggestKeywords(['FOR replication()']);
|
||
|
|
||
|
break;
|
||
|
case 3106:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-6]);
|
||
|
parser.suggestKeywords(['replication()']);
|
||
|
|
||
|
break;
|
||
|
case 3109:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-5]);
|
||
|
if (!$$[$0-4]) {
|
||
|
parser.suggestKeywords(['PARTITION']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3110:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-10]);
|
||
|
if (!$$[$0-9]) {
|
||
|
parser.suggestKeywords(['PARTITION']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3128:
|
||
|
|
||
|
parser.suggestKeywords(['ALL', 'NONE']);
|
||
|
|
||
|
break;
|
||
|
case 3151:
|
||
|
|
||
|
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']);
|
||
|
} 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']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['COLUMNS', 'DATABASES', 'TABLES']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3152:
|
||
|
|
||
|
// ROLES is considered a non-reserved keywords so we can't match it in ShowCurrentRolesStatement_EDIT
|
||
|
if ($$[$0].identifierChain && $$[$0].identifierChain.length === 1 && $$[$0].identifierChain[0].name.toLowerCase() === 'roles') {
|
||
|
parser.suggestKeywords(['CURRENT']);
|
||
|
parser.yy.locations.pop();
|
||
|
} else {
|
||
|
parser.addTablePrimary($$[$0]);
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['COLUMN STATS', 'CREATE TABLE', 'FILES IN', 'PARTITIONS', 'RANGE PARTITIONS', 'TABLE STATS']);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3153:
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['AGGREGATE FUNCTIONS', 'ANALYTIC FUNCTIONS', 'DATABASES', 'FUNCTIONS', 'SCHEMAS', 'TABLES']);
|
||
|
} else if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['DATABASES', 'SCHEMAS', 'TABLE EXTENDED']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3172: case 3202: case 3262: case 3266: case 3268: case 3296:
|
||
|
|
||
|
parser.suggestTables();
|
||
|
parser.suggestDatabases({
|
||
|
appendDot: true
|
||
|
});
|
||
|
|
||
|
break;
|
||
|
case 3176: case 3177: case 3181: case 3182: case 3241: case 3242:
|
||
|
|
||
|
parser.suggestKeywords(['FROM', 'IN']);
|
||
|
|
||
|
break;
|
||
|
case 3178: case 3179: case 3180: case 3225: case 3239:
|
||
|
|
||
|
parser.suggestTables();
|
||
|
|
||
|
break;
|
||
|
case 3187:
|
||
|
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['TABLE', 'VIEW']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['TABLE']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3188:
|
||
|
|
||
|
if ($$[$0-1].isView && parser.isImpala()) {
|
||
|
parser.suggestTables({ onlyViews: true });
|
||
|
} else {
|
||
|
parser.suggestTables();
|
||
|
}
|
||
|
parser.suggestDatabases({
|
||
|
appendDot: true
|
||
|
});
|
||
|
|
||
|
break;
|
||
|
case 3189:
|
||
|
|
||
|
if (parser.yy.result.suggestTables && $$[$0-1].isView) {
|
||
|
parser.yy.result.suggestTables.onlyViews = true;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3190:
|
||
|
|
||
|
parser.addTablePrimary($$[$0]);
|
||
|
if (parser.isImpala()) {
|
||
|
parser.suggestKeywords(['TABLE', 'VIEW']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['TABLE']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3192:
|
||
|
this.$ = { isView: true };
|
||
|
break;
|
||
|
case 3195: case 3196:
|
||
|
|
||
|
parser.suggestKeywords([ 'ROLES' ]);
|
||
|
|
||
|
break;
|
||
|
case 3199: case 3293:
|
||
|
|
||
|
parser.suggestKeywords(['LIKE']);
|
||
|
|
||
|
break;
|
||
|
case 3206:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-1]);
|
||
|
parser.suggestKeywords(['IN']);
|
||
|
|
||
|
break;
|
||
|
case 3211: case 3214:
|
||
|
|
||
|
parser.suggestKeywords(['FUNCTIONS']);
|
||
|
|
||
|
break;
|
||
|
case 3212: case 3215:
|
||
|
|
||
|
parser.suggestKeywords(['AGGREGATE', 'ANALYTICAL']);
|
||
|
|
||
|
break;
|
||
|
case 3213: case 3302:
|
||
|
|
||
|
if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['IN', 'LIKE']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['LIKE']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3216:
|
||
|
|
||
|
if (!$$[$0-2]) {
|
||
|
parser.suggestKeywords([{ value: 'IN', weight: 2 }, { value: 'LIKE', weight: 1 }]);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['LIKE']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3224:
|
||
|
|
||
|
parser.suggestKeywords(['ALL', 'TABLE']);
|
||
|
parser.suggestTables();
|
||
|
|
||
|
break;
|
||
|
case 3244:
|
||
|
|
||
|
parser.suggestTables({identifierChain: [{name: $$[$0]}]});
|
||
|
|
||
|
break;
|
||
|
case 3250:
|
||
|
|
||
|
parser.suggestTables();
|
||
|
parser.suggestDatabases({
|
||
|
appendDot: true
|
||
|
});
|
||
|
parser.suggestKeywords(['DATABASE', 'SCHEMA']);
|
||
|
|
||
|
break;
|
||
|
case 3252:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-1]);
|
||
|
parser.suggestKeywords(['EXTENDED', 'PARTITION']);
|
||
|
|
||
|
break;
|
||
|
case 3255:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-2]);
|
||
|
parser.suggestKeywords(['EXTENDED']);
|
||
|
|
||
|
break;
|
||
|
case 3272: case 3273: case 3274:
|
||
|
|
||
|
parser.suggestKeywords(['GRANT']);
|
||
|
|
||
|
break;
|
||
|
case 3275: case 3276:
|
||
|
|
||
|
parser.suggestKeywords(['ROLE', 'USER']);
|
||
|
|
||
|
break;
|
||
|
case 3283: case 3292:
|
||
|
|
||
|
parser.suggestKeywords(['EXTENDED']);
|
||
|
|
||
|
break;
|
||
|
case 3286:
|
||
|
|
||
|
if ($$[$0-1]) {
|
||
|
parser.suggestKeywords(['LIKE']);
|
||
|
} else {
|
||
|
parser.suggestKeywords(['FROM', 'IN', 'LIKE']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3288:
|
||
|
|
||
|
if (parser.isHive()) {
|
||
|
parser.suggestKeywords(['EXTENDED']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3289:
|
||
|
|
||
|
parser.suggestKeywords(['LIKE']);
|
||
|
|
||
|
break;
|
||
|
case 3290:
|
||
|
|
||
|
parser.suggestKeywords(['PARTITION']);
|
||
|
|
||
|
break;
|
||
|
case 3297:
|
||
|
|
||
|
parser.addTablePrimary($$[$0]);
|
||
|
|
||
|
break;
|
||
|
case 3304:
|
||
|
|
||
|
parser.addTablePrimary($$[$0-3]);
|
||
|
|
||
|
break;
|
||
|
case 3309:
|
||
|
|
||
|
if (!$$[$0-1] && !$$[$0-2]) {
|
||
|
parser.suggestKeywords([{ value: 'IN', weight: 2 }, { value: 'FROM', weight: 2 }, { value: 'LIKE', weight: 1 }]);
|
||
|
} else if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords(['LIKE']);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3313: case 3314:
|
||
|
|
||
|
parser.addDatabaseLocation(_$[$0], [ { name: $$[$0] } ]);
|
||
|
|
||
|
break;
|
||
|
case 3325:
|
||
|
|
||
|
if (parser.isImpala() && !$$[$0-1] && !$$[$0-2]) {
|
||
|
parser.suggestKeywords([{ value: 'FROM', weight: 2 }, { value: 'WHERE', weight: 1 }]);
|
||
|
} else if (parser.isImpala() && !$$[$0-1] && $$[$0-2]) {
|
||
|
var keywords = [{ value: 'FULL JOIN', weight: 2 }, { value: 'FULL OUTER JOIN', weight: 2 }, { value: 'JOIN', weight: 2 }, { value: 'LEFT JOIN', weight: 2 }, { value: 'LEFT OUTER JOIN', weight: 2 }, { value: 'RIGHT JOIN', weight: 2 }, { value: 'RIGHT OUTER JOIN', weight: 2 }, { value: 'INNER JOIN', weight: 2 }, { value: 'LEFT ANTI JOIN', weight: 2 }, { value: 'LEFT SEMI JOIN', weight: 2 }, { value: 'RIGHT ANTI JOIN', weight: 2 }, { value: 'RIGHT SEMI JOIN', weight: 2 }, { value: 'WHERE', weight: 1 }];
|
||
|
if ($$[$0-2].suggestJoinConditions) {
|
||
|
parser.suggestJoinConditions($$[$0-2].suggestJoinConditions);
|
||
|
}
|
||
|
if ($$[$0-2].suggestJoins) {
|
||
|
parser.suggestJoins($$[$0-2].suggestJoins);
|
||
|
}
|
||
|
if ($$[$0-2].suggestKeywords) {
|
||
|
keywords = keywords.concat(parser.createWeightedKeywords($$[$0-2].suggestKeywords, 3));
|
||
|
}
|
||
|
parser.suggestKeywords(keywords);
|
||
|
} else if (!$$[$0-1]) {
|
||
|
parser.suggestKeywords([ 'WHERE' ]);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case 3326:
|
||
|
|
||
|
parser.suggestKeywords([ 'SET' ]);
|
||
|
|
||
|
break;
|
||
|
case 3342:
|
||
|
|
||
|
parser.suggestKeywords([ '=' ]);
|
||
|
|
||
|
break;
|
||
|
case 3353:
|
||
|
|
||
|
if (! parser.yy.cursorFound) {
|
||
|
parser.yy.result.useDatabase = $$[$0];
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
},
|
||
|
table: [o($V0,$V1,{3:1,4:2}),{1:[3]},o($V2,$V3,{5:3,9:4,12:5,13:6,14:7,15:8,406:9,407:10,408:11,409:12,410:13,411:14,412:15,413:16,414:17,415:18,416:19,417:20,418:21,419:22,420:23,1117:24,1118:25,1119:26,1120:27,1121:28,1122:29,1123:30,571:31,17:32,565:35,566:36,800:37,801:38,802:39,803:40,804:41,805:42,806:43,923:48,924:49,925:50,926:51,927:52,928:53,929:54,1136:55,1137:56,1138:57,1139:58,1140:59,1141:60,1142:61,1143:62,1144:63,1251:70,1252:71,1253:72,1254:73,1255:74,1256:75,1257:76,1258:77,1259:78,1260:79,1261:80,1262:81,1263:82,1264:83,1265:84,1266:85,1267:86,1268:87,1269:88,1270:89,1307:90,1129:93,1189:94,1130:95,1190:96,1240:97,818:106,908:107,438:111,1054:112,1055:113,1056:114,1057:115,1153:117,1154:118,1271:120,1191:123,593:124,1209:127,1226:128,1211:137,1216:139,1217:140,25:$V4,29:$V5,57:$V6,58:$V7,73:$V8,78:$V9,79:$Va,96:$Vb,112:$Vc,130:$Vd,144:$Ve,162:$Vf,182:$Vg,219:$Vh,308:$Vi,340:$Vj,353:$Vk,439:$Vl,440:$Vm,441:$Vn,453:$Vo,569:$Vp,570:$Vq,576:$Vr,759:$Vs,814:$Vt,857:$Vu,919:$Vv,920:$Vw,922:$Vx,1158:$Vy,1182:$Vz,1183:$VA,1184:$VB,1185:$VC,1187:$VD,1205:$VE,1220:$VF,1245:$VG,1246:$VH,1272:$VI,1308:$VJ}),{6:[1,143],10:[1,144]},o($V2,[2,6]),o($V2,[2,12]),o($V2,[2,13]),o($V2,[2,14]),{12:145,13:146,14:147,17:32,25:$V4,29:$V5,58:$V7,73:$V8,78:$V9,79:$Va,96:$Vb,112:$Vc,130:$Vd,144:$Ve,182:$Vg,219:$Vh,308:$Vi,340:$Vj,353:$Vk,406:9,407:10,408:11,409:12,410:13,411:14,412:15,413:16,414:17,415:18,416:19,417:20,418:21,419:22,420:23,438:111,439:$Vl,440:$Vm,441:$Vn,453:$Vo,565:35,566:36,569:$Vp,570:$Vq,571:31,576:$Vr,593:124,759:$Vs,800:37,801:38,802:39,803:40,804:41,805:42,806:43,814:$Vt,818:106,857:$Vu,908:107,919:$Vv,920:$Vw,922:$Vx,923:48,924:49,925:50,926:51,927:52,928:53,929:54,1054:112,1055:113,1056:114,1057:115,1117:24,1118:25,1119:26,1120:27,1121:28,1122:29,1123:30,1129:93,1130:95,1136:55,1137:56,1138:57,1139:58,1140:59,1141:60,1142:61,1143:62,1144:63,1153:117,1154:118,1158:$Vy,1182:$Vz,1183:$VA,1184:$VB,1185:$VC,1187:$VD,1189:94,1190:96,1191:123,1205:$VE,1209:127,1211:137,1216:139,1217:140,1220:$VF,1226:128,1240:97,1245:$VG,1246:$VH,1251:70,1252:71,1253:72,1254:73,1255:74,1256:75,1257:76,1258:77,1259:78,1260:79,1261:80,1262:81,1263:82,1264:83,1265:84,1266:85,1267:86,1268:87,1269:88,1270:89,1271:120,1272:$VI,1307:90,1308:$VJ},o($V2,[2,516]),o($V2,[2,517]),o($V2,[2,518]),o($V2,[2,519]),o($V2,[2,520]),o($V2,[2,521]),o($V2,[2,522]),o($V2,[2,523]),o($V2,[2,524]),o($V2,[2,525]),o($V2,[2,526]),o($V2,[2,527]),o($V2,[2,528]),o($V2,[2,529]),o($V2,[2,530]),o($V2,[2,2588]),o($V2,[2,2589]),o($V2,[2,2590]),o($V2,[2,2591]),o($V2,[2,2592]),o($V2,[2,2593]),o($V2,[2,2594]),o($VK,$VL,{572:148,581:149,583:150,348:$VM}),{308:$Vi,399:$VN,571:152,576:$Vr,593:124,1129:154,1130:155,1182:$VO,1184:$VB,1191:123,1209:127,1211:137,1216:139,1217:140,1220:$VF},o($VP,[2,171],{161:157,50:[1,159],163:[1,158],164:[1,160]}),o($VP,[2,168]),o($V2,[2,824]),o($V2,[2,825]),o($V2,[2,1650]),o($V2,[2,1651]),o($V2,[2,1652]),o($V2,[2,1653]),o($V2,[2,1654]),o($V2,[2,1655]),o($V2,[2,1656]),{193:[1,161]},{24:169,25:$VQ,26:$VR,27:$VS,28:$VT,29:$VU,30:$VV,31:$VW,32:$VX,33:$VY,34:$VZ,35:$V_,36:$V$,37:$V01,38:$V11,39:$V21,40:$V31,41:$V41,42:$V51,43:$V61,44:$V71,45:$V81,46:$V91,47:$Va1,48:$Vb1,49:$Vc1,50:$Vd1,51:$Ve1,52:$Vf1,53:$Vg1,54:$Vh1,55:$Vi1,56:$Vj1,57:$Vk1,58:$Vl1,59:$Vm1,60:$Vn1,61:$Vo1,62:$Vp1,63:$Vq1,64:$Vr1,65:$Vs1,66:$Vt1,67:$Vu1,68:$Vv1,69:$Vw1,70:$Vx1,71:$Vy1,72:$Vz1,73:$VA1,74:$VB1,75:$VC1,76:$VD1,77:$VE1,78:$VF1,79:$VG1,80:$VH1,81:$VI1,82:$VJ1,83:$VK1,84:$VL1,85:$VM1,86:$VN1,87:$VO1,88:$VP1,89:$VQ1,90:$VR1,91:$VS1,92:$VT1,93:$VU1,94:$VV1,95:$VW1,96:$VX1,97:$VY1,98:$VZ1,99:$V_1,100:$V$1,101:$V02,102:$V12,103:$V22,104:$V32,105:$V42,106:$V52,107:$V62,108:$V72,109:$V82,110:$V92,111:$Va2,112:$Vb2,113:$Vc2,114:$Vd2,115:$Ve2,116:$Vf2,117:$Vg2,118:$Vh2,119:$Vi2,120:$Vj2,121:$Vk2,122:$Vl2,123:$Vm2,124:$Vn2,125:$Vo2,126:$Vp2,127:$Vq2,128:$Vr2,129:$Vs2,130:$Vt2,131:$Vu2,132:$Vv2,133:$Vw2,134:$Vx2,135:$Vy2,136:$Vz2,137:$VA2,138:$VB2,139:$VC2,140:$VD2,141:$VE2,142:$VF2,143:$VG2,144:$VH2,145:$VI2,146:$VJ2,147:$VK2,148:$VL2,149:$VM2,150:$VN2,151:$VO2,152:$VP2,153:$
|
||
|
defaultActions: {143:[2,1],326:[2,2806],327:[2,2807],328:[2,2808],329:[2,2809],330:[2,2810],331:[2,2811],348:[2,2724],361:[2,3087],366:[2,3330],367:[2,3332],408:[2,1893],409:[2,1894],502:[2,581],503:[2,582],504:[2,584],505:[2,622],507:[2,635],510:[2,546],511:[2,547],512:[2,575],513:[2,576],530:[2,2997],531:[2,2998],575:[2,2812],582:[2,2886],619:[2,767],665:[2,605],666:[2,606],667:[2,1900],668:[2,1901],670:[2,595],671:[2,596],693:[2,1836],694:[2,1837],761:[2,634],794:[2,1398],795:[2,1399],796:[2,1400],797:[2,1401],798:[2,1402],799:[2,1403],825:[2,1529],826:[2,1530],827:[2,1531],828:[2,1532],829:[2,1533],830:[2,1534],831:[2,1535],832:[2,1536],833:[2,1537],834:[2,1538],835:[2,1539],836:[2,1540],837:[2,1541],838:[2,1542],839:[2,1543],840:[2,1544],841:[2,1545],842:[2,1546],843:[2,1547],844:[2,1548],845:[2,1549],846:[2,1550],847:[2,1551],899:[2,2887],943:[2,1355],944:[2,1357],945:[2,1359],946:[2,1361],947:[2,1363],948:[2,1365],949:[2,1367],950:[2,1369],952:[2,3074],953:[2,3075],956:[2,3089],961:[2,3344],1103:[2,562],1104:[2,563],1105:[2,564],1243:[2,3088],1366:[2,639],1424:[2,1415],1429:[2,1515],1430:[2,1516],1431:[2,1517],1432:[2,1518],1433:[2,1519],1434:[2,1520],1435:[2,1521],1436:[2,1522],1437:[2,1523],1488:[2,3066],1489:[2,3067],1514:[2,2230],1587:[2,1846],1589:[2,1847],1606:[2,2533],1664:[2,1416],1737:[2,607],1738:[2,608],1766:[2,2293],1772:[2,2192],1800:[2,2479],1805:[2,2513],1806:[2,2514],1807:[2,2515],1850:[2,3027],1908:[2,2224],1916:[2,599],1917:[2,600],1960:[2,1438],1961:[2,1443],2006:[2,2296],2015:[2,2194],2026:[2,2563],2057:[2,3015],2058:[2,3026],2070:[2,585],2071:[2,586],2125:[2,2195],2138:[2,2484],2162:[2,1467],2163:[2,1468],2164:[2,1469],2187:[2,2486],2198:[2,1444],2202:[2,1445],2247:[2,1473],2248:[2,1474]},
|
||
|
parseError: function parseError(str, hash) {
|
||
|
if (hash.recoverable) {
|
||
|
this.trace(str);
|
||
|
} else {
|
||
|
var error = new Error(str);
|
||
|
error.hash = hash;
|
||
|
throw error;
|
||
|
}
|
||
|
},
|
||
|
parse: function parse(input) {
|
||
|
var self = this,
|
||
|
stack = [0],
|
||
|
tstack = [], // token stack
|
||
|
vstack = [null], // semantic value stack
|
||
|
lstack = [], // location stack
|
||
|
table = this.table,
|
||
|
yytext = '',
|
||
|
yylineno = 0,
|
||
|
yyleng = 0,
|
||
|
recovering = 0,
|
||
|
TERROR = 2,
|
||
|
EOF = 1;
|
||
|
|
||
|
var args = lstack.slice.call(arguments, 1);
|
||
|
|
||
|
//this.reductionCount = this.shiftCount = 0;
|
||
|
|
||
|
var lexer = Object.create(this.lexer);
|
||
|
var sharedState = { yy: {} };
|
||
|
// copy state
|
||
|
for (var k in this.yy) {
|
||
|
if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
|
||
|
sharedState.yy[k] = this.yy[k];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
lexer.setInput(input, sharedState.yy);
|
||
|
sharedState.yy.lexer = lexer;
|
||
|
sharedState.yy.parser = this;
|
||
|
if (typeof lexer.yylloc == 'undefined') {
|
||
|
lexer.yylloc = {};
|
||
|
}
|
||
|
var yyloc = lexer.yylloc;
|
||
|
lstack.push(yyloc);
|
||
|
|
||
|
var ranges = lexer.options && lexer.options.ranges;
|
||
|
|
||
|
if (typeof sharedState.yy.parseError === 'function') {
|
||
|
this.parseError = sharedState.yy.parseError;
|
||
|
} else {
|
||
|
this.parseError = Object.getPrototypeOf(this).parseError;
|
||
|
}
|
||
|
|
||
|
function popStack (n) {
|
||
|
stack.length = stack.length - 2 * n;
|
||
|
vstack.length = vstack.length - n;
|
||
|
lstack.length = lstack.length - n;
|
||
|
}
|
||
|
|
||
|
_token_stack:
|
||
|
var lex = function () {
|
||
|
var token;
|
||
|
token = lexer.lex() || EOF;
|
||
|
// if token isn't its numeric value, convert
|
||
|
if (typeof token !== 'number') {
|
||
|
token = self.symbols_[token] || token;
|
||
|
}
|
||
|
return token;
|
||
|
}
|
||
|
|
||
|
var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
|
||
|
while (true) {
|
||
|
// retreive state number from top of stack
|
||
|
state = stack[stack.length - 1];
|
||
|
|
||
|
// use default actions if available
|
||
|
if (this.defaultActions[state]) {
|
||
|
action = this.defaultActions[state];
|
||
|
} else {
|
||
|
if (symbol === null || typeof symbol == 'undefined') {
|
||
|
symbol = lex();
|
||
|
}
|
||
|
// read action for current state and first input
|
||
|
action = table[state] && table[state][symbol];
|
||
|
}
|
||
|
|
||
|
_handle_error:
|
||
|
// handle parse error
|
||
|
if (typeof action === 'undefined' || !action.length || !action[0]) {
|
||
|
var error_rule_depth;
|
||
|
var errStr = '';
|
||
|
|
||
|
// Return the rule stack depth where the nearest error rule can be found.
|
||
|
// Return FALSE when no error recovery rule was found.
|
||
|
function locateNearestErrorRecoveryRule(state) {
|
||
|
var stack_probe = stack.length - 1;
|
||
|
var depth = 0;
|
||
|
|
||
|
// try to recover from error
|
||
|
for(;;) {
|
||
|
// check for error recovery rule in this state
|
||
|
if ((TERROR.toString()) in table[state]) {
|
||
|
return depth;
|
||
|
}
|
||
|
if (state === 0 || stack_probe < 2) {
|
||
|
return false; // No suitable error recovery rule available.
|
||
|
}
|
||
|
stack_probe -= 2; // popStack(1): [symbol, action]
|
||
|
state = stack[stack_probe];
|
||
|
++depth;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!recovering) {
|
||
|
// first see if there's any chance at hitting an error recovery rule:
|
||
|
error_rule_depth = locateNearestErrorRecoveryRule(state);
|
||
|
|
||
|
// Report error
|
||
|
expected = [];
|
||
|
for (p in table[state]) {
|
||
|
if (this.terminals_[p] && p > TERROR) {
|
||
|
expected.push("'"+this.terminals_[p]+"'");
|
||
|
}
|
||
|
}
|
||
|
if (lexer.showPosition) {
|
||
|
errStr = 'Parse error on line '+(yylineno+1)+":\n"+lexer.showPosition()+"\nExpecting "+expected.join(', ') + ", got '" + (this.terminals_[symbol] || symbol)+ "'";
|
||
|
} else {
|
||
|
errStr = 'Parse error on line '+(yylineno+1)+": Unexpected " +
|
||
|
(symbol == EOF ? "end of input" :
|
||
|
("'"+(this.terminals_[symbol] || symbol)+"'"));
|
||
|
}
|
||
|
this.parseError(errStr, {
|
||
|
text: lexer.match,
|
||
|
token: this.terminals_[symbol] || symbol,
|
||
|
line: lexer.yylineno,
|
||
|
loc: lexer.yylloc, ruleId: stack.slice(stack.length - 2, stack.length).join(),
|
||
|
expected: expected,
|
||
|
recoverable: (error_rule_depth !== false)
|
||
|
});
|
||
|
} else if (preErrorSymbol !== EOF) {
|
||
|
error_rule_depth = locateNearestErrorRecoveryRule(state);
|
||
|
}
|
||
|
|
||
|
// just recovered from another error
|
||
|
if (recovering == 3) {
|
||
|
if (symbol === EOF || preErrorSymbol === EOF) {
|
||
|
throw new Error(errStr || 'Parsing halted while starting to recover from another error.');
|
||
|
}
|
||
|
|
||
|
// discard current lookahead and grab another
|
||
|
yyleng = lexer.yyleng;
|
||
|
yytext = lexer.yytext;
|
||
|
yylineno = lexer.yylineno;
|
||
|
yyloc = lexer.yylloc;
|
||
|
symbol = lex();
|
||
|
}
|
||
|
|
||
|
// try to recover from error
|
||
|
if (error_rule_depth === false) {
|
||
|
throw new Error(errStr || 'Parsing halted. No suitable error recovery rule available.');
|
||
|
}
|
||
|
popStack(error_rule_depth);
|
||
|
|
||
|
preErrorSymbol = (symbol == TERROR ? null : symbol); // save the lookahead token
|
||
|
symbol = TERROR; // insert generic error symbol as new lookahead
|
||
|
state = stack[stack.length-1];
|
||
|
action = table[state] && table[state][TERROR];
|
||
|
recovering = 3; // allow 3 real symbols to be shifted before reporting a new error
|
||
|
}
|
||
|
|
||
|
// this shouldn't happen, unless resolve defaults are off
|
||
|
if (action[0] instanceof Array && action.length > 1) {
|
||
|
throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol);
|
||
|
}
|
||
|
|
||
|
switch (action[0]) {
|
||
|
case 1: // shift
|
||
|
//this.shiftCount++;
|
||
|
|
||
|
stack.push(symbol);
|
||
|
vstack.push(lexer.yytext);
|
||
|
lstack.push(lexer.yylloc);
|
||
|
stack.push(action[1]); // push state
|
||
|
symbol = null;
|
||
|
if (!preErrorSymbol) { // normal execution/no error
|
||
|
yyleng = lexer.yyleng;
|
||
|
yytext = lexer.yytext;
|
||
|
yylineno = lexer.yylineno;
|
||
|
yyloc = lexer.yylloc;
|
||
|
if (recovering > 0) {
|
||
|
recovering--;
|
||
|
}
|
||
|
} else {
|
||
|
// error just occurred, resume old lookahead f/ before error
|
||
|
symbol = preErrorSymbol;
|
||
|
preErrorSymbol = null;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
// reduce
|
||
|
//this.reductionCount++;
|
||
|
|
||
|
len = this.productions_[action[1]][1];
|
||
|
|
||
|
// perform semantic action
|
||
|
yyval.$ = vstack[vstack.length-len]; // default to $$ = $1
|
||
|
// default location, uses first token for firsts, last for lasts
|
||
|
yyval._$ = {
|
||
|
first_line: lstack[lstack.length-(len||1)].first_line,
|
||
|
last_line: lstack[lstack.length-1].last_line,
|
||
|
first_column: lstack[lstack.length-(len||1)].first_column,
|
||
|
last_column: lstack[lstack.length-1].last_column
|
||
|
};
|
||
|
if (ranges) {
|
||
|
yyval._$.range = [lstack[lstack.length-(len||1)].range[0], lstack[lstack.length-1].range[1]];
|
||
|
}
|
||
|
r = this.performAction.apply(yyval, [yytext, yyleng, yylineno, sharedState.yy, action[1], vstack, lstack].concat(args));
|
||
|
|
||
|
if (typeof r !== 'undefined') {
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
// pop off stack
|
||
|
if (len) {
|
||
|
stack = stack.slice(0,-1*len*2);
|
||
|
vstack = vstack.slice(0, -1*len);
|
||
|
lstack = lstack.slice(0, -1*len);
|
||
|
}
|
||
|
|
||
|
stack.push(this.productions_[action[1]][0]); // push nonterminal (reduce)
|
||
|
vstack.push(yyval.$);
|
||
|
lstack.push(yyval._$);
|
||
|
// goto new state = table[STATE][NONTERMINAL]
|
||
|
newState = table[stack[stack.length-2]][stack[stack.length-1]];
|
||
|
stack.push(newState);
|
||
|
break;
|
||
|
|
||
|
case 3:
|
||
|
// accept
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}};
|
||
|
|
||
|
SqlParseSupport.initSyntaxParser(parser);
|
||
|
/* generated by jison-lex 0.3.4 */
|
||
|
var lexer = (function(){
|
||
|
var lexer = ({
|
||
|
|
||
|
EOF:1,
|
||
|
|
||
|
parseError:function parseError(str, hash) {
|
||
|
if (this.yy.parser) {
|
||
|
this.yy.parser.parseError(str, hash);
|
||
|
} else {
|
||
|
throw new Error(str);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
// resets the lexer, sets new input
|
||
|
setInput:function (input, yy) {
|
||
|
this.yy = yy || this.yy || {};
|
||
|
this._input = input;
|
||
|
this._more = this._backtrack = this.done = false;
|
||
|
this.yylineno = this.yyleng = 0;
|
||
|
this.yytext = this.matched = this.match = '';
|
||
|
this.conditionStack = ['INITIAL'];
|
||
|
this.yylloc = {
|
||
|
first_line: 1,
|
||
|
first_column: 0,
|
||
|
last_line: 1,
|
||
|
last_column: 0
|
||
|
};
|
||
|
if (this.options.ranges) {
|
||
|
this.yylloc.range = [0,0];
|
||
|
}
|
||
|
this.offset = 0;
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
// consumes and returns one char from the input
|
||
|
input:function () {
|
||
|
var ch = this._input[0];
|
||
|
this.yytext += ch;
|
||
|
this.yyleng++;
|
||
|
this.offset++;
|
||
|
this.match += ch;
|
||
|
this.matched += ch;
|
||
|
var lines = ch.match(/(?:\r\n?|\n).*/g);
|
||
|
if (lines) {
|
||
|
this.yylineno++;
|
||
|
this.yylloc.last_line++;
|
||
|
} else {
|
||
|
this.yylloc.last_column++;
|
||
|
}
|
||
|
if (this.options.ranges) {
|
||
|
this.yylloc.range[1]++;
|
||
|
}
|
||
|
|
||
|
this._input = this._input.slice(1);
|
||
|
return ch;
|
||
|
},
|
||
|
|
||
|
// unshifts one char (or a string) into the input
|
||
|
unput:function (ch) {
|
||
|
var len = ch.length;
|
||
|
var lines = ch.split(/(?:\r\n?|\n)/g);
|
||
|
|
||
|
this._input = ch + this._input;
|
||
|
this.yytext = this.yytext.substr(0, this.yytext.length - len);
|
||
|
//this.yyleng -= len;
|
||
|
this.offset -= len;
|
||
|
var oldLines = this.match.split(/(?:\r\n?|\n)/g);
|
||
|
this.match = this.match.substr(0, this.match.length - 1);
|
||
|
this.matched = this.matched.substr(0, this.matched.length - 1);
|
||
|
|
||
|
if (lines.length - 1) {
|
||
|
this.yylineno -= lines.length - 1;
|
||
|
}
|
||
|
var r = this.yylloc.range;
|
||
|
|
||
|
this.yylloc = {
|
||
|
first_line: this.yylloc.first_line,
|
||
|
last_line: this.yylineno + 1,
|
||
|
first_column: this.yylloc.first_column,
|
||
|
last_column: lines ?
|
||
|
(lines.length === oldLines.length ? this.yylloc.first_column : 0)
|
||
|
+ oldLines[oldLines.length - lines.length].length - lines[0].length :
|
||
|
this.yylloc.first_column - len
|
||
|
};
|
||
|
|
||
|
if (this.options.ranges) {
|
||
|
this.yylloc.range = [r[0], r[0] + this.yyleng - len];
|
||
|
}
|
||
|
this.yyleng = this.yytext.length;
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
// When called from action, caches matched text and appends it on next action
|
||
|
more:function () {
|
||
|
this._more = true;
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
|
||
|
reject:function () {
|
||
|
if (this.options.backtrack_lexer) {
|
||
|
this._backtrack = true;
|
||
|
} else {
|
||
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
|
||
|
text: "",
|
||
|
token: null,
|
||
|
line: this.yylineno
|
||
|
});
|
||
|
|
||
|
}
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
// retain first n characters of the match
|
||
|
less:function (n) {
|
||
|
this.unput(this.match.slice(n));
|
||
|
},
|
||
|
|
||
|
// displays already matched input, i.e. for error messages
|
||
|
pastInput:function () {
|
||
|
var past = this.matched.substr(0, this.matched.length - this.match.length);
|
||
|
return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
|
||
|
},
|
||
|
|
||
|
// displays upcoming input, i.e. for error messages
|
||
|
upcomingInput:function () {
|
||
|
var next = this.match;
|
||
|
if (next.length < 20) {
|
||
|
next += this._input.substr(0, 20-next.length);
|
||
|
}
|
||
|
return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
|
||
|
},
|
||
|
|
||
|
// displays the character position where the lexing error occurred, i.e. for error messages
|
||
|
showPosition:function () {
|
||
|
var pre = this.pastInput();
|
||
|
var c = new Array(pre.length + 1).join("-");
|
||
|
return pre + this.upcomingInput() + "\n" + c + "^";
|
||
|
},
|
||
|
|
||
|
// test the lexed token: return FALSE when not a match, otherwise return token
|
||
|
test_match:function (match, indexed_rule) {
|
||
|
var token,
|
||
|
lines,
|
||
|
backup;
|
||
|
|
||
|
if (this.options.backtrack_lexer) {
|
||
|
// save context
|
||
|
backup = {
|
||
|
yylineno: this.yylineno,
|
||
|
yylloc: {
|
||
|
first_line: this.yylloc.first_line,
|
||
|
last_line: this.last_line,
|
||
|
first_column: this.yylloc.first_column,
|
||
|
last_column: this.yylloc.last_column
|
||
|
},
|
||
|
yytext: this.yytext,
|
||
|
match: this.match,
|
||
|
matches: this.matches,
|
||
|
matched: this.matched,
|
||
|
yyleng: this.yyleng,
|
||
|
offset: this.offset,
|
||
|
_more: this._more,
|
||
|
_input: this._input,
|
||
|
yy: this.yy,
|
||
|
conditionStack: this.conditionStack.slice(0),
|
||
|
done: this.done
|
||
|
};
|
||
|
if (this.options.ranges) {
|
||
|
backup.yylloc.range = this.yylloc.range.slice(0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
lines = match[0].match(/(?:\r\n?|\n).*/g);
|
||
|
if (lines) {
|
||
|
this.yylineno += lines.length;
|
||
|
}
|
||
|
this.yylloc = {
|
||
|
first_line: this.yylloc.last_line,
|
||
|
last_line: this.yylineno + 1,
|
||
|
first_column: this.yylloc.last_column,
|
||
|
last_column: lines ?
|
||
|
lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
|
||
|
this.yylloc.last_column + match[0].length
|
||
|
};
|
||
|
this.yytext += match[0];
|
||
|
this.match += match[0];
|
||
|
this.matches = match;
|
||
|
this.yyleng = this.yytext.length;
|
||
|
if (this.options.ranges) {
|
||
|
this.yylloc.range = [this.offset, this.offset += this.yyleng];
|
||
|
}
|
||
|
this._more = false;
|
||
|
this._backtrack = false;
|
||
|
this._input = this._input.slice(match[0].length);
|
||
|
this.matched += match[0];
|
||
|
token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
|
||
|
if (this.done && this._input) {
|
||
|
this.done = false;
|
||
|
}
|
||
|
if (token) {
|
||
|
return token;
|
||
|
} else if (this._backtrack) {
|
||
|
// recover context
|
||
|
for (var k in backup) {
|
||
|
this[k] = backup[k];
|
||
|
}
|
||
|
return false; // rule action called reject() implying the next rule should be tested instead.
|
||
|
}
|
||
|
return false;
|
||
|
},
|
||
|
|
||
|
// return next match in input
|
||
|
next:function () {
|
||
|
if (this.done) {
|
||
|
return this.EOF;
|
||
|
}
|
||
|
if (!this._input) {
|
||
|
this.done = true;
|
||
|
}
|
||
|
|
||
|
var token,
|
||
|
match,
|
||
|
tempMatch,
|
||
|
index;
|
||
|
if (!this._more) {
|
||
|
this.yytext = '';
|
||
|
this.match = '';
|
||
|
}
|
||
|
var rules = this._currentRules();
|
||
|
for (var i = 0; i < rules.length; i++) {
|
||
|
tempMatch = this._input.match(this.rules[rules[i]]);
|
||
|
if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
|
||
|
match = tempMatch;
|
||
|
index = i;
|
||
|
if (this.options.backtrack_lexer) {
|
||
|
token = this.test_match(tempMatch, rules[i]);
|
||
|
if (token !== false) {
|
||
|
return token;
|
||
|
} else if (this._backtrack) {
|
||
|
match = false;
|
||
|
continue; // rule action called reject() implying a rule MISmatch.
|
||
|
} else {
|
||
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
||
|
return false;
|
||
|
}
|
||
|
} else if (!this.options.flex) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (match) {
|
||
|
token = this.test_match(match, rules[index]);
|
||
|
if (token !== false) {
|
||
|
return token;
|
||
|
}
|
||
|
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
|
||
|
return false;
|
||
|
}
|
||
|
if (this._input === "") {
|
||
|
return this.EOF;
|
||
|
} else {
|
||
|
return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
|
||
|
text: "",
|
||
|
token: null,
|
||
|
line: this.yylineno
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
|
||
|
// return next match that has a token
|
||
|
lex:function lex() {
|
||
|
var r = this.next();
|
||
|
if (r) {
|
||
|
return r;
|
||
|
} else {
|
||
|
return this.lex();
|
||
|
}
|
||
|
},
|
||
|
|
||
|
// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
|
||
|
begin:function begin(condition) {
|
||
|
this.conditionStack.push(condition);
|
||
|
},
|
||
|
|
||
|
// pop the previously active lexer condition state off the condition stack
|
||
|
popState:function popState() {
|
||
|
var n = this.conditionStack.length - 1;
|
||
|
if (n > 0) {
|
||
|
return this.conditionStack.pop();
|
||
|
} else {
|
||
|
return this.conditionStack[0];
|
||
|
}
|
||
|
},
|
||
|
|
||
|
// produce the lexer rule set which is active for the currently active lexer condition state
|
||
|
_currentRules:function _currentRules() {
|
||
|
if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
|
||
|
return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
|
||
|
} else {
|
||
|
return this.conditions["INITIAL"].rules;
|
||
|
}
|
||
|
},
|
||
|
|
||
|
// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
|
||
|
topState:function topState(n) {
|
||
|
n = this.conditionStack.length - 1 - Math.abs(n || 0);
|
||
|
if (n >= 0) {
|
||
|
return this.conditionStack[n];
|
||
|
} else {
|
||
|
return "INITIAL";
|
||
|
}
|
||
|
},
|
||
|
|
||
|
// alias for begin(condition)
|
||
|
pushState:function pushState(condition) {
|
||
|
this.begin(condition);
|
||
|
},
|
||
|
|
||
|
// return the number of states currently on the stack
|
||
|
stateStackSize:function stateStackSize() {
|
||
|
return this.conditionStack.length;
|
||
|
},
|
||
|
options: {"case-insensitive":true,"flex":true},
|
||
|
performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
|
||
|
var YYSTATE=YY_START;
|
||
|
switch($avoiding_name_collisions) {
|
||
|
case 0: /* skip whitespace */
|
||
|
break;
|
||
|
case 1: /* skip comments */
|
||
|
break;
|
||
|
case 2: /* skip comments */
|
||
|
break;
|
||
|
case 3: parser.yy.partialCursor = false; parser.yy.cursorFound = yy_.yylloc; return 18;
|
||
|
break;
|
||
|
case 4: parser.yy.partialCursor = true; parser.yy.cursorFound = yy_.yylloc; return 442;
|
||
|
break;
|
||
|
case 5: return 166;
|
||
|
break;
|
||
|
case 6: return 286;
|
||
|
break;
|
||
|
case 7: return 167;
|
||
|
break;
|
||
|
case 8: return 163;
|
||
|
break;
|
||
|
case 9: return 168;
|
||
|
break;
|
||
|
case 10: return 169;
|
||
|
break;
|
||
|
case 11: return 848;
|
||
|
break;
|
||
|
case 12: return 171;
|
||
|
break;
|
||
|
case 13: return 172;
|
||
|
break;
|
||
|
case 14: parser.determineCase(yy_.yytext); return 440;
|
||
|
break;
|
||
|
case 15: return 173;
|
||
|
break;
|
||
|
case 16: return 174;
|
||
|
break;
|
||
|
case 17: return 175;
|
||
|
break;
|
||
|
case 18: parser.determineCase(yy_.yytext); return 1158;
|
||
|
break;
|
||
|
case 19: parser.determineCase(yy_.yytext); return 569;
|
||
|
break;
|
||
|
case 20: return 164;
|
||
|
break;
|
||
|
case 21: return 178;
|
||
|
break;
|
||
|
case 22: return 179;
|
||
|
break;
|
||
|
case 23: return 180;
|
||
|
break;
|
||
|
case 24: return 181;
|
||
|
break;
|
||
|
case 25: return 182;
|
||
|
break;
|
||
|
case 26: return 183;
|
||
|
break;
|
||
|
case 27: parser.determineCase(yy_.yytext); return 1246;
|
||
|
break;
|
||
|
case 28: parser.determineCase(yy_.yytext); return 1182;
|
||
|
break;
|
||
|
case 29: return 184;
|
||
|
break;
|
||
|
case 30: return 185;
|
||
|
break;
|
||
|
case 31: return 187;
|
||
|
break;
|
||
|
case 32: return 322;
|
||
|
break;
|
||
|
case 33: return 199;
|
||
|
break;
|
||
|
case 34: return 200;
|
||
|
break;
|
||
|
case 35: return 201;
|
||
|
break;
|
||
|
case 36: return 189;
|
||
|
break;
|
||
|
case 37: return 190;
|
||
|
break;
|
||
|
case 38: return 1185;
|
||
|
break;
|
||
|
case 39: return 191;
|
||
|
break;
|
||
|
case 40: return 193;
|
||
|
break;
|
||
|
case 41: return 124;
|
||
|
break;
|
||
|
case 42: return 131;
|
||
|
break;
|
||
|
case 43: return 205;
|
||
|
break;
|
||
|
case 44: return 206;
|
||
|
break;
|
||
|
case 45: return 949;
|
||
|
break;
|
||
|
case 46: parser.determineCase(yy_.yytext); return 25;
|
||
|
break;
|
||
|
case 47: return 26;
|
||
|
break;
|
||
|
case 48: return 27;
|
||
|
break;
|
||
|
case 49: return 28;
|
||
|
break;
|
||
|
case 50: parser.determineCase(yy_.yytext); return 29;
|
||
|
break;
|
||
|
case 51: return 30;
|
||
|
break;
|
||
|
case 52: return 194;
|
||
|
break;
|
||
|
case 53: return 31;
|
||
|
break;
|
||
|
case 54: return 32;
|
||
|
break;
|
||
|
case 55: return 33;
|
||
|
break;
|
||
|
case 56: return 34;
|
||
|
break;
|
||
|
case 57: return 35;
|
||
|
break;
|
||
|
case 58: return 170;
|
||
|
break;
|
||
|
case 59: return 36;
|
||
|
break;
|
||
|
case 60: return 37;
|
||
|
break;
|
||
|
case 61: return 38;
|
||
|
break;
|
||
|
case 62: return 39;
|
||
|
break;
|
||
|
case 63: return 40;
|
||
|
break;
|
||
|
case 64: return 41;
|
||
|
break;
|
||
|
case 65: return 42;
|
||
|
break;
|
||
|
case 66: return 43;
|
||
|
break;
|
||
|
case 67: return 44;
|
||
|
break;
|
||
|
case 68: return 45;
|
||
|
break;
|
||
|
case 69: return 134;
|
||
|
break;
|
||
|
case 70: return 370;
|
||
|
break;
|
||
|
case 71: return 46;
|
||
|
break;
|
||
|
case 72: return 47;
|
||
|
break;
|
||
|
case 73: return 48;
|
||
|
break;
|
||
|
case 74: return 49;
|
||
|
break;
|
||
|
case 75: return 50;
|
||
|
break;
|
||
|
case 76: return 195;
|
||
|
break;
|
||
|
case 77: this.begin('hdfs'); return 51;
|
||
|
break;
|
||
|
case 78: return 52;
|
||
|
break;
|
||
|
case 79: return 176;
|
||
|
break;
|
||
|
case 80: return 53;
|
||
|
break;
|
||
|
case 81: return 55;
|
||
|
break;
|
||
|
case 82: return 54;
|
||
|
break;
|
||
|
case 83: return 56;
|
||
|
break;
|
||
|
case 84: parser.determineCase(yy_.yytext); return 57;
|
||
|
break;
|
||
|
case 85: parser.determineCase(yy_.yytext); return 58;
|
||
|
break;
|
||
|
case 86: return 59;
|
||
|
break;
|
||
|
case 87: return 60;
|
||
|
break;
|
||
|
case 88: return 61;
|
||
|
break;
|
||
|
case 89: return 62;
|
||
|
break;
|
||
|
case 90: return 63;
|
||
|
break;
|
||
|
case 91: return 196;
|
||
|
break;
|
||
|
case 92: return 181;
|
||
|
break;
|
||
|
case 93: return 64;
|
||
|
break;
|
||
|
case 94: return 135;
|
||
|
break;
|
||
|
case 95: return 68;
|
||
|
break;
|
||
|
case 96: return 197;
|
||
|
break;
|
||
|
case 97: return 198;
|
||
|
break;
|
||
|
case 98: this.begin('hdfs'); return 65;
|
||
|
break;
|
||
|
case 99: return 66;
|
||
|
break;
|
||
|
case 100: return 69;
|
||
|
break;
|
||
|
case 101: return 67;
|
||
|
break;
|
||
|
case 102: return 70;
|
||
|
break;
|
||
|
case 103: return 71;
|
||
|
break;
|
||
|
case 104: return 72;
|
||
|
break;
|
||
|
case 105: parser.determineCase(yy_.yytext); return 73;
|
||
|
break;
|
||
|
case 106: this.begin('hdfs'); return 74;
|
||
|
break;
|
||
|
case 107: return 186;
|
||
|
break;
|
||
|
case 108: return 75;
|
||
|
break;
|
||
|
case 109: return 76;
|
||
|
break;
|
||
|
case 110: return 78;
|
||
|
break;
|
||
|
case 111: return 77;
|
||
|
break;
|
||
|
case 112: return 136;
|
||
|
break;
|
||
|
case 113: return 137;
|
||
|
break;
|
||
|
case 114: return 79;
|
||
|
break;
|
||
|
case 115: return 98;
|
||
|
break;
|
||
|
case 116: return 80;
|
||
|
break;
|
||
|
case 117: return 81;
|
||
|
break;
|
||
|
case 118: return 82;
|
||
|
break;
|
||
|
case 119: return 83;
|
||
|
break;
|
||
|
case 120: return 84;
|
||
|
break;
|
||
|
case 121: return 85;
|
||
|
break;
|
||
|
case 122: return 86;
|
||
|
break;
|
||
|
case 123: this.begin('hdfs'); return 1199;
|
||
|
break;
|
||
|
case 124: return 87;
|
||
|
break;
|
||
|
case 125: return 88;
|
||
|
break;
|
||
|
case 126: return 89;
|
||
|
break;
|
||
|
case 127: return 90;
|
||
|
break;
|
||
|
case 128: return 91;
|
||
|
break;
|
||
|
case 129: return 92;
|
||
|
break;
|
||
|
case 130: return 93;
|
||
|
break;
|
||
|
case 131: return 138;
|
||
|
break;
|
||
|
case 132: return 94;
|
||
|
break;
|
||
|
case 133: return 95;
|
||
|
break;
|
||
|
case 134: parser.determineCase(yy_.yytext); return 96;
|
||
|
break;
|
||
|
case 135: return 97;
|
||
|
break;
|
||
|
case 136: return 99;
|
||
|
break;
|
||
|
case 137: return 100;
|
||
|
break;
|
||
|
case 138: return 101;
|
||
|
break;
|
||
|
case 139: return 102;
|
||
|
break;
|
||
|
case 140: return 103;
|
||
|
break;
|
||
|
case 141: return 104;
|
||
|
break;
|
||
|
case 142: return 105;
|
||
|
break;
|
||
|
case 143: return 106;
|
||
|
break;
|
||
|
case 144: return 139;
|
||
|
break;
|
||
|
case 145: return 202;
|
||
|
break;
|
||
|
case 146: return 107;
|
||
|
break;
|
||
|
case 147: return 108;
|
||
|
break;
|
||
|
case 148: return 109;
|
||
|
break;
|
||
|
case 149: return 110;
|
||
|
break;
|
||
|
case 150: return 111;
|
||
|
break;
|
||
|
case 151: parser.determineCase(yy_.yytext); return 112;
|
||
|
break;
|
||
|
case 152: return 192;
|
||
|
break;
|
||
|
case 153: return 113;
|
||
|
break;
|
||
|
case 154: return 845;
|
||
|
break;
|
||
|
case 155: return 652;
|
||
|
break;
|
||
|
case 156: return 114;
|
||
|
break;
|
||
|
case 157: return 115;
|
||
|
break;
|
||
|
case 158: return 116;
|
||
|
break;
|
||
|
case 159: return 203;
|
||
|
break;
|
||
|
case 160: return 117;
|
||
|
break;
|
||
|
case 161: return 118;
|
||
|
break;
|
||
|
case 162: return 119;
|
||
|
break;
|
||
|
case 163: return 204;
|
||
|
break;
|
||
|
case 164: return 120;
|
||
|
break;
|
||
|
case 165: return 121;
|
||
|
break;
|
||
|
case 166: return 122;
|
||
|
break;
|
||
|
case 167: return 123;
|
||
|
break;
|
||
|
case 168: return 125;
|
||
|
break;
|
||
|
case 169: return 126;
|
||
|
break;
|
||
|
case 170: return 127;
|
||
|
break;
|
||
|
case 171: return 128;
|
||
|
break;
|
||
|
case 172: return 129;
|
||
|
break;
|
||
|
case 173: parser.determineCase(yy_.yytext); return 130;
|
||
|
break;
|
||
|
case 174: return 132;
|
||
|
break;
|
||
|
case 175: return 133;
|
||
|
break;
|
||
|
case 176: return 140;
|
||
|
break;
|
||
|
case 177: return 207;
|
||
|
break;
|
||
|
case 178: return 141;
|
||
|
break;
|
||
|
case 179: return 208;
|
||
|
break;
|
||
|
case 180: return 209;
|
||
|
break;
|
||
|
case 181: return 210;
|
||
|
break;
|
||
|
case 182: return 897;
|
||
|
break;
|
||
|
case 183: return 211;
|
||
|
break;
|
||
|
case 184: return 212;
|
||
|
break;
|
||
|
case 185: return 213;
|
||
|
break;
|
||
|
case 186: return 214;
|
||
|
break;
|
||
|
case 187: return 895;
|
||
|
break;
|
||
|
case 188: return 215;
|
||
|
break;
|
||
|
case 189: return 216;
|
||
|
break;
|
||
|
case 190: return 887;
|
||
|
break;
|
||
|
case 191: parser.determineCase(yy_.yytext); return 453;
|
||
|
break;
|
||
|
case 192: parser.determineCase(yy_.yytext); return 922;
|
||
|
break;
|
||
|
case 193: parser.determineCase(yy_.yytext); parser.addStatementTypeLocation('CREATE', yy_.yylloc, yy.lexer.upcomingInput()); return 441;
|
||
|
break;
|
||
|
case 194: return 217;
|
||
|
break;
|
||
|
case 195: return 218;
|
||
|
break;
|
||
|
case 196: return 219;
|
||
|
break;
|
||
|
case 197: return 220;
|
||
|
break;
|
||
|
case 198: parser.determineCase(yy_.yytext); parser.addStatementTypeLocation('DESCRIBE', yy_.yylloc); return 570;
|
||
|
break;
|
||
|
case 199: return 221;
|
||
|
break;
|
||
|
case 200: parser.determineCase(yy_.yytext); parser.addStatementTypeLocation('EXPLAIN', yy_.yylloc); return 162;
|
||
|
break;
|
||
|
case 201: return 223;
|
||
|
break;
|
||
|
case 202: return 222;
|
||
|
break;
|
||
|
case 203: return 224;
|
||
|
break;
|
||
|
case 204: return 896;
|
||
|
break;
|
||
|
case 205: return 225;
|
||
|
break;
|
||
|
case 206: return 226;
|
||
|
break;
|
||
|
case 207: return 227;
|
||
|
break;
|
||
|
case 208: return 228;
|
||
|
break;
|
||
|
case 209: return 229;
|
||
|
break;
|
||
|
case 210: return 230;
|
||
|
break;
|
||
|
case 211: return 231;
|
||
|
break;
|
||
|
case 212: return 232;
|
||
|
break;
|
||
|
case 213: return 233;
|
||
|
break;
|
||
|
case 214: return 234;
|
||
|
break;
|
||
|
case 215: return 235;
|
||
|
break;
|
||
|
case 216: parser.determineCase(yy_.yytext); parser.addStatementTypeLocation('INSERT', yy_.yylloc); return 1184;
|
||
|
break;
|
||
|
case 217: return 237;
|
||
|
break;
|
||
|
case 218: return 236;
|
||
|
break;
|
||
|
case 219: return 238;
|
||
|
break;
|
||
|
case 220: parser.determineCase(yy_.yytext); parser.addStatementTypeLocation('INVALIDATE', yy_.yylloc, yy.lexer.upcomingInput()); return 920;
|
||
|
break;
|
||
|
case 221: this.begin('hdfs'); return 239;
|
||
|
break;
|
||
|
case 222: return 240;
|
||
|
break;
|
||
|
case 223: return 155;
|
||
|
break;
|
||
|
case 224: return 241;
|
||
|
break;
|
||
|
case 225: return 242;
|
||
|
break;
|
||
|
case 226: this.begin('hdfs'); return 967;
|
||
|
break;
|
||
|
case 227: return 243;
|
||
|
break;
|
||
|
case 228: return 244;
|
||
|
break;
|
||
|
case 229: parser.determineCase(yy_.yytext); parser.addStatementTypeLocation('LOAD', yy_.yylloc, yy.lexer.upcomingInput()); return 1245;
|
||
|
break;
|
||
|
case 230: this.begin('hdfs'); return 245;
|
||
|
break;
|
||
|
case 231: return 246;
|
||
|
break;
|
||
|
case 232: return 921;
|
||
|
break;
|
||
|
case 233: return 247;
|
||
|
break;
|
||
|
case 234: return 659;
|
||
|
break;
|
||
|
case 235: return 1032;
|
||
|
break;
|
||
|
case 236: return 1223;
|
||
|
break;
|
||
|
case 237: return 269;
|
||
|
break;
|
||
|
case 238: return 270;
|
||
|
break;
|
||
|
case 239: return 248;
|
||
|
break;
|
||
|
case 240: return 249;
|
||
|
break;
|
||
|
case 241: return 250;
|
||
|
break;
|
||
|
case 242: return 271;
|
||
|
break;
|
||
|
case 243: return 251;
|
||
|
break;
|
||
|
case 244: return 252;
|
||
|
break;
|
||
|
case 245: parser.determineCase(yy_.yytext); parser.addStatementTypeLocation('REFRESH', yy_.yylloc); return 919;
|
||
|
break;
|
||
|
case 246: return 899;
|
||
|
break;
|
||
|
case 247: return 253;
|
||
|
break;
|
||
|
case 248: return 758;
|
||
|
break;
|
||
|
case 249: return 254;
|
||
|
break;
|
||
|
case 250: return 255;
|
||
|
break;
|
||
|
case 251: return 256;
|
||
|
break;
|
||
|
case 252: parser.determineCase(yy_.yytext); parser.addStatementTypeLocation('REVOKE', yy_.yylloc); return 1187;
|
||
|
break;
|
||
|
case 253: return 272;
|
||
|
break;
|
||
|
case 254: return 273;
|
||
|
break;
|
||
|
case 255: return 257;
|
||
|
break;
|
||
|
case 256: return 258;
|
||
|
break;
|
||
|
case 257: return 149;
|
||
|
break;
|
||
|
case 258: return 259;
|
||
|
break;
|
||
|
case 259: return 260;
|
||
|
break;
|
||
|
case 260: return 275;
|
||
|
break;
|
||
|
case 261: return 261;
|
||
|
break;
|
||
|
case 262: return 262;
|
||
|
break;
|
||
|
case 263: return 263;
|
||
|
break;
|
||
|
case 264: return 264;
|
||
|
break;
|
||
|
case 265: return 265;
|
||
|
break;
|
||
|
case 266: return 276;
|
||
|
break;
|
||
|
case 267: return 277;
|
||
|
break;
|
||
|
case 268: return 278;
|
||
|
break;
|
||
|
case 269: return 544;
|
||
|
break;
|
||
|
case 270: return 279;
|
||
|
break;
|
||
|
case 271: parser.determineCase(yy_.yytext); parser.addStatementTypeLocation('UPSERT', yy_.yylloc); return 1220;
|
||
|
break;
|
||
|
case 272: return 148;
|
||
|
break;
|
||
|
case 273: return 266;
|
||
|
break;
|
||
|
case 274: return 821;
|
||
|
break;
|
||
|
case 275: return 142;
|
||
|
break;
|
||
|
case 276: return 267;
|
||
|
break;
|
||
|
case 277: return 286;
|
||
|
break;
|
||
|
case 278: return 151;
|
||
|
break;
|
||
|
case 279: return 152;
|
||
|
break;
|
||
|
case 280: return 143;
|
||
|
break;
|
||
|
case 281: return 153;
|
||
|
break;
|
||
|
case 282: return 154;
|
||
|
break;
|
||
|
case 283: return 144;
|
||
|
break;
|
||
|
case 284: return 322;
|
||
|
break;
|
||
|
case 285: return 145;
|
||
|
break;
|
||
|
case 286: return 146;
|
||
|
break;
|
||
|
case 287: return 147;
|
||
|
break;
|
||
|
case 288: return 118;
|
||
|
break;
|
||
|
case 289: return 150;
|
||
|
break;
|
||
|
case 290: return 280;
|
||
|
break;
|
||
|
case 291: return 268;
|
||
|
break;
|
||
|
case 292: return 274;
|
||
|
break;
|
||
|
case 293: return 281;
|
||
|
break;
|
||
|
case 294: return 282;
|
||
|
break;
|
||
|
case 295: return 283;
|
||
|
break;
|
||
|
case 296: return 284;
|
||
|
break;
|
||
|
case 297: this.popState(); return 664;
|
||
|
break;
|
||
|
case 298: return 285;
|
||
|
break;
|
||
|
case 299: parser.determineCase(yy_.yytext); parser.addStatementTypeLocation('ALTER', yy_.yylloc, yy.lexer.upcomingInput()); return 814;
|
||
|
break;
|
||
|
case 300: return 386;
|
||
|
break;
|
||
|
case 301: return 287;
|
||
|
break;
|
||
|
case 302: return 288;
|
||
|
break;
|
||
|
case 303: this.begin('between'); return 289;
|
||
|
break;
|
||
|
case 304: return 290;
|
||
|
break;
|
||
|
case 305: return 291;
|
||
|
break;
|
||
|
case 306: return 292;
|
||
|
break;
|
||
|
case 307: return 293;
|
||
|
break;
|
||
|
case 308: return 294;
|
||
|
break;
|
||
|
case 309: parser.determineCase(yy_.yytext); return 439;
|
||
|
break;
|
||
|
case 310: return 295;
|
||
|
break;
|
||
|
case 311: return 296;
|
||
|
break;
|
||
|
case 312: return 297;
|
||
|
break;
|
||
|
case 313: return 298;
|
||
|
break;
|
||
|
case 314: return 299;
|
||
|
break;
|
||
|
case 315: return 394;
|
||
|
break;
|
||
|
case 316: return 300;
|
||
|
break;
|
||
|
case 317: return 301;
|
||
|
break;
|
||
|
case 318: parser.determineCase(yy_.yytext); parser.addStatementTypeLocation('DROP', yy_.yylloc, yy.lexer.upcomingInput()); return 857;
|
||
|
break;
|
||
|
case 319: return 302;
|
||
|
break;
|
||
|
case 320: return 303;
|
||
|
break;
|
||
|
case 321: parser.yy.correlatedSubQuery = true; return 304;
|
||
|
break;
|
||
|
case 322: return 305;
|
||
|
break;
|
||
|
case 323: return 306;
|
||
|
break;
|
||
|
case 324: return 307;
|
||
|
break;
|
||
|
case 325: parser.determineCase(yy_.yytext); return 308;
|
||
|
break;
|
||
|
case 326: return 309;
|
||
|
break;
|
||
|
case 327: return 310;
|
||
|
break;
|
||
|
case 328: return 311;
|
||
|
break;
|
||
|
case 329: return 312;
|
||
|
break;
|
||
|
case 330: return 313;
|
||
|
break;
|
||
|
case 331: return 314;
|
||
|
break;
|
||
|
case 332: return 1205;
|
||
|
break;
|
||
|
case 333: return 315;
|
||
|
break;
|
||
|
case 334: return 316;
|
||
|
break;
|
||
|
case 335: return 317;
|
||
|
break;
|
||
|
case 336: return 318;
|
||
|
break;
|
||
|
case 337: return 319;
|
||
|
break;
|
||
|
case 338: return 320;
|
||
|
break;
|
||
|
case 339: return 321;
|
||
|
break;
|
||
|
case 340: return 323;
|
||
|
break;
|
||
|
case 341: return 324;
|
||
|
break;
|
||
|
case 342: return 325;
|
||
|
break;
|
||
|
case 343: return 157;
|
||
|
break;
|
||
|
case 344: return 387;
|
||
|
break;
|
||
|
case 345: return 326;
|
||
|
break;
|
||
|
case 346: return 327;
|
||
|
break;
|
||
|
case 347: return 329;
|
||
|
break;
|
||
|
case 348: return 330;
|
||
|
break;
|
||
|
case 349: return 331;
|
||
|
break;
|
||
|
case 350: return 332;
|
||
|
break;
|
||
|
case 351: return 333;
|
||
|
break;
|
||
|
case 352: return 334;
|
||
|
break;
|
||
|
case 353: return 335;
|
||
|
break;
|
||
|
case 354: return 336;
|
||
|
break;
|
||
|
case 355: return 337;
|
||
|
break;
|
||
|
case 356: return 338;
|
||
|
break;
|
||
|
case 357: parser.determineCase(yy_.yytext); parser.addStatementTypeLocation('SELECT', yy_.yylloc); return 576;
|
||
|
break;
|
||
|
case 358: return 339;
|
||
|
break;
|
||
|
case 359: parser.determineCase(yy_.yytext); parser.addStatementTypeLocation('SET', yy_.yylloc); return 340;
|
||
|
break;
|
||
|
case 360: parser.determineCase(yy_.yytext); parser.addStatementTypeLocation('SHOW', yy_.yylloc); return 1272;
|
||
|
break;
|
||
|
case 361: return 341;
|
||
|
break;
|
||
|
case 362: return 342;
|
||
|
break;
|
||
|
case 363: return 343;
|
||
|
break;
|
||
|
case 364: return 344;
|
||
|
break;
|
||
|
case 365: return 345;
|
||
|
break;
|
||
|
case 366: return 346;
|
||
|
break;
|
||
|
case 367: return 825;
|
||
|
break;
|
||
|
case 368: return 347;
|
||
|
break;
|
||
|
case 369: parser.determineCase(yy_.yytext); parser.addStatementTypeLocation('TRUNCATE', yy_.yylloc, yy.lexer.upcomingInput()); return 759;
|
||
|
break;
|
||
|
case 370: return 780;
|
||
|
break;
|
||
|
case 371: parser.determineCase(yy_.yytext); return 1183;
|
||
|
break;
|
||
|
case 372: parser.determineCase(yy_.yytext); parser.addStatementTypeLocation('USE', yy_.yylloc); return 1308;
|
||
|
break;
|
||
|
case 373: return 348;
|
||
|
break;
|
||
|
case 374: return 1093;
|
||
|
break;
|
||
|
case 375: return 350;
|
||
|
break;
|
||
|
case 376: return 349;
|
||
|
break;
|
||
|
case 377: return 351;
|
||
|
break;
|
||
|
case 378: return 352;
|
||
|
break;
|
||
|
case 379: parser.determineCase(yy_.yytext); parser.addStatementTypeLocation('WITH', yy_.yylloc); return 353;
|
||
|
break;
|
||
|
case 380: return 328;
|
||
|
break;
|
||
|
case 381: return 156;
|
||
|
break;
|
||
|
case 382: yy.lexer.unput('('); yy_.yytext = 'avg'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 354;
|
||
|
break;
|
||
|
case 383: yy.lexer.unput('('); yy_.yytext = 'cast'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 355;
|
||
|
break;
|
||
|
case 384: yy.lexer.unput('('); yy_.yytext = 'count'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 356;
|
||
|
break;
|
||
|
case 385: yy.lexer.unput('('); yy_.yytext = 'max'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 357;
|
||
|
break;
|
||
|
case 386: yy.lexer.unput('('); yy_.yytext = 'min'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 358;
|
||
|
break;
|
||
|
case 387: yy.lexer.unput('('); yy_.yytext = 'stddev_pop'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 359;
|
||
|
break;
|
||
|
case 388: yy.lexer.unput('('); yy_.yytext = 'stddev_samp'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 360;
|
||
|
break;
|
||
|
case 389: yy.lexer.unput('('); yy_.yytext = 'sum'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 361;
|
||
|
break;
|
||
|
case 390: yy.lexer.unput('('); yy_.yytext = 'variance'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 362;
|
||
|
break;
|
||
|
case 391: yy.lexer.unput('('); yy_.yytext = 'var_pop'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 363;
|
||
|
break;
|
||
|
case 392: yy.lexer.unput('('); yy_.yytext = 'var_samp'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 364;
|
||
|
break;
|
||
|
case 393: yy.lexer.unput('('); yy_.yytext = 'collect_set'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 365;
|
||
|
break;
|
||
|
case 394: yy.lexer.unput('('); yy_.yytext = 'collect_list'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 366;
|
||
|
break;
|
||
|
case 395: yy.lexer.unput('('); yy_.yytext = 'corr'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 367;
|
||
|
break;
|
||
|
case 396: yy.lexer.unput('('); yy_.yytext = 'covar_pop'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 368;
|
||
|
break;
|
||
|
case 397: yy.lexer.unput('('); yy_.yytext = 'covar_samp'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 369;
|
||
|
break;
|
||
|
case 398: yy.lexer.unput('('); yy_.yytext = 'extract'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 789;
|
||
|
break;
|
||
|
case 399: yy.lexer.unput('('); yy_.yytext = 'histogram_numeric'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 371;
|
||
|
break;
|
||
|
case 400: yy.lexer.unput('('); yy_.yytext = 'ntile'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 372;
|
||
|
break;
|
||
|
case 401: yy.lexer.unput('('); yy_.yytext = 'percentile'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 373;
|
||
|
break;
|
||
|
case 402: yy.lexer.unput('('); yy_.yytext = 'percentile_approx'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 374;
|
||
|
break;
|
||
|
case 403: yy.lexer.unput('('); yy_.yytext = 'appx_median'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 375;
|
||
|
break;
|
||
|
case 404: yy.lexer.unput('('); yy_.yytext = 'extract'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 376;
|
||
|
break;
|
||
|
case 405: yy.lexer.unput('('); yy_.yytext = 'group_concat'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 377;
|
||
|
break;
|
||
|
case 406: yy.lexer.unput('('); yy_.yytext = 'ndv'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 378;
|
||
|
break;
|
||
|
case 407: yy.lexer.unput('('); yy_.yytext = 'stddev'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 379;
|
||
|
break;
|
||
|
case 408: yy.lexer.unput('('); yy_.yytext = 'variance_pop'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 380;
|
||
|
break;
|
||
|
case 409: yy.lexer.unput('('); yy_.yytext = 'variance_samp'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 381;
|
||
|
break;
|
||
|
case 410: yy.lexer.unput('('); yy_.yytext = 'cume_dist'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 382;
|
||
|
break;
|
||
|
case 411: yy.lexer.unput('('); yy_.yytext = 'dense_rank'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 382;
|
||
|
break;
|
||
|
case 412: yy.lexer.unput('('); yy_.yytext = 'first_value'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 382;
|
||
|
break;
|
||
|
case 413: yy.lexer.unput('('); yy_.yytext = 'lag'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 382;
|
||
|
break;
|
||
|
case 414: yy.lexer.unput('('); yy_.yytext = 'last_value'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 382;
|
||
|
break;
|
||
|
case 415: yy.lexer.unput('('); yy_.yytext = 'lead'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 382;
|
||
|
break;
|
||
|
case 416: yy.lexer.unput('('); yy_.yytext = 'rank'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 382;
|
||
|
break;
|
||
|
case 417: yy.lexer.unput('('); yy_.yytext = 'row_number'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 382;
|
||
|
break;
|
||
|
case 418: yy.lexer.unput('('); yy_.yytext = 'cume_dist'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 382;
|
||
|
break;
|
||
|
case 419: yy.lexer.unput('('); yy_.yytext = 'percent_rank'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 382;
|
||
|
break;
|
||
|
case 420: yy.lexer.unput('('); yy_.yytext = 'ntile'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 382;
|
||
|
break;
|
||
|
case 421: yy.lexer.unput('('); yy_.yytext = 'percent_rank'; parser.addFunctionLocation(yy_.yylloc, yy_.yytext); return 382;
|
||
|
break;
|
||
|
case 422: yy.lexer.unput('('); yy_.yytext = 'system'; return 723;
|
||
|
break;
|
||
|
case 423: return 383;
|
||
|
break;
|
||
|
case 424: return 383;
|
||
|
break;
|
||
|
case 425: return 384;
|
||
|
break;
|
||
|
case 426: return 159;
|
||
|
break;
|
||
|
case 427: parser.yy.cursorFound = true; return 18;
|
||
|
break;
|
||
|
case 428: parser.yy.cursorFound = true; return 442;
|
||
|
break;
|
||
|
case 429: return 385;
|
||
|
break;
|
||
|
case 430: parser.addFileLocation(yy_.yylloc, yy_.yytext); return 784;
|
||
|
break;
|
||
|
case 431: this.popState(); return 785;
|
||
|
break;
|
||
|
case 432: return 6;
|
||
|
break;
|
||
|
case 433: return 386;
|
||
|
break;
|
||
|
case 434: return 387;
|
||
|
break;
|
||
|
case 435: return 388;
|
||
|
break;
|
||
|
case 436: return 389;
|
||
|
break;
|
||
|
case 437: return 390;
|
||
|
break;
|
||
|
case 438: return 391;
|
||
|
break;
|
||
|
case 439: return 391;
|
||
|
break;
|
||
|
case 440: return 391;
|
||
|
break;
|
||
|
case 441: return 391;
|
||
|
break;
|
||
|
case 442: return 391;
|
||
|
break;
|
||
|
case 443: return 392;
|
||
|
break;
|
||
|
case 444: return 393;
|
||
|
break;
|
||
|
case 445: return 394;
|
||
|
break;
|
||
|
case 446: return 394;
|
||
|
break;
|
||
|
case 447: return 394;
|
||
|
break;
|
||
|
case 448: return 394;
|
||
|
break;
|
||
|
case 449: return 394;
|
||
|
break;
|
||
|
case 450: return 394;
|
||
|
break;
|
||
|
case 451: return 395;
|
||
|
break;
|
||
|
case 452: return 396;
|
||
|
break;
|
||
|
case 453: return 998;
|
||
|
break;
|
||
|
case 454: return 10;
|
||
|
break;
|
||
|
case 455: return 397;
|
||
|
break;
|
||
|
case 456: return 398;
|
||
|
break;
|
||
|
case 457: return 399;
|
||
|
break;
|
||
|
case 458: return 400;
|
||
|
break;
|
||
|
case 459: return 401;
|
||
|
break;
|
||
|
case 460: return 402;
|
||
|
break;
|
||
|
case 461: return 160;
|
||
|
break;
|
||
|
case 462: this.begin('backtickedValue'); return 403;
|
||
|
break;
|
||
|
case 463:
|
||
|
if (parser.handleQuotedValueWithCursor(this, yy_.yytext, yy_.yylloc, '`')) {
|
||
|
return 472;
|
||
|
}
|
||
|
return 470;
|
||
|
|
||
|
break;
|
||
|
case 464: this.popState(); return 403;
|
||
|
break;
|
||
|
case 465: this.begin('singleQuotedValue'); return 404;
|
||
|
break;
|
||
|
case 466:
|
||
|
if (parser.handleQuotedValueWithCursor(this, yy_.yytext, yy_.yylloc, '\'')) {
|
||
|
return 472;
|
||
|
}
|
||
|
return 470;
|
||
|
|
||
|
break;
|
||
|
case 467: this.popState(); return 404;
|
||
|
break;
|
||
|
case 468: this.begin('doubleQuotedValue'); return 405;
|
||
|
break;
|
||
|
case 469:
|
||
|
if (parser.handleQuotedValueWithCursor(this, yy_.yytext, yy_.yylloc, '"')) {
|
||
|
return 472;
|
||
|
}
|
||
|
return 470;
|
||
|
|
||
|
break;
|
||
|
case 470: this.popState(); return 405;
|
||
|
break;
|
||
|
case 471: return 6;
|
||
|
break;
|
||
|
case 472: /* To prevent console logging of unknown chars */
|
||
|
break;
|
||
|
case 473:
|
||
|
break;
|
||
|
case 474:
|
||
|
break;
|
||
|
case 475:
|
||
|
break;
|
||
|
case 476:
|
||
|
break;
|
||
|
case 477:
|
||
|
break;
|
||
|
case 478:
|
||
|
break;
|
||
|
case 479:
|
||
|
break;
|
||
|
case 480:console.log(yy_.yytext);
|
||
|
break;
|
||
|
}
|
||
|
},
|
||
|
rules: [/^(?:\s)/i,/^(?:--.*)/i,/^(?:[\/][*][^*]*[*]+([^\/*][^*]*[*]+)*[\/])/i,/^(?:\u2020)/i,/^(?:\u2021)/i,/^(?:ALL)/i,/^(?:ARRAY)/i,/^(?:AS)/i,/^(?:AUTHORIZATION)/i,/^(?:BINARY)/i,/^(?:CACHE)/i,/^(?:COLUMN)/i,/^(?:CONF)/i,/^(?:CONSTRAINT)/i,/^(?:CREATE)/i,/^(?:CUBE)/i,/^(?:CURRENT)/i,/^(?:DATE)/i,/^(?:DELETE)/i,/^(?:DESCRIBE)/i,/^(?:EXTENDED)/i,/^(?:EXTERNAL)/i,/^(?:FOR)/i,/^(?:FOREIGN)/i,/^(?:FUNCTION)/i,/^(?:GRANT)/i,/^(?:GROUPING)/i,/^(?:IMPORT)/i,/^(?:INSERT)/i,/^(?:LATERAL)/i,/^(?:LOCAL)/i,/^(?:MACRO)/i,/^(?:MAP)/i,/^(?:NONE)/i,/^(?:OF)/i,/^(?:OUT)/i,/^(?:PRIMARY)/i,/^(?:REFERENCES)/i,/^(?:REVOKE)/i,/^(?:ROLLUP)/i,/^(?:TABLE)/i,/^(?:TIMESTAMP)/i,/^(?:USER)/i,/^(?:USING)/i,/^(?:VIEWS)/i,/^(?:LIFECYCLE)/i,/^(?:ABORT)/i,/^(?:ADD)/i,/^(?:ADMIN)/i,/^(?:AFTER)/i,/^(?:ANALYZE)/i,/^(?:ARCHIVE)/i,/^(?:ASC)/i,/^(?:AVRO)/i,/^(?:BUCKET)/i,/^(?:BUCKETS)/i,/^(?:CASCADE)/i,/^(?:CHANGE)/i,/^(?:CLUSTER)/i,/^(?:CLUSTERED)/i,/^(?:COLLECTION)/i,/^(?:COLUMNS)/i,/^(?:COMMENT)/i,/^(?:COMPACT)/i,/^(?:COMPACTIONS)/i,/^(?:COMPUTE)/i,/^(?:CONCATENATE)/i,/^(?:DATA)/i,/^(?:DATABASES)/i,/^(?:DAY)/i,/^(?:DAYOFWEEK)/i,/^(?:DBPROPERTIES)/i,/^(?:DEFERRED)/i,/^(?:DEFINED)/i,/^(?:DELIMITED)/i,/^(?:DEPENDENCY)/i,/^(?:DESC)/i,/^(?:DIRECTORY)/i,/^(?:DISABLE)/i,/^(?:DISTRIBUTE)/i,/^(?:DOUBLE\s+PRECISION)/i,/^(?:ESCAPED)/i,/^(?:ENABLE)/i,/^(?:EXCHANGE)/i,/^(?:EXPLAIN)/i,/^(?:EXPORT)/i,/^(?:FIELDS)/i,/^(?:FILE)/i,/^(?:FILEFORMAT)/i,/^(?:FIRST)/i,/^(?:FORMAT)/i,/^(?:FORMATTED)/i,/^(?:FUNCTION)/i,/^(?:FUNCTIONS)/i,/^(?:HOUR)/i,/^(?:IDXPROPERTIES)/i,/^(?:INDEX)/i,/^(?:INDEXES)/i,/^(?:INPATH)/i,/^(?:INPUTFORMAT)/i,/^(?:ITEMS)/i,/^(?:JAR)/i,/^(?:KEY)/i,/^(?:KEYS)/i,/^(?:LINES)/i,/^(?:LOAD)/i,/^(?:LOCATION)/i,/^(?:LOCK)/i,/^(?:LOCKS)/i,/^(?:MATCHED)/i,/^(?:MERGE)/i,/^(?:METADATA)/i,/^(?:MINUTE)/i,/^(?:MONTH)/i,/^(?:MSCK)/i,/^(?:NORELY)/i,/^(?:NOSCAN)/i,/^(?:NOVALIDATE)/i,/^(?:NO_DROP)/i,/^(?:OFFLINE)/i,/^(?:ORC)/i,/^(?:OUTPUTFORMAT)/i,/^(?:OVERWRITE)/i,/^(?:OVERWRITE\s+DIRECTORY)/i,/^(?:OWNER)/i,/^(?:PARQUET)/i,/^(?:PARTITIONED)/i,/^(?:PARTITIONS)/i,/^(?:PERCENT)/i,/^(?:PRIVILEGES)/i,/^(?:PURGE)/i,/^(?:QUARTER)/i,/^(?:RCFILE)/i,/^(?:REBUILD)/i,/^(?:RELOAD)/i,/^(?:RELY)/i,/^(?:REPAIR)/i,/^(?:REPLICATION)/i,/^(?:RECOVER)/i,/^(?:RENAME)/i,/^(?:REPLACE)/i,/^(?:RESTRICT)/i,/^(?:ROLE)/i,/^(?:ROLES)/i,/^(?:SECOND)/i,/^(?:SCHEMA)/i,/^(?:SCHEMAS)/i,/^(?:SEQUENCEFILE)/i,/^(?:SERDE)/i,/^(?:SERDEPROPERTIES)/i,/^(?:SETS)/i,/^(?:SHOW)/i,/^(?:SHOW_DATABASE)/i,/^(?:SKEWED)/i,/^(?:SKEWED LOCATION)/i,/^(?:SORT)/i,/^(?:SORTED)/i,/^(?:STATISTICS)/i,/^(?:STORED)/i,/^(?:STORED\s+AS\s+DIRECTORIES)/i,/^(?:STRING)/i,/^(?:STRUCT)/i,/^(?:TABLES)/i,/^(?:TABLESAMPLE)/i,/^(?:TBLPROPERTIES)/i,/^(?:TEMPORARY)/i,/^(?:TERMINATED)/i,/^(?:TEXTFILE)/i,/^(?:TINYINT)/i,/^(?:TOUCH)/i,/^(?:TRANSACTIONS)/i,/^(?:UNARCHIVE)/i,/^(?:UNIONTYPE)/i,/^(?:USE)/i,/^(?:VIEW)/i,/^(?:WAIT)/i,/^(?:WEEK)/i,/^(?:WINDOW)/i,/^(?:YEAR)/i,/^(?:\.)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:ADD)/i,/^(?:AGGREGATE)/i,/^(?:AVRO)/i,/^(?:CACHED)/i,/^(?:CASCADE)/i,/^(?:CHANGE)/i,/^(?:CLOSE_FN)/i,/^(?:COLUMN)/i,/^(?:COLUMNS)/i,/^(?:COMMENT)/i,/^(?:COMPUTE)/i,/^(?:CREATE)/i,/^(?:DATA)/i,/^(?:DATABASES)/i,/^(?:DELETE)/i,/^(?:DELIMITED)/i,/^(?:DESCRIBE)/i,/^(?:ESCAPED)/i,/^(?:EXPLAIN)/i,/^(?:EXTERNAL)/i,/^(?:EXTENDED)/i,/^(?:FIELDS)/i,/^(?:FILEFORMAT)/i,/^(?:FILES)/i,/^(?:FINALIZE_FN)/i,/^(?:FIRST)/i,/^(?:FORMAT)/i,/^(?:FORMATTED)/i,/^(?:FUNCTION)/i,/^(?:FUNCTIONS)/i,/^(?:GROUP)/i,/^(?:HASH)/i,/^(?:ILIKE)/i,/^(?:INCREMENTAL)/i,/^(?:INSERT)/i,/^(?:INTERVAL)/i,/^(?:INTERMEDIATE)/i,/^(?:INIT_FN)/i,/^(?:INVALIDATE)/i,/^(?:INPATH)/i,/^(?:IREGEXP)/i,/^(?:KEY)/i,/^(?:KUDU)/i,/^(?:LAST)/i,/^(?:LIKE\s+PARQUET)/i,/^(?:LIMIT)/i,/^(?:LINES)/i,/^(?:LOAD)/i,/^(?:LOCATION)/i,/^(?:MERGE_FN)/i,/^(?:METADATA)/i,/^(?:NULLS)/i,/^(?:OFFSET)/i,/^(?:ORC)/i,/^(?:OVERWRITE)/i,/^(?:PARQUET)/i,/^(?:PARTITIONED)/i,/^(?:PARTITIONS)/i,/^(?:PREPARE_FN)/i,/^(?:PRIMARY)/i,/^(?:RCFILE)/i,/^(?:RANGE)/i,/^(?:REAL)/i,/^(?:REFRESH)/i,/^(?:RENAME)/i,/^(?:REPEATABLE)/i,/^(?:REPLACE)/i,/^(?:REPLICATION)/i,/^(?:RESTRICT)/i,/^(?:RETURNS)/i,/^(?:REVOKE)/i,/^(?:SEQUENCEFILE)/i,/^(?:SERDEP
|
||
|
conditions: {"hdfs":{"rules":[427,428,429,430,431,432,476],"inclusive":false},"doubleQuotedValue":{"rules":[469,470,479],"inclusive":false},"singleQuotedValue":{"rules":[466,467,478],"inclusive":false},"backtickedValue":{"rules":[463,464,477],"inclusive":false},"between":{"rules":[0,1,2,3,4,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,410,411,412,413,414,415,416,417,423,424,425,426,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,465,468,471,472,473,480],"inclusive":true},"hive":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,410,411,412,413,414,415,416,417,418,419,423,424,425,426,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,465,468,471,472,474,480],"inclusive":true},"impala":{"rules":[0,1,2,3,4,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,420,421,422,423,424,425,426,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,465,468,471,472,475,480],"inclusive":true},"INITIAL":{"rules":[0,1,2,3,4,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,410,411,412,413,414,415,416,417,423,424,425,426,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,465,468,471,472,480],"inclusive":true}}
|
||
|
});
|
||
|
return lexer;
|
||
|
})();
|
||
|
parser.lexer = lexer;
|
||
|
function Parser () {
|
||
|
this.yy = {};
|
||
|
}
|
||
|
Parser.prototype = parser;parser.Parser = Parser;
|
||
|
return new Parser;
|
||
|
})();
|
||
|
|
||
|
|
||
|
if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
|
||
|
exports.parser = sqlSyntaxParser;
|
||
|
exports.Parser = sqlSyntaxParser.Parser;
|
||
|
exports.parse = function () { return sqlSyntaxParser.parse.apply(sqlSyntaxParser, arguments); };
|
||
|
exports.main = function commonjsMain(args) {
|
||
|
if (!args[1]) {
|
||
|
console.log('Usage: '+args[0]+' FILE');
|
||
|
process.exit(1);
|
||
|
}
|
||
|
var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8");
|
||
|
return exports.parser.parse(source);
|
||
|
};
|
||
|
if (typeof module !== 'undefined' && require.main === module) {
|
||
|
exports.main(process.argv.slice(1));
|
||
|
}
|
||
|
}
|