package net.sourceforge.squirrel_sql.client.session.parser.kernel;
import net.sourceforge.squirrel_sql.client.session.parser.kernel.completions.*;
import java.util.*;
public class Parser
{
private static final int maxT = 103;
private static final boolean T = true;
private static final boolean G = true; // to see Gerds changes
private static final boolean x = false;
private static final int minErrDist = 2;
private int errDist = minErrDist;
private Vector<ParserListener> parserListeners = new Vector<ParserListener>();
private Vector<SQLSelectStatementListener> sqlSelectStatlisteners = new Vector<SQLSelectStatementListener>();
private Scanner scanner; // input scanner
private Token token; // last recognized token
private Token t; // lookahead token
private List<SQLStatement> statements = new ArrayList<SQLStatement>();
private SQLSchema rootSchema;
private Stack<SQLStatementContext> stack;
protected void addRootStatement(SQLStatement statement)
{
statement.setSqlSchema(rootSchema);
fireStatementAdded(statement);
statements.add(statement);
stack = new Stack<SQLStatementContext>();
stack.push(statement);
}
private void fireStatementAdded(SQLStatement statement)
{
ParserListener[] clone = parserListeners.toArray(new ParserListener[parserListeners.size()]);
for (int i = 0; i < clone.length; i++)
{
clone[i].statementAdded(statement);
}
}
public void addParserListener(ParserListener l)
{
parserListeners.add(l);
}
public void removeaddParserListener(ParserListener l)
{
parserListeners.remove(l);
}
public void addSQLSelectStatementListener(SQLSelectStatementListener l)
{
sqlSelectStatlisteners.add(l);
}
public void removeSQLSelectStatementListener(SQLSelectStatementListener l)
{
sqlSelectStatlisteners.remove(l);
}
private SQLStatementContext getContext()
{
return stack.peek();
}
private void pushContext(SQLStatementContext context)
{
SQLStatementContext parent = stack.peek();
parent.addContext(context);
stack.push(context);
}
private SQLStatementContext popContext()
{
return stack.pop();
}
void Error(int n)
{
if (errDist >= minErrDist) scanner.err.ParsErr(n, t.line, t.col);
errDist = 0;
}
void SemError(int n)
{
if (errDist >= minErrDist) scanner.err.SemErr(n, token.line, token.col);
errDist = 0;
}
boolean Successful()
{
return scanner.err.count == 0;
}
String LexString()
{
return token.str;
}
String LexName()
{
return token.val;
}
String LookAheadString()
{
return t.str;
}
String LookAheadName()
{
return t.val;
}
private void Get()
{
for (; ;)
{
token = t;
t = scanner.Scan();
if (t.kind <= maxT)
{
errDist++;
return;
}
t = token;
}
}
private void Expect(int n)
{
if (t.kind == n) Get(); else Error(n);
}
private boolean StartOf(int s)
{
if( 0 > s
|| 0 > t.kind
|| set.length <= s
|| set[0].length <= t.kind)
{
return false;
}
return set[s][t.kind];
}
private void ExpectWeak(int n, int follow)
{
if (t.kind == n)
Get();
else
{
Error(n);
while (!StartOf(follow)) Get();
}
}
boolean WeakSeparator(int n, int syFol, int repFol)
{
boolean[] s = new boolean[maxT + 1];
if (t.kind == n)
{
Get();
return true;
}
else if (StartOf(repFol))
return false;
else
{
for (int i = 0; i <= maxT; i++)
{
s[i] = set[syFol][i] || set[repFol][i] || set[0][i];
}
Error(n);
while (!s[t.kind]) Get();
return StartOf(syFol);
}
}
private final void IndexName()
{
Expect(1);
}
private final void IndexColumnList()
{
IndexColumn();
while (t.kind == ParsingConstants.KIND_COMMA)
{
ItemSeparator();
IndexColumn();
}
}
private final void IndexColumn()
{
SimpleColumnName();
if (t.kind == ParsingConstants.KW_DESC || t.kind == ParsingConstants.KW_ASC)
{
if (t.kind == ParsingConstants.KW_ASC)
{
Get();
}
else
{
Get();
}
}
}
private final void DropPart()
{
Expect(ParsingConstants.KW_DROP);
if (t.kind == 1)
{
SimpleColumnName();
CascadeRestrict();
}
else if (t.kind == ParsingConstants.KW_PRIMARY)
{
Get();
Expect(ParsingConstants.KW_KEY);
}
else if (t.kind == ParsingConstants.KW_FOREIGN)
{
Get();
Expect(ParsingConstants.KW_KEY);
RelationName();
}
else if (t.kind == ParsingConstants.KW_CONSTRAINT)
{
Get();
ConstraintName();
CascadeRestrict();
}
else
Error(104);
}
private final void AlterPart()
{
Expect(ParsingConstants.KW_ALTER);
SimpleColumnName();
if (t.kind == ParsingConstants.KW_DROP)
{
Get();
Expect(ParsingConstants.KW_DEFAULT );
}
else if (t.kind == ParsingConstants.KW_SET)
{
Get();
ColumnDefault();
}
else
Error(105);
}
private final void AddPart()
{
Expect(ParsingConstants.KW_ADD);
if (t.kind == 1)
{
ColumnDefList();
}
else if (t.kind == ParsingConstants.KW_PRIMARY)
{
PrimaryKey();
}
else if (t.kind == ParsingConstants.KW_CONSTRAINT)
{
ForeignKeyAdd();
}
else if (t.kind == ParsingConstants.KW_UNIQUE)
{
Unique();
}
else if (t.kind == 92)
{
CheckConstraint();
}
else
Error(106);
}
private final void IndexAndName()
{
Expect(ParsingConstants.KW_INDEX);
IndexName();
}
private final void DropTable()
{
Expect(ParsingConstants.KW_TABLE);
QualifiedTable();
if (t.kind == ParsingConstants.KW_CASCADE || t.kind == ParsingConstants.KW_RESTRICT)
{
CascadeRestrict();
}
}
private final void CascadeRestrict()
{
if (t.kind == ParsingConstants.KW_CASCADE)
{
Get();
}
else if (t.kind == ParsingConstants.KW_RESTRICT)
{
Get();
}
else
Error(107);
}
private final void CreateIndex()
{
if (t.kind == ParsingConstants.KW_UNIQUE)
{
Get();
}
IndexAndName();
Expect(ParsingConstants.KW_ON);
Table(null);
Expect(ParsingConstants.KIND_OPENING_BRAKET);
IndexColumnList();
CloseParens();
}
private final void CreateTable()
{
Expect(ParsingConstants.KW_TABLE);
Table(null);
Expect(ParsingConstants.KIND_OPENING_BRAKET);
CreatePart();
while (t.kind == ParsingConstants.KIND_COMMA)
{
ItemSeparator();
CreatePart();
}
CloseParens();
}
private final void CreatePart()
{
if (t.kind == 1)
{
ColumnDef();
}
else if (t.kind == ParsingConstants.KW_PRIMARY)
{
PrimaryKey();
}
else if (t.kind == ParsingConstants.KW_FOREIGN)
{
ForeignKeyCreatePart();
}
else if (t.kind == ParsingConstants.KW_CONSTRAINT)
{
Constraint();
}
else if (t.kind == ParsingConstants.KW_UNIQUE)
{
Unique();
}
else if (t.kind == 92)
{
CheckConstraint();
}
else
Error(108);
}
private final void CheckConstraint()
{
Expect(92);
Expect(ParsingConstants.KIND_OPENING_BRAKET);
Expression();
CloseParens();
}
private final void Unique()
{
Expect(ParsingConstants.KW_UNIQUE);
SimpleColumnParam();
}
private final void Constraint()
{
}
private final void ForeignKeyAdd()
{
Expect(ParsingConstants.KW_CONSTRAINT);
RelationName();
if (t.kind == ParsingConstants.KW_FOREIGN)
{
Get();
Expect(ParsingConstants.KW_KEY);
SimpleColumnParam();
Expect(ParsingConstants.KW_REFERENCES);
Table(null);
if (t.kind == ParsingConstants.KW_MATCH)
{
Get();
if (t.kind == ParsingConstants.KW_FULL)
{
Get();
}
else if (t.kind == ParsingConstants.KW_PARTIAL)
{
Get();
}
else
Error(109);
}
while (t.kind == ParsingConstants.KW_ON || t.kind == ParsingConstants.KW_NO)
{
if (t.kind == ParsingConstants.KW_ON)
{
Get();
if (t.kind == ParsingConstants.KW_DELETE)
{
Get();
}
else if (t.kind == ParsingConstants.KW_UPDATE)
{
Get();
}
else
Error(110);
if (t.kind == ParsingConstants.KW_CASCADE)
{
Get();
}
else if (t.kind == ParsingConstants.KW_SET)
{
Get();
if (t.kind == ParsingConstants.KW_NULL)
{
Get();
}
else if (t.kind == ParsingConstants.KW_DEFAULT)
{
Get();
}
else
Error(111);
}
else
Error(112);
}
else
{
Get();
Expect(ParsingConstants.KW_ACTION);
}
}
}
else
{
Expect(ParsingConstants.KW_UNIQUE);
SimpleColumnParam();
}
}
private final void ForeignKeyCreatePart()
{
Expect(ParsingConstants.KW_FOREIGN);
Expect(ParsingConstants.KW_KEY);
RelationName();
SimpleColumnParam();
Expect(ParsingConstants.KW_REFERENCES);
Table(null);
if (t.kind == ParsingConstants.KW_MATCH)
{
Get();
if (t.kind == ParsingConstants.KW_FULL)
{
Get();
}
else if (t.kind == ParsingConstants.KW_PARTIAL)
{
Get();
}
else
Error(109);
}
while (t.kind == ParsingConstants.KW_ON || t.kind == ParsingConstants.KW_NO)
{
if (t.kind == ParsingConstants.KW_ON)
{
Get();
if (t.kind == ParsingConstants.KW_DELETE)
{
Get();
}
else if (t.kind == ParsingConstants.KW_UPDATE)
{
Get();
}
else
Error(110);
if (t.kind == ParsingConstants.KW_CASCADE)
{
Get();
}
else if (t.kind == ParsingConstants.KW_SET)
{
Get();
if (t.kind == ParsingConstants.KW_NULL)
{
Get();
}
else if (t.kind == ParsingConstants.KW_DEFAULT )
{
Get();
}
else
Error(111);
}
else
Error(112);
}
else
{
Get();
Expect(ParsingConstants.KW_ACTION);
}
}
}
private final void ConstraintName()
{
Expect(1);
}
private final void RelationName()
{
Expect(1);
}
private final void PrimaryKey()
{
Expect(ParsingConstants.KW_PRIMARY);
Expect(ParsingConstants.KW_KEY);
SimpleColumnParam();
}
private final void ColumnDef()
{
SimpleColumnName();
DataType();
while (t.kind == ParsingConstants.KW_NOT || t.kind == ParsingConstants.KW_DEFAULT || t.kind == ParsingConstants.KW_PRIMARY)
{
if (t.kind == ParsingConstants.KW_DEFAULT )
{
ColumnDefault();
}
else if(t.kind == ParsingConstants.KW_NOT )
{
NotOperator();
Expect(ParsingConstants.KW_NULL);
}
else
{
Expect(ParsingConstants.KW_PRIMARY);
Expect(ParsingConstants.KW_KEY);
}
}
}
private final void ColumnDefList()
{
ColumnDef();
while (t.kind == ParsingConstants.KIND_COMMA)
{
ItemSeparator();
ColumnDef();
}
}
private final void ColumnDefault()
{
Expect(ParsingConstants.KW_DEFAULT );
if (t.kind == 4)
{
Get();
}
else if (t.kind == 2)
{
Get();
}
else if (t.kind == 3)
{
Get();
}
else
Error(113);
}
private final void DataType()
{
switch (t.kind)
{
case 72:
case 73:
{
if (t.kind == ParsingConstants.KW_CHAR)
{
Get();
}
else
{
Get();
}
lenParam();
break;
}
case ParsingConstants.KW_VARCHAR:
{
Get();
lenParam();
break;
}
case ParsingConstants.KW_INTEGER:
case ParsingConstants.KW_INT:
{
if (t.kind == ParsingConstants.KW_INTEGER)
{
Get();
}
else
{
Get();
}
break;
}
case ParsingConstants.KW_SMALLINT:
{
Get();
break;
}
case ParsingConstants.KW_NUMERIC:
{
Get();
Expect(ParsingConstants.KIND_OPENING_BRAKET);
precision();
CloseParens();
break;
}
case ParsingConstants.KW_DATE:
{
Get();
break;
}
case ParsingConstants.KW_TIME:
{
Get();
lenParam();
break;
}
case ParsingConstants.KW_TIMESTAMP:
{
Get();
lenParam();
break;
}
default:
Error(114);
}
}
private final void precision()
{
Expect(2);
ItemSeparator();
Expect(2);
}
private final void lenParam()
{
Expect(ParsingConstants.KIND_OPENING_BRAKET);
len();
CloseParens();
}
private final void len()
{
Expect(2);
}
private final void BetweenExpr()
{
Expect(ParsingConstants.KW_BETWEEN);
Field();
Expect(ParsingConstants.KW_AND);
Field();
}
private final void InSetExpr()
{
Expect(ParsingConstants.KW_IN);
Expect(ParsingConstants.KIND_OPENING_BRAKET);
if (StartOf(1))
{
FieldList();
}
else if (t.kind == ParsingConstants.KW_SELECT)
{
SelectStmt();
}
else
Error(ParsingConstants.KW_INSET);
CloseParens();
}
private final void NullTest()
{
Expect(ParsingConstants.KW_IS);
if (t.kind == ParsingConstants.KW_NOT)
{
NotOperator();
}
Expect(ParsingConstants.KW_NULL);
}
private final void LikeTest()
{
Expect(ParsingConstants.KW_LIKE);
if (t.kind == 4)
{
Get();
}
else if (t.kind == 53)
{
Param();
}
else
Error(116);
if (t.kind == ParsingConstants.KW_ESCAPE)
{
Get();
Expect(4);
}
}
private final void WordOperator()
{
if (t.kind == ParsingConstants.KW_AND)
{
Get();
}
else if (t.kind == ParsingConstants.KW_OR)
{
Get();
}
else
Error(117);
}
private final void MathOperator()
{
if (t.kind == ParsingConstants.KIND_ASTERISK)
{
Get();
}
else if (t.kind == 55)
{
Get();
}
else if (t.kind == 56)
{
Get();
}
else if (t.kind == ParsingConstants.KW_MINUS_SIGN)
{
Get();
}
else
Error(118);
}
private final void TestExpr()
{
if (t.kind == ParsingConstants.KW_IS)
{
NullTest();
}
else if (StartOf(2))
{
if (t.kind == ParsingConstants.KW_NOT)
{
NotOperator();
}
if (t.kind == ParsingConstants.KW_IN)
{
InSetExpr();
}
else if (t.kind == ParsingConstants.KW_BETWEEN)
{
BetweenExpr();
}
else if (t.kind == ParsingConstants.KW_LIKE)
{
LikeTest();
}
else
Error(119);
}
else
Error(120);
}
private final void Operator()
{
if (StartOf(3))
{
MathOperator();
}
else if (t.kind == ParsingConstants.KW_AND || t.kind == ParsingConstants.KW_OR)
{
WordOperator();
}
else
Error(121);
}
private final void Term()
{
if (t.kind == ParsingConstants.KW_MINUS_SIGN)
{
Get();
}
if (StartOf(1))
{
Field();
if (StartOf(4))
{
TestExpr();
}
}
else if (StartOf(ParsingConstants.KIND_OPENING_BRAKET))
{
ColumnFunction();
}
else if (StartOf(6))
{
FunctionExpr();
}
else if (t.kind == ParsingConstants.KIND_OPENING_BRAKET)
{
Get();
if (StartOf(ParsingConstants.KW_UNION))
{
Expression();
}
else if (t.kind == ParsingConstants.KW_SELECT)
{
SelectStmt();
}
else if (t.kind == ParsingConstants.KW_CASE)
{
CaseStatment();
}
else
Error(122);
CloseParens();
}
else
Error(123);
}
private final void NotOperator()
{
Expect(ParsingConstants.KW_NOT);
}
private final void Relation()
{
switch (t.kind)
{
case ParsingConstants.KIND_EQUALS:
{
Get();
break;
}
case 62:
{
Get();
break;
}
case 63:
{
Get();
break;
}
case 64:
{
Get();
break;
}
case 65:
{
Get();
break;
}
case 66:
{
Get();
break;
}
default:
Error(124);
}
}
private final void SimpleExpression()
{
if (t.kind == ParsingConstants.KW_NOT)
{
NotOperator();
}
Term();
while (StartOf(ParsingConstants.KW_EXCEPT))
{
Operator();
if (t.kind == ParsingConstants.KW_NOT)
{
NotOperator();
}
Term();
}
}
private final void OrderByField()
{
if (t.kind == 1)
{
ColumnName();
}
else if (t.kind == 2)
{
Get();
}
else
Error(125);
if (t.kind == ParsingConstants.KW_DESC || t.kind == ParsingConstants.KW_ASC)
{
if (t.kind == ParsingConstants.KW_DESC)
{
Get();
}
else
{
Get();
}
}
}
private final void Param()
{
Expect(53);
Expect(1);
}
private final void Field()
{
switch (t.kind)
{
case 1:
{
ColumnName();
break;
}
case ParsingConstants.KW_NULL:
{
Get();
break;
}
case 3:
{
Get();
break;
}
case 2:
{
Get();
break;
}
case 4:
{
Get();
break;
}
case ParsingConstants.KW_MINUS_SIGN:
{
Get();
Get();
break;
}
case 53:
{
Param();
break;
}
default:
Error(126);
}
}
private final void SimpleColumnParam()
{
Expect(ParsingConstants.KIND_OPENING_BRAKET);
SimpleColumnList();
CloseParens();
}
private final void SimpleColumnList()
{
SimpleColumnName();
while (t.kind == ParsingConstants.KIND_COMMA)
{
ItemSeparator();
SimpleColumnName();
}
}
private final void SimpleColumnName()
{
Expect(1);
}
private final void ColumnFunction()
{
if (t.kind == ParsingConstants.KW_COUNT)
{
Get();
}
else if (t.kind == ParsingConstants.KW_SUM)
{
Get();
}
else if (t.kind == ParsingConstants.KW_MAX)
{
Get();
}
else if (t.kind == ParsingConstants.KW_MIN)
{
Get();
}
else if (t.kind == ParsingConstants.KW_AVG)
{
Get();
}
else
Error(127);
Expect(ParsingConstants.KIND_OPENING_BRAKET);
if (t.kind == ParsingConstants.KIND_ASTERISK)
{
Get();
}
else if (StartOf(ParsingConstants.KW_INTERSECT))
{
if (t.kind == ParsingConstants.KW_DISTINCT)
{
Get();
}
Expression();
}
else
Error(128);
CloseParens();
}
private final void FunctionExpr()
{
if (t.kind == ParsingConstants.KW_TIMESTAMP)
{
Get();
}
else if (t.kind == ParsingConstants.KW_UPPER)
{
Get();
}
else if (t.kind == ParsingConstants.KW_MONTH)
{
Get();
}
else if (t.kind == ParsingConstants.KW_YEAR)
{
Get();
}
else
Error(129);
Expect(ParsingConstants.KIND_OPENING_BRAKET);
Expression();
while (t.kind == ParsingConstants.KIND_COMMA)
{
ItemSeparator();
Expression();
}
CloseParens();
}
private final void SelectField()
{
if (StartOf(ParsingConstants.KW_UNION))
{
Expression();
if (t.kind == ParsingConstants.KW_AS)
{
Get();
Alias();
}
}
else if (t.kind == ParsingConstants.KIND_ASTERISK)
{
Get();
}
else if (t.kind == ParsingConstants.KW_CASE)
{
CaseStatment();
}
else
Error(130);
}
private void CaseStatment()
{
Expect(ParsingConstants.KW_CASE);
if(t.kind == ParsingConstants.KW_WHEN)
{
Expect(ParsingConstants.KW_WHEN);
Expression();
Expect(ParsingConstants.KW_THEN);
Expression();
while(t.kind == ParsingConstants.KW_WHEN)
{
Get();
Expression();
Expect(ParsingConstants.KW_THEN);
Expression();
}
Expect(ParsingConstants.KW_ELSE);
Expression();
Expect(ParsingConstants.KW_END);
if (t.kind == ParsingConstants.KW_AS)
{
Get();
Alias();
}
}
else
{
ColumnName();
Expect(ParsingConstants.KW_WHEN);
Expression();
Expect(ParsingConstants.KW_THEN);
Expression();
while(t.kind == ParsingConstants.KW_WHEN)
{
Get();
Expression();
Expect(ParsingConstants.KW_THEN);
Expression();
}
Expect(ParsingConstants.KW_ELSE);
Expression();
Expect(ParsingConstants.KW_END);
if (t.kind == ParsingConstants.KW_AS)
{
Get();
Alias();
}
}
}
private final void OrderByFldList()
{
OrderByField();
while (t.kind == ParsingConstants.KIND_COMMA)
{
ItemSeparator();
OrderByField();
}
}
private final void SearchCondition()
{
Expression();
}
private final void JoinExpr()
{
if (t.kind == ParsingConstants.KW_ON)
{
Get();
Expression();
}
else if (t.kind == ParsingConstants.KW_USING)
{
Get();
Expect(ParsingConstants.KIND_OPENING_BRAKET);
ColumnList();
CloseParens();
}
else
Error(131);
}
private final void JoinType()
{
if (t.kind == ParsingConstants.KW_NATURAL)
{
Get();
}
if (t.kind == ParsingConstants.KW_INNER)
{
Get();
}
else if (t.kind == ParsingConstants.KW_FULL || t.kind == ParsingConstants.KW_LEFT || t.kind == ParsingConstants.KW_RIGHT)
{
if (t.kind == ParsingConstants.KW_FULL)
{
Get();
}
else if (t.kind == ParsingConstants.KW_LEFT)
{
Get();
}
else
{
Get();
}
if (t.kind == ParsingConstants.KW_OUTER)
{
Get();
}
}
else
Error(132);
}
private final void CrossJoin()
{
Expect(ParsingConstants.KW_CROSS);
Expect(ParsingConstants.KW_JOIN);
QualifiedTable();
}
private final void Alias()
{
Expect(1);
}
private final void JoinStmt()
{
if (t.kind == ParsingConstants.KW_CROSS)
{
CrossJoin();
}
else if (StartOf(ParsingConstants.KW_MINUS))
{
if (StartOf(ParsingConstants.KW_ALL))
{
JoinType();
}
Expect(ParsingConstants.KW_JOIN);
QualifiedTable();
if (t.kind == ParsingConstants.KW_ON || t.kind == ParsingConstants.KW_USING)
{
JoinExpr();
}
}
else
Error(133);
}
private final void QualifiedTable()
{
// Fix for Bug #982127
//SQLSelectStatement statement = (SQLSelectStatement) getContext();
SQLStatement statement = (SQLStatement) getContext();
SQLTable table = new SQLTable(statement, t.pos);
statement.addTable(table);
boolean wasSet = false;
Expect(1);
if (t.val.equals("."))
table.setSchema(token.str, token.pos);
else
table.setName(token.str, token.pos);
if (t.kind == 22)
{
Get();
Expect(1);
table.setName(token.str, token.pos);
}
if (t.kind == 1 || t.kind == ParsingConstants.KW_AS)
{
if (t.kind == ParsingConstants.KW_AS)
{
Get();
}
table.setAlias(t.str, t.pos);
wasSet = true;
if (statement.setTable(table) == false)
SemError(ParsingConstants.KW_MINUS);
Alias();
}
if (!wasSet && statement.setTable(table) == false)
SemError(ParsingConstants.KW_MINUS);
}
private final void FromTableList()
{
QualifiedTable();
while (StartOf(ParsingConstants.KW_UPDATE))
{
if (t.kind == ParsingConstants.KIND_COMMA)
{
ItemSeparator();
QualifiedTable();
}
else
{
JoinStmt();
}
}
}
private final void SelectFieldList()
{
SelectField();
while (t.kind == ParsingConstants.KIND_COMMA)
{
ItemSeparator();
SelectField();
}
}
private final void OrderByClause()
{
SQLSelectStatement statement = (SQLSelectStatement) getContext();
statement.setOrderByStart(scanner.pos);
while (!(t.kind == 0 || t.kind == ParsingConstants.KW_ORDER))
{
Error(134);
Get();
}
Expect(ParsingConstants.KW_ORDER);
Expect(ParsingConstants.KW_BY);
OrderByFldList();
statement.setOrderByEnd(t.pos);
}
private final void HavingClause()
{
SQLSelectStatement statement = (SQLSelectStatement) getContext();
statement.setHavingStart(scanner.pos);
while (!(t.kind == 0 || t.kind == ParsingConstants.KW_HAVING))
{
Error(135);
Get();
}
Expect(ParsingConstants.KW_HAVING);
SearchCondition();
statement.setHavingEnd(t.pos);
}
private final void GroupByClause()
{
SQLSelectStatement statement = (SQLSelectStatement) getContext();
statement.setGroupByStart(scanner.pos);
while (!(t.kind == 0 || t.kind == ParsingConstants.KW_GROUP))
{
Error(136);
Get();
}
Expect(ParsingConstants.KW_GROUP);
Expect(ParsingConstants.KW_BY);
FieldList();
statement.setGroupByEnd(t.pos);
}
private final void FromClause()
{
SQLSelectStatement statement = (SQLSelectStatement) getContext();
statement.setFromStart(scanner.pos);
while (!(t.kind == 0 || t.kind == ParsingConstants.KW_FROM))
{
Error(137);
Get();
}
Expect(ParsingConstants.KW_FROM);
FromTableList();
statement.setFromEnd(t.pos);
}
private final void SelectClause()
{
SQLSelectStatement statement = (SQLSelectStatement) getContext();
statement.setSelectListStart(scanner.pos);
while (!(t.kind == 0 || t.kind == ParsingConstants.KW_SELECT))
{
Error(138);
Get();
}
Expect(ParsingConstants.KW_SELECT);
if (t.kind == ParsingConstants.KW_ALL || t.kind == ParsingConstants.KW_DISTINCT)
{
if (t.kind == ParsingConstants.KW_DISTINCT)
{
Get();
}
else
{
Get();
}
}
SelectFieldList();
statement.setSelectListEnd(t.pos);
}
private final void FieldList()
{
Field();
while (t.kind == ParsingConstants.KIND_COMMA)
{
ItemSeparator();
Field();
}
}
private final void CloseParens()
{
ExpectWeak(ParsingConstants.KIND_CLOSING_BRAKET, ParsingConstants.KW_SET);
}
private final void ColumnList()
{
ColumnName();
while (t.kind == ParsingConstants.KIND_COMMA)
{
ItemSeparator();
ColumnName();
}
}
private final void Expression()
{
SimpleExpression();
while (StartOf(ParsingConstants.KIND_EQUALS))
{
Relation();
SimpleExpression();
}
}
private final void ColumnName()
{
SQLStatementContext context = getContext();
SQLColumn column = new SQLColumn(context, t.pos);
context.addColumn(column);
if (scanner.ch == '.')
column.setQualifier(t.str, t.pos);
else
column.setColumn(t.str, t.pos);
Expect(1);
if (t.kind == 22)
{
Get();
if (t.kind == 1)
{
Get();
column.setColumn(token.str, token.pos);
}
else if (t.kind == ParsingConstants.KIND_ASTERISK)
{
Get();
}
else
Error(139);
}
}
private final void ItemSeparator()
{
ExpectWeak(ParsingConstants.KIND_COMMA, ParsingConstants.KW_INSERT);
}
private final void UpdateField()
{
ColumnName();
Expect(ParsingConstants.KIND_EQUALS);
Expression();
}
private final void WhereClause()
{
SQLStatement statement = (SQLStatement) getContext();
SQLWhere where = new SQLWhere(statement, t.pos);
pushContext(where);
while (!(t.kind == 0 || t.kind == ParsingConstants.KW_WHERE))
{
Error(140);
Get();
}
Expect(ParsingConstants.KW_WHERE);
SearchCondition();
where.setEndPosition(t.pos);
popContext();
}
private final void UpdateFieldList()
{
UpdateField();
while (t.kind == ParsingConstants.KIND_COMMA)
{
ItemSeparator();
UpdateField();
}
}
private final void Table(SQLTable table)
{
if (table != null)
table.setName(t.str, t.pos);
Expect(1);
}
private final void SetOperator()
{
if (t.kind == ParsingConstants.KW_UNION)
{
Get();
}
else if (t.kind == ParsingConstants.KW_EXCEPT)
{
Get();
}
else if (t.kind == ParsingConstants.KW_INTERSECT)
{
Get();
}
else if (t.kind == ParsingConstants.KW_MINUS)
{
Get();
}
else
Error(141);
if (t.kind == ParsingConstants.KW_ALL)
{
Get();
}
}
private final void SimpleSelect()
{
SQLSelectStatement statement = new SQLSelectStatement(t.pos);
SQLSelectStatementListener[] clone = sqlSelectStatlisteners.toArray(new SQLSelectStatementListener[sqlSelectStatlisteners.size()]);
for (int i = 0; i < clone.length; i++)
{
statement.addListener(clone[i]);
}
pushContext(statement);
SelectClause();
FromClause();
if (t.kind == ParsingConstants.KW_WHERE)
{
WhereClause();
}
if (t.kind == ParsingConstants.KW_GROUP)
{
GroupByClause();
}
if (t.kind == ParsingConstants.KW_HAVING)
{
HavingClause();
}
if (t.kind == ParsingConstants.KW_ORDER)
{
OrderByClause();
}
popContext();
}
private final void Transaction()
{
if (t.kind == ParsingConstants.KW_COMMIT)
{
Get();
}
else if (t.kind == ParsingConstants.KW_ROLLBACK)
{
Get();
}
else
Error(142);
if (t.kind == ParsingConstants.KW_WORK)
{
Get();
}
}
private final void AlterTable()
{
Expect(ParsingConstants.KW_ALTER);
Expect(ParsingConstants.KW_TABLE);
QualifiedTable();
if (t.kind == ParsingConstants.KW_ADD)
{
AddPart();
}
else if (t.kind == ParsingConstants.KW_ALTER)
{
AlterPart();
}
else if (t.kind == ParsingConstants.KW_DROP)
{
DropPart();
}
else
Error(143);
}
private final void Drop()
{
Expect(ParsingConstants.KW_DROP);
if (t.kind == ParsingConstants.KW_TABLE)
{
DropTable();
}
else if (t.kind == ParsingConstants.KW_INDEX)
{
IndexAndName();
}
else
Error(144);
}
private final void CreateStmt()
{
Expect(ParsingConstants.KW_CREATE);
if (t.kind == ParsingConstants.KW_TABLE)
{
CreateTable();
}
else if (t.kind == ParsingConstants.KW_UNIQUE || t.kind == ParsingConstants.KW_INDEX)
{
CreateIndex();
}
else if (t.kind == ParsingConstants.KW_VIEW)
{
CreateView();
}
else
Error(145);
}
private void CreateView()
{
Expect(ParsingConstants.KW_VIEW);
Table(null);
Expect(ParsingConstants.KW_AS);
SelectStmt();
}
private final void DeleteStmt()
{
SQLModifyingStatement statement = new SQLModifyingStatement(t.pos);
pushContext(statement);
Expect(ParsingConstants.KW_DELETE);
SQLTable table = new SQLTable(statement, scanner.pos + 1);
statement.addTable(table);
Expect(ParsingConstants.KW_FROM);
table.setName(t.str, t.pos);
Table(table);
if (t.kind == ParsingConstants.KW_WHERE)
{
WhereClause();
}
statement.setEndPosition(token.pos);
popContext();
}
private final void UpdateStmt()
{
SQLModifyingStatement statement = new SQLModifyingStatement(t.pos);
SQLTable table = new SQLTable(statement, scanner.pos + 1);
statement.addTable(table);
pushContext(statement);
Expect(ParsingConstants.KW_UPDATE);
table.setName(t.str, t.pos);
Table(null);
statement.setUpdateListStart(t.pos + 4);
Expect(ParsingConstants.KW_SET);
UpdateFieldList();
statement.setUpdateListEnd(token.pos);
if (t.kind == ParsingConstants.KW_WHERE)
{
WhereClause();
}
statement.setEndPosition(token.pos);
popContext();
}
private final void InsertStmt()
{
SQLModifyingStatement statement = new SQLModifyingStatement(t.pos);
pushContext(statement);
Expect(ParsingConstants.KW_INSERT);
SQLTable table = new SQLTable(statement, scanner.pos + 1);
statement.addTable(table);
Expect(ParsingConstants.KW_INTO);
SQLColumn column = new SQLColumn(statement, scanner.pos + 2);
table.setName(t.str, t.pos);
column.setRepeatable(true);
statement.addColumn(column);
Table(table);
if (t.kind == ParsingConstants.KIND_OPENING_BRAKET)
{
Get();
ColumnList();
CloseParens();
}
column.setEndPosition(token.pos);
if (t.kind == ParsingConstants.KW_VALUES)
{
Get();
Expect(ParsingConstants.KIND_OPENING_BRAKET);
FieldList();
CloseParens();
}
else if (t.kind == ParsingConstants.KW_SELECT)
{
SelectStmt();
}
else
Error(146);
statement.setEndPosition(token.pos);
popContext();
}
private final void SelectStmt()
{
pushContext(new SQLStatement(token.pos));
SimpleSelect();
while (StartOf(ParsingConstants.KW_INTO))
{
SetOperator();
SimpleSelect();
}
popContext();
}
private final void SQLStatement()
{
addRootStatement(new SQLStatement(token.pos));
switch (t.kind)
{
case ParsingConstants.KW_SELECT:
{
SelectStmt();
break;
}
case ParsingConstants.KW_INSERT:
{
InsertStmt();
break;
}
case ParsingConstants.KW_UPDATE:
{
UpdateStmt();
break;
}
case ParsingConstants.KW_DELETE:
{
DeleteStmt();
break;
}
case ParsingConstants.KW_CREATE:
{
CreateStmt();
break;
}
case ParsingConstants.KW_DROP:
{
Drop();
break;
}
case ParsingConstants.KW_ALTER:
{
AlterTable();
break;
}
case ParsingConstants.KW_COMMIT:
case ParsingConstants.KW_ROLLBACK:
{
Transaction();
break;
}
default:
Error(147);
}
if (t.kind == 6)
{
Get();
}
}
private final void squirrelSQL()
{
SQLStatement();
while (StartOf(ParsingConstants.KW_VALUES))
{
SQLStatement();
}
Expect(0);
}
public Parser(Scanner _scanner, SQLSchema schema)
{
scanner = _scanner;
t = new Token();
rootSchema = schema;
}
public void parse()
{
Get();
squirrelSQL();
}
private static boolean[][] set = {
{T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, T, T, x, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x},
{x, T, T, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, x, x, G, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x},
{x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, x, x, x, x, T, x, x, x, x, x, x, x, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x},
{x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, x, x, x, x, x, x, x, x, x, x, x, x, T, x, x, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x},
{x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, x, x, x, x, T, x, T, x, x, x, x, x, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x},
{x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, T, T, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x},
{x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, T, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x},
{x, T, T, T, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, T, T, T, T, T, T, T, T, T, x, x, T, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x},
{x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, x, x, x, x, x, x, x, x, x, x, x, x, T, x, x, T, T, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x},
{x, T, T, T, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, T, T, T, T, T, T, T, T, T, x, x, T, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x},
{x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, x, T, T, T, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x},
{x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, T, T, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x},
{x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, T, T, T, T, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, x, x, x},
{T, x, x, x, x, x, T, T, T, T, T, x, T, x, T, T, x, T, T, T, T, x, x, T, T, T, T, T, T, T, T, x, x, x, T, T, x, T, T, T, x, x, x, x, x, x, x, x, x, x, x, x, T, x, T, T, T, T, T, x, x, x, T, T, T, T, T, x, x, T, T, x, x, x, x, x, x, x, x, x, x, T, x, x, x, T, x, x, x, x, x, x, x, T, x, x, T, x, T, x, x, T, T, x, x},
{x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, T, T, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x},
{T, T, T, T, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, T, T, x, T, T, T, T, T, T, T, T, T, T, T, T, T, x, x, T, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, x, T, x, x, x, x, x, x, T, T, x, x, x, x, x, x, x, x, x, x, x, x},
{x, x, x, x, x, x, x, T, T, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x},
{x, x, x, x, x, x, x, x, x, x, x, x, T, x, x, T, x, x, T, x, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, T, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, T, x, x, T, x, T, x, x, x, x, x, x}
};
}