From 097b089b84b7b93488592d82507a4b21e43634e0 Mon Sep 17 00:00:00 2001 From: AnEmortalKid Date: Wed, 22 Apr 2020 22:05:11 -0500 Subject: [PATCH 1/6] wip --- .../statement/StatementVisitor.java | 163 +- .../create/sequence/CreateSequence.java | 36 + .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 7339 +++++++++-------- src/test/java/issues/Issue482Test.java | 21 + src/test/java/issues/Issue483Test.java | 17 + .../statement/create/CreateSequenceTest.java | 16 + 6 files changed, 3849 insertions(+), 3743 deletions(-) create mode 100644 src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java create mode 100644 src/test/java/issues/Issue482Test.java create mode 100644 src/test/java/issues/Issue483Test.java create mode 100644 src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java index d4489bcd19..ebbb7b8a6e 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java @@ -1,80 +1,83 @@ -/* - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2013 JSQLParser - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * . - * #L% - */ -package net.sf.jsqlparser.statement; - -import net.sf.jsqlparser.statement.alter.Alter; -import net.sf.jsqlparser.statement.create.index.CreateIndex; -import net.sf.jsqlparser.statement.create.table.CreateTable; -import net.sf.jsqlparser.statement.create.view.AlterView; -import net.sf.jsqlparser.statement.create.view.CreateView; -import net.sf.jsqlparser.statement.delete.Delete; -import net.sf.jsqlparser.statement.drop.Drop; -import net.sf.jsqlparser.statement.execute.Execute; -import net.sf.jsqlparser.statement.insert.Insert; -import net.sf.jsqlparser.statement.merge.Merge; -import net.sf.jsqlparser.statement.replace.Replace; -import net.sf.jsqlparser.statement.select.Select; -import net.sf.jsqlparser.statement.truncate.Truncate; -import net.sf.jsqlparser.statement.update.Update; -import net.sf.jsqlparser.statement.upsert.Upsert; - -public interface StatementVisitor { - - void visit(Commit commit); - - void visit(Delete delete); - - void visit(Update update); - - void visit(Insert insert); - - void visit(Replace replace); - - void visit(Drop drop); - - void visit(Truncate truncate); - - void visit(CreateIndex createIndex); - - void visit(CreateTable createTable); - - void visit(CreateView createView); - - void visit(AlterView alterView); - - void visit(Alter alter); - - void visit(Statements stmts); - - void visit(Execute execute); - - void visit(SetStatement set); - - void visit(Merge merge); - - void visit(Select select); - - void visit(Upsert upsert); - - void visit(UseStatement use); - -} +/* + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2013 JSQLParser + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.statement.alter.Alter; +import net.sf.jsqlparser.statement.create.index.CreateIndex; +import net.sf.jsqlparser.statement.create.sequence.CreateSequence; +import net.sf.jsqlparser.statement.create.table.CreateTable; +import net.sf.jsqlparser.statement.create.view.AlterView; +import net.sf.jsqlparser.statement.create.view.CreateView; +import net.sf.jsqlparser.statement.delete.Delete; +import net.sf.jsqlparser.statement.drop.Drop; +import net.sf.jsqlparser.statement.execute.Execute; +import net.sf.jsqlparser.statement.insert.Insert; +import net.sf.jsqlparser.statement.merge.Merge; +import net.sf.jsqlparser.statement.replace.Replace; +import net.sf.jsqlparser.statement.select.Select; +import net.sf.jsqlparser.statement.truncate.Truncate; +import net.sf.jsqlparser.statement.update.Update; +import net.sf.jsqlparser.statement.upsert.Upsert; + +public interface StatementVisitor { + + void visit(Commit commit); + + void visit(Delete delete); + + void visit(Update update); + + void visit(Insert insert); + + void visit(Replace replace); + + void visit(Drop drop); + + void visit(Truncate truncate); + + void visit(CreateIndex createIndex); + + void visit(CreateTable createTable); + + void visit(CreateView createView); + + void visit(AlterView alterView); + + void visit(Alter alter); + + void visit(Statements stmts); + + void visit(Execute execute); + + void visit(SetStatement set); + + void visit(Merge merge); + + void visit(Select select); + + void visit(Upsert upsert); + + void visit(UseStatement use); + + void visit(CreateSequence createSequence); + +} diff --git a/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java b/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java new file mode 100644 index 0000000000..0322daeb21 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java @@ -0,0 +1,36 @@ +/* + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2020 JSQLParser + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ +package net.sf.jsqlparser.statement.create.sequence; + +import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.StatementVisitor; + +/** + * A {@code CREATE SEQUENCE} statement + */ +public class CreateSequence implements Statement { + + @Override + public void accept(StatementVisitor statementVisitor) { + statementVisitor.visit(this); + } +} diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index bd8f908974..12516f3289 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1,3663 +1,3676 @@ -/* - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2014 JSQLParser - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * . - * #L% - */ - -options{ - IGNORE_CASE = true ; - STATIC = false; - DEBUG_PARSER = false; - DEBUG_LOOKAHEAD = false; - DEBUG_TOKEN_MANAGER = false; - CACHE_TOKENS = false; -// FORCE_LA_CHECK = true; - UNICODE_INPUT = true; - JAVA_TEMPLATE_TYPE = "modern"; - JDK_VERSION = "1.7"; - TOKEN_EXTENDS = "BaseToken"; - COMMON_TOKEN_ACTION = true; - NODE_DEFAULT_VOID = true; - TRACK_TOKENS = true; - VISITOR = true; -} - -PARSER_BEGIN(CCJSqlParser) -/* - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2014 JSQLParser - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * . - * #L% - */ - -package net.sf.jsqlparser.parser; - -import net.sf.jsqlparser.expression.*; -import net.sf.jsqlparser.expression.operators.arithmetic.*; -import net.sf.jsqlparser.expression.operators.conditional.*; -import net.sf.jsqlparser.expression.operators.relational.*; -import net.sf.jsqlparser.schema.*; -import net.sf.jsqlparser.statement.*; -import net.sf.jsqlparser.statement.alter.*; -import net.sf.jsqlparser.statement.create.index.*; -import net.sf.jsqlparser.statement.create.table.*; -import net.sf.jsqlparser.statement.create.view.*; -import net.sf.jsqlparser.statement.delete.*; -import net.sf.jsqlparser.statement.drop.*; -import net.sf.jsqlparser.statement.insert.*; -import net.sf.jsqlparser.statement.replace.*; -import net.sf.jsqlparser.statement.execute.*; -import net.sf.jsqlparser.statement.select.*; -import net.sf.jsqlparser.statement.truncate.*; -import net.sf.jsqlparser.statement.update.*; -import net.sf.jsqlparser.statement.upsert.*; -import net.sf.jsqlparser.statement.merge.*; -import java.util.*; - -/** - * The parser generated by JavaCC - */ -public class CCJSqlParser { - int jdbcParameterIndex = 0; - boolean errorRecovery = false; - List parseErrors = new ArrayList(); - - private void linkAST(ASTNodeAccess access, SimpleNode node) { - access.setASTNode(node); - node.jjtSetValue(access); - } - - public Node getASTRoot() { - return jjtree.rootNode(); - } - - public void setErrorRecovery(boolean errorRecovery) { - this.errorRecovery = errorRecovery; - } - - public List getParseErrors() { - return parseErrors; - } -} - -PARSER_END(CCJSqlParser) - -TOKEN_MGR_DECLS : { - public void CommonTokenAction(Token t) - { - t.absoluteBegin = getCurrentTokenAbsolutePosition(); - t.absoluteEnd = t.absoluteBegin + t.image.length(); - } - - public int getCurrentTokenAbsolutePosition() - { - if (input_stream instanceof SimpleCharStream) - return ((SimpleCharStream)input_stream).getAbsoluteTokenBegin(); - return -1; - } -} - -SKIP: -{ - -} - -TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ -{ - -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -} - -TOKEN : /* Stuff */ -{ - -} - -TOKEN : /* Operators */ -{ - " ()* "="> -| )* "="> -| )* ">"> -| )* "="> -| )* "|"> -} - -TOKEN : /* Date/Time with time zones */ -{ - ()* ("(" ")")? ()* ( | ) ()+ "TIME" ()+ > -} - -TOKEN : /* Numeric Constants */ -{ - < S_DOUBLE: (()? "." ( ["e","E"] (["+", "-"])? )? - | - "." (["e","E"] (["+", "-"])? )? - | - ["e","E"] (["+", "-"])? - )> - | < S_LONG: ( )+ > - | < #DIGIT: ["0" - "9"] > - | < S_HEX: ("x'" ( )+ "'" | "0x" ( )+ ) > - | < #HEX_VALUE: ["0"-"9","A"-"F"] > -} - -SPECIAL_TOKEN: -{ - < LINE_COMMENT: "--"(~["\r","\n"])*> -| < MULTI_LINE_COMMENT: "/*" (~["*"])* "*" ("*" | (~["*","/"] (~["*"])* "*"))* "/"> -} - -TOKEN: -{ - ()*> -| <#LETTER: ["$","A"-"Z","_","#","a"-"z","\u00a2"-"\u00a5","\u00aa","\u00b5","\u00ba","\u00c0"-"\u00d6","\u00d8"-"\u00f6","\u00f8"-"\u021f","\u0222"-"\u0233","\u0250"-"\u02ad","\u02b0"-"\u02b8","\u02bb"-"\u02c1","\u02d0"-"\u02d1","\u02e0"-"\u02e4","\u02ee","\u037a","\u0386","\u0388"-"\u038a","\u038c","\u038e"-"\u03a1","\u03a3"-"\u03ce","\u03d0"-"\u03d7","\u03da"-"\u03f3","\u0400"-"\u0481","\u048c"-"\u04c4","\u04c7"-"\u04c8","\u04cb"-"\u04cc","\u04d0"-"\u04f5","\u04f8"-"\u04f9","\u0531"-"\u0556","\u0559","\u0561"-"\u0587","\u05d0"-"\u05ea","\u05f0"-"\u05f2","\u0621"-"\u063a","\u0640"-"\u064a","\u0671"-"\u06d3","\u06d5","\u06e5"-"\u06e6","\u06fa"-"\u06fc","\u0710","\u0712"-"\u072c","\u0780"-"\u07a5","\u0905"-"\u0939","\u093d","\u0950","\u0958"-"\u0961","\u0985"-"\u098c","\u098f"-"\u0990","\u0993"-"\u09a8","\u09aa"-"\u09b0","\u09b2","\u09b6"-"\u09b9","\u09dc"-"\u09dd","\u09df"-"\u09e1","\u09f0"-"\u09f3","\u0a05"-"\u0a0a","\u0a0f"-"\u0a10","\u0a13"-"\u0a28","\u0a2a"-"\u0a30","\u0a32"-"\u0a33","\u0a35"-"\u0a36","\u0a38"-"\u0a39","\u0a59"-"\u0a5c","\u0a5e","\u0a72"-"\u0a74","\u0a85"-"\u0a8b","\u0a8d","\u0a8f"-"\u0a91","\u0a93"-"\u0aa8","\u0aaa"-"\u0ab0","\u0ab2"-"\u0ab3","\u0ab5"-"\u0ab9","\u0abd","\u0ad0","\u0ae0","\u0b05"-"\u0b0c","\u0b0f"-"\u0b10","\u0b13"-"\u0b28","\u0b2a"-"\u0b30","\u0b32"-"\u0b33","\u0b36"-"\u0b39","\u0b3d","\u0b5c"-"\u0b5d","\u0b5f"-"\u0b61","\u0b85"-"\u0b8a","\u0b8e"-"\u0b90","\u0b92"-"\u0b95","\u0b99"-"\u0b9a","\u0b9c","\u0b9e"-"\u0b9f","\u0ba3"-"\u0ba4","\u0ba8"-"\u0baa","\u0bae"-"\u0bb5","\u0bb7"-"\u0bb9","\u0c05"-"\u0c0c","\u0c0e"-"\u0c10","\u0c12"-"\u0c28","\u0c2a"-"\u0c33","\u0c35"-"\u0c39","\u0c60"-"\u0c61","\u0c85"-"\u0c8c","\u0c8e"-"\u0c90","\u0c92"-"\u0ca8","\u0caa"-"\u0cb3","\u0cb5"-"\u0cb9","\u0cde","\u0ce0"-"\u0ce1","\u0d05"-"\u0d0c","\u0d0e"-"\u0d10","\u0d12"-"\u0d28","\u0d2a"-"\u0d39","\u0d60"-"\u0d61","\u0d85"-"\u0d96","\u0d9a"-"\u0db1","\u0db3"-"\u0dbb","\u0dbd","\u0dc0"-"\u0dc6","\u0e01"-"\u0e30","\u0e32"-"\u0e33","\u0e3f"-"\u0e46","\u0e81"-"\u0e82","\u0e84","\u0e87"-"\u0e88","\u0e8a","\u0e8d","\u0e94"-"\u0e97","\u0e99"-"\u0e9f","\u0ea1"-"\u0ea3","\u0ea5","\u0ea7","\u0eaa"-"\u0eab","\u0ead"-"\u0eb0","\u0eb2"-"\u0eb3","\u0ebd","\u0ec0"-"\u0ec4","\u0ec6","\u0edc"-"\u0edd","\u0f00","\u0f40"-"\u0f47","\u0f49"-"\u0f6a","\u0f88"-"\u0f8b","\u1000"-"\u1021","\u1023"-"\u1027","\u1029"-"\u102a","\u1050"-"\u1055","\u10a0"-"\u10c5","\u10d0"-"\u10f6","\u1100"-"\u1159","\u115f"-"\u11a2","\u11a8"-"\u11f9","\u1200"-"\u1206","\u1208"-"\u1246","\u1248","\u124a"-"\u124d","\u1250"-"\u1256","\u1258","\u125a"-"\u125d","\u1260"-"\u1286","\u1288","\u128a"-"\u128d","\u1290"-"\u12ae","\u12b0","\u12b2"-"\u12b5","\u12b8"-"\u12be","\u12c0","\u12c2"-"\u12c5","\u12c8"-"\u12ce","\u12d0"-"\u12d6","\u12d8"-"\u12ee","\u12f0"-"\u130e","\u1310","\u1312"-"\u1315","\u1318"-"\u131e","\u1320"-"\u1346","\u1348"-"\u135a","\u13a0"-"\u13f4","\u1401"-"\u166c","\u166f"-"\u1676","\u1681"-"\u169a","\u16a0"-"\u16ea","\u1780"-"\u17b3","\u17db","\u1820"-"\u1877","\u1880"-"\u18a8","\u1e00"-"\u1e9b","\u1ea0"-"\u1ef9","\u1f00"-"\u1f15","\u1f18"-"\u1f1d","\u1f20"-"\u1f45","\u1f48"-"\u1f4d","\u1f50"-"\u1f57","\u1f59","\u1f5b","\u1f5d","\u1f5f"-"\u1f7d","\u1f80"-"\u1fb4","\u1fb6"-"\u1fbc","\u1fbe","\u1fc2"-"\u1fc4","\u1fc6"-"\u1fcc","\u1fd0"-"\u1fd3","\u1fd6"-"\u1fdb","\u1fe0"-"\u1fec","\u1ff2"-"\u1ff4","\u1ff6"-"\u1ffc","\u203f"-"\u2040","\u207f","\u20a0"-"\u20af","\u2102","\u2107","\u210a"-"\u2113","\u2115","\u2119"-"\u211d","\u2124","\u2126","\u2128","\u212a"-"\u212d","\u212f"-"\u2131","\u2133"-"\u2139","\u2160"-"\u2183","\u3005"-"\u3007","\u3021"-"\u3029","\u3031"-"\u3035","\u3038"-"\u303a","\u3041"-"\u3094","\u309d"-"\u309e","\u30a1"-"\u30fe","\u3105"-"\u312c","\u3131"-"\u318e","\u31a0"-"\u31b7","\u3400"-"\u4db5","\u4e00"-"\u9fa5","\ua000"-"\ua48c","\uac00"-"\ud7a3","\uf900"-"\ufa2d","\ufb00"-"\ufb06","\ufb13"-"\ufb17","\ufb1d","\ufb1f"-"\ufb28","\ufb2a"-"\ufb36","\ufb38"-"\ufb3c","\ufb3e","\ufb40"-"\ufb41","\ufb43"-"\ufb44","\ufb46"-"\ufbb1","\ufbd3"-"\ufd3d","\ufd50"-"\ufd8f","\ufd92"-"\ufdc7","\ufdf0"-"\ufdfb","\ufe33"-"\ufe34","\ufe4d"-"\ufe4f","\ufe69","\ufe70"-"\ufe72","\ufe74","\ufe76"-"\ufefc","\uff04","\uff21"-"\uff3a","\uff3f","\uff41"-"\uff5a","\uff65"-"\uffbe","\uffc2"-"\uffc7","\uffca"-"\uffcf","\uffd2"-"\uffd7","\uffda"-"\uffdc","\uffe0"-"\uffe1","\uffe5"-"\uffe6"]> -| <#PART_LETTER: ["\u0000"-"\b","\u000e"-"\u001b","$","#","@","0"-"9","A"-"Z","_","a"-"z","\u007f"-"\u009f","\u00a2"-"\u00a5","\u00aa","\u00b5","\u00ba","\u00c0"-"\u00d6","\u00d8"-"\u00f6","\u00f8"-"\u021f","\u0222"-"\u0233","\u0250"-"\u02ad","\u02b0"-"\u02b8","\u02bb"-"\u02c1","\u02d0"-"\u02d1","\u02e0"-"\u02e4","\u02ee","\u0300"-"\u034e","\u0360"-"\u0362","\u037a","\u0386","\u0388"-"\u038a","\u038c","\u038e"-"\u03a1","\u03a3"-"\u03ce","\u03d0"-"\u03d7","\u03da"-"\u03f3","\u0400"-"\u0481","\u0483"-"\u0486","\u048c"-"\u04c4","\u04c7"-"\u04c8","\u04cb"-"\u04cc","\u04d0"-"\u04f5","\u04f8"-"\u04f9","\u0531"-"\u0556","\u0559","\u0561"-"\u0587","\u0591"-"\u05a1","\u05a3"-"\u05b9","\u05bb"-"\u05bd","\u05bf","\u05c1"-"\u05c2","\u05c4","\u05d0"-"\u05ea","\u05f0"-"\u05f2","\u0621"-"\u063a","\u0640"-"\u0655","\u0660"-"\u0669","\u0670"-"\u06d3","\u06d5"-"\u06dc","\u06df"-"\u06e8","\u06ea"-"\u06ed","\u06f0"-"\u06fc","\u070f"-"\u072c","\u0730"-"\u074a","\u0780"-"\u07b0","\u0901"-"\u0903","\u0905"-"\u0939","\u093c"-"\u094d","\u0950"-"\u0954","\u0958"-"\u0963","\u0966"-"\u096f","\u0981"-"\u0983","\u0985"-"\u098c","\u098f"-"\u0990","\u0993"-"\u09a8","\u09aa"-"\u09b0","\u09b2","\u09b6"-"\u09b9","\u09bc","\u09be"-"\u09c4","\u09c7"-"\u09c8","\u09cb"-"\u09cd","\u09d7","\u09dc"-"\u09dd","\u09df"-"\u09e3","\u09e6"-"\u09f3","\u0a02","\u0a05"-"\u0a0a","\u0a0f"-"\u0a10","\u0a13"-"\u0a28","\u0a2a"-"\u0a30","\u0a32"-"\u0a33","\u0a35"-"\u0a36","\u0a38"-"\u0a39","\u0a3c","\u0a3e"-"\u0a42","\u0a47"-"\u0a48","\u0a4b"-"\u0a4d","\u0a59"-"\u0a5c","\u0a5e","\u0a66"-"\u0a74","\u0a81"-"\u0a83","\u0a85"-"\u0a8b","\u0a8d","\u0a8f"-"\u0a91","\u0a93"-"\u0aa8","\u0aaa"-"\u0ab0","\u0ab2"-"\u0ab3","\u0ab5"-"\u0ab9","\u0abc"-"\u0ac5","\u0ac7"-"\u0ac9","\u0acb"-"\u0acd","\u0ad0","\u0ae0","\u0ae6"-"\u0aef","\u0b01"-"\u0b03","\u0b05"-"\u0b0c","\u0b0f"-"\u0b10","\u0b13"-"\u0b28","\u0b2a"-"\u0b30","\u0b32"-"\u0b33","\u0b36"-"\u0b39","\u0b3c"-"\u0b43","\u0b47"-"\u0b48","\u0b4b"-"\u0b4d","\u0b56"-"\u0b57","\u0b5c"-"\u0b5d","\u0b5f"-"\u0b61","\u0b66"-"\u0b6f","\u0b82"-"\u0b83","\u0b85"-"\u0b8a","\u0b8e"-"\u0b90","\u0b92"-"\u0b95","\u0b99"-"\u0b9a","\u0b9c","\u0b9e"-"\u0b9f","\u0ba3"-"\u0ba4","\u0ba8"-"\u0baa","\u0bae"-"\u0bb5","\u0bb7"-"\u0bb9","\u0bbe"-"\u0bc2","\u0bc6"-"\u0bc8","\u0bca"-"\u0bcd","\u0bd7","\u0be7"-"\u0bef","\u0c01"-"\u0c03","\u0c05"-"\u0c0c","\u0c0e"-"\u0c10","\u0c12"-"\u0c28","\u0c2a"-"\u0c33","\u0c35"-"\u0c39","\u0c3e"-"\u0c44","\u0c46"-"\u0c48","\u0c4a"-"\u0c4d","\u0c55"-"\u0c56","\u0c60"-"\u0c61","\u0c66"-"\u0c6f","\u0c82"-"\u0c83","\u0c85"-"\u0c8c","\u0c8e"-"\u0c90","\u0c92"-"\u0ca8","\u0caa"-"\u0cb3","\u0cb5"-"\u0cb9","\u0cbe"-"\u0cc4","\u0cc6"-"\u0cc8","\u0cca"-"\u0ccd","\u0cd5"-"\u0cd6","\u0cde","\u0ce0"-"\u0ce1","\u0ce6"-"\u0cef","\u0d02"-"\u0d03","\u0d05"-"\u0d0c","\u0d0e"-"\u0d10","\u0d12"-"\u0d28","\u0d2a"-"\u0d39","\u0d3e"-"\u0d43","\u0d46"-"\u0d48","\u0d4a"-"\u0d4d","\u0d57","\u0d60"-"\u0d61","\u0d66"-"\u0d6f","\u0d82"-"\u0d83","\u0d85"-"\u0d96","\u0d9a"-"\u0db1","\u0db3"-"\u0dbb","\u0dbd","\u0dc0"-"\u0dc6","\u0dca","\u0dcf"-"\u0dd4","\u0dd6","\u0dd8"-"\u0ddf","\u0df2"-"\u0df3","\u0e01"-"\u0e3a","\u0e3f"-"\u0e4e","\u0e50"-"\u0e59","\u0e81"-"\u0e82","\u0e84","\u0e87"-"\u0e88","\u0e8a","\u0e8d","\u0e94"-"\u0e97","\u0e99"-"\u0e9f","\u0ea1"-"\u0ea3","\u0ea5","\u0ea7","\u0eaa"-"\u0eab","\u0ead"-"\u0eb9","\u0ebb"-"\u0ebd","\u0ec0"-"\u0ec4","\u0ec6","\u0ec8"-"\u0ecd","\u0ed0"-"\u0ed9","\u0edc"-"\u0edd","\u0f00","\u0f18"-"\u0f19","\u0f20"-"\u0f29","\u0f35","\u0f37","\u0f39","\u0f3e"-"\u0f47","\u0f49"-"\u0f6a","\u0f71"-"\u0f84","\u0f86"-"\u0f8b","\u0f90"-"\u0f97","\u0f99"-"\u0fbc","\u0fc6","\u1000"-"\u1021","\u1023"-"\u1027","\u1029"-"\u102a","\u102c"-"\u1032","\u1036"-"\u1039","\u1040"-"\u1049","\u1050"-"\u1059","\u10a0"-"\u10c5","\u10d0"-"\u10f6","\u1100"-"\u1159","\u115f"-"\u11a2","\u11a8"-"\u11f9","\u1200"-"\u1206","\u1208"-"\u1246","\u1248","\u124a"-"\u124d","\u1250"-"\u1256","\u1258","\u125a"-"\u125d","\u1260"-"\u1286","\u1288","\u128a"-"\u128d","\u1290"-"\u12ae","\u12b0","\u12b2"-"\u12b5","\u12b8"-"\u12be","\u12c0","\u12c2"-"\u12c5","\u12c8"-"\u12ce","\u12d0"-"\u12d6","\u12d8"-"\u12ee","\u12f0"-"\u130e","\u1310","\u1312"-"\u1315","\u1318"-"\u131e","\u1320"-"\u1346","\u1348"-"\u135a","\u1369"-"\u1371","\u13a0"-"\u13f4","\u1401"-"\u166c","\u166f"-"\u1676","\u1681"-"\u169a","\u16a0"-"\u16ea","\u1780"-"\u17d3","\u17db","\u17e0"-"\u17e9","\u180b"-"\u180e","\u1810"-"\u1819","\u1820"-"\u1877","\u1880"-"\u18a9","\u1e00"-"\u1e9b","\u1ea0"-"\u1ef9","\u1f00"-"\u1f15","\u1f18"-"\u1f1d","\u1f20"-"\u1f45","\u1f48"-"\u1f4d","\u1f50"-"\u1f57","\u1f59","\u1f5b","\u1f5d","\u1f5f"-"\u1f7d","\u1f80"-"\u1fb4","\u1fb6"-"\u1fbc","\u1fbe","\u1fc2"-"\u1fc4","\u1fc6"-"\u1fcc","\u1fd0"-"\u1fd3","\u1fd6"-"\u1fdb","\u1fe0"-"\u1fec","\u1ff2"-"\u1ff4","\u1ff6"-"\u1ffc","\u200c"-"\u200f","\u202a"-"\u202e","\u203f"-"\u2040","\u206a"-"\u206f","\u207f","\u20a0"-"\u20af","\u20d0"-"\u20dc","\u20e1","\u2102","\u2107","\u210a"-"\u2113","\u2115","\u2119"-"\u211d","\u2124","\u2126","\u2128","\u212a"-"\u212d","\u212f"-"\u2131","\u2133"-"\u2139","\u2160"-"\u2183","\u3005"-"\u3007","\u3021"-"\u302f","\u3031"-"\u3035","\u3038"-"\u303a","\u3041"-"\u3094","\u3099"-"\u309a","\u309d"-"\u309e","\u30a1"-"\u30fe","\u3105"-"\u312c","\u3131"-"\u318e","\u31a0"-"\u31b7","\u3400"-"\u4db5","\u4e00"-"\u9fa5","\ua000"-"\ua48c","\uac00"-"\ud7a3","\uf900"-"\ufa2d","\ufb00"-"\ufb06","\ufb13"-"\ufb17","\ufb1d"-"\ufb28","\ufb2a"-"\ufb36","\ufb38"-"\ufb3c","\ufb3e","\ufb40"-"\ufb41","\ufb43"-"\ufb44","\ufb46"-"\ufbb1","\ufbd3"-"\ufd3d","\ufd50"-"\ufd8f","\ufd92"-"\ufdc7","\ufdf0"-"\ufdfb","\ufe20"-"\ufe23","\ufe33"-"\ufe34","\ufe4d"-"\ufe4f","\ufe69","\ufe70"-"\ufe72","\ufe74","\ufe76"-"\ufefc","\ufeff","\uff04","\uff10"-"\uff19","\uff21"-"\uff3a","\uff3f","\uff41"-"\uff5a","\uff65"-"\uffbe","\uffc2"-"\uffc7","\uffca"-"\uffcf","\uffd2"-"\uffd7","\uffda"-"\uffdc","\uffe0"-"\uffe1","\uffe5"-"\uffe6","\ufff9"-"\ufffb"]> -| < S_CHAR_LITERAL: (["U","E","N"])? (("'" ( | ~["'", "\\", "\n", "\r"] )* "'") | ("'" ("''" | ~["'"])* "'")) > -| < S_QUOTED_IDENTIFIER: "\"" (~["\n","\r","\""])+ "\"" | ("`" (~["\n","\r","`"])+ "`") | ( "[" ~["0"-"9","]"] (~["\n","\r","]"])* "]" ) > -| < #ESC: "\\" ["n","t","b","r","f","\\","'","\""] > -} - -Statement Statement() #Statement: -{ Statement stm = null; } -{ - try { - stm = SingleStatement() - [] - - } catch (ParseException e) { - if (errorRecovery) { - parseErrors.add(e); - error_skipto(ST_SEMICOLON); - } - else - throw e; - } - - { - return stm; - } -} - -Statement SingleStatement() : -{ Statement stm = null;} -{ - try { - ( - stm = Select() - | - stm = Update() - | - stm = Insert() - | - stm = Upsert() - | - stm = Delete() - | - stm = Replace() - | - LOOKAHEAD(2) - stm = AlterTable() - | - stm = Merge() - | - LOOKAHEAD(CreateIndex()) - stm = CreateIndex() - | - LOOKAHEAD(CreateTable()) - stm = CreateTable() - | - LOOKAHEAD(CreateView()) - stm = CreateView() - | - stm = AlterView() - | - stm = Drop() - | - stm = Truncate() - | - stm = Execute() - | - stm = Set() - | - stm = Use() - | - stm = Commit() - ) - { return stm; } - } catch (ParseException e) { - if (errorRecovery) { - parseErrors.add(e); - error_skipto(ST_SEMICOLON); - return null; - } - else - throw e; - } -} - -Statements Statements() #Statements : -{ Statements stmts = new Statements(); - List list = new ArrayList(); - Statement stm; } -{ - ()* - try { - stm = SingleStatement() { list.add(stm); } - ( [stm = SingleStatement() { list.add(stm); }] )* - - } catch (ParseException e) { - if (errorRecovery) { - parseErrors.add(e); - error_skipto(ST_SEMICOLON); - } - else - throw e; - } - { - stmts.setStatements(list); - return stmts; - } -} - -JAVACODE -void error_skipto(int kind) { - ParseException e = generateParseException(); - System.out.println(e.toString()); - Token t; - do { - t = getNextToken(); - } while (t.kind != kind && t.kind != EOF); -} - -SetStatement Set(): { - String name; - Expression value; - boolean useEqual = false; -} -{ - name = RelObjectNameExt() ["=" { useEqual=true; } ] value=SimpleExpression() - { - return new SetStatement(name,value).setUseEqual(useEqual); - } -} - -UseStatement Use(): { - String name; -} -{ - name = RelObjectNameExt() - { - return new UseStatement(name); - } -} - -Update Update(): -{ - Update update = new Update(); - Table table = null; - List tables = new ArrayList
(); - Expression where = null; - Column tableColumn = null; - List expList = new ArrayList(); - List columns = new ArrayList(); - Expression value = null; - FromItem fromItem = null; - List joins = null; - Select select = null; - Limit limit = null; - List orderByElements; - boolean useColumnsBrackets = false; - List returning = null; -} -{ - table=TableWithAlias() { tables.add(table); } - ("," table=TableWithAlias() { tables.add(table); } )* - - ( - LOOKAHEAD(3) tableColumn=Column() "=" value=SimpleExpression() { columns.add(tableColumn); expList.add(value); } - ("," tableColumn=Column() "=" value=SimpleExpression() { columns.add(tableColumn); expList.add(value); } )* - - | - - ["(" { useColumnsBrackets = true; }] tableColumn=Column() { columns.add(tableColumn); } ("," tableColumn=Column() { columns.add(tableColumn); } )* [ ")" ] "=" - "(" - ( - { update.setUseSelect(true); } - select = Select() - ) - ")" - ) - - [ - fromItem=FromItem() - joins=JoinsList() ] - - [ where=WhereClause() { update.setWhere(where); } ] - - [ orderByElements = OrderByElements() { update.setOrderByElements(orderByElements); } ] - [ limit = PlainLimit() { update.setLimit(limit); } ] - [ ( - "*" { update.setReturningAllColumns(true); } - | returning=ListExpressionItem() - ) - ] - - { - update.setColumns(columns); - update.setExpressions(expList); - update.setTables(tables); - update.setFromItem(fromItem); - update.setJoins(joins); - update.setSelect(select); - update.setUseColumnsBrackets(useColumnsBrackets); - update.setReturningExpressionList(returning); - return update; - } -} - -Replace Replace(): -{ - Replace replace = new Replace(); - Table table = null; - Column tableColumn = null; - Expression value = null; - - List columns = new ArrayList(); - List expList = new ArrayList(); - MultiExpressionList multiExpr = null; - ItemsList itemsList = null; - Expression exp = null; -} -{ - [ { replace.setUseIntoTables(true); }] table=Table() - - ( - ( - tableColumn=Column() "=" value=SimpleExpression() { columns.add(tableColumn); expList.add(value); } - ("," tableColumn=Column() "=" value=SimpleExpression() { columns.add(tableColumn); expList.add(value); } )* - { - replace.setExpressions(expList); - } - ) - | - - ( - [LOOKAHEAD(2) "(" tableColumn=Column() { columns.add(tableColumn); } ("," tableColumn=Column() { columns.add(tableColumn); } )* ")" ] - ( - LOOKAHEAD(2) [ | ] "(" exp=PrimaryExpression() { expList.add(exp); } - ("," exp=PrimaryExpression() { expList.add(exp); } )* ")" { itemsList = new ExpressionList(expList); } - ("," "(" exp=SimpleExpression() { - if (multiExpr==null) { - multiExpr=new MultiExpressionList(); - multiExpr.addExpressionList((ExpressionList)itemsList); - itemsList = multiExpr; - } - expList = new ArrayList(); - expList.add(exp); } - ("," exp=SimpleExpression() { expList.add(exp); } )* ")" { multiExpr.addExpressionList(expList); } )* - | - { replace.setUseValues(false); } - itemsList=SubSelect() - { ((SubSelect)itemsList).setUseBrackets(false); } - ) - { - replace.setItemsList(itemsList); - } - ) - ) - { - if (columns.size() > 0) - replace.setColumns(columns); - replace.setTable(table); - return replace; - } -} - -List ListExpressionItem(): -{ - List retval = new ArrayList(); - SelectExpressionItem item; -} -{ - item = SelectExpressionItem() {retval.add(item);} - ("," item = SelectExpressionItem() {retval.add(item);} )* - { return retval; } -} - -Insert Insert(): -{ - Insert insert = new Insert(); - Table table = null; - Column tableColumn = null; - List columns = new ArrayList(); - List primaryExpList = new ArrayList(); - ItemsList itemsList = null; - Expression exp = null; - MultiExpressionList multiExpr = null; - List returning = null; - Select select = null; - boolean useValues = true; - boolean useSelectBrackets = false; - boolean useDuplicate = false; - List duplicateUpdateColumns = null; - List duplicateUpdateExpressionList = null; - Token tk = null; - InsertModifierPriority modifierPriority = null; - boolean modifierIgnore = false; - boolean useSet = false; - List setColumns = new ArrayList(); - List setExpressionList = new ArrayList(); - String name = null; - boolean useAs = false; -} -{ - - [(tk = | tk = | tk = ) - {if (tk!=null) - modifierPriority = InsertModifierPriority.valueOf(tk.image.toUpperCase()); - }] - [{ modifierIgnore = true; }] - [] table=Table() - - [ [ { useAs = true; } ] name=RelObjectNameWithoutValue() { table.setAlias(new Alias(name,useAs)); }] - - [LOOKAHEAD(2) "(" tableColumn=Column() { columns.add(tableColumn); } ("," tableColumn=Column() { columns.add(tableColumn); } )* ")" ] - ( - LOOKAHEAD(2) [ | ] "(" exp=SimpleExpression() { primaryExpList.add(exp); } - ("," exp=SimpleExpression() { primaryExpList.add(exp); } )* ")" { itemsList = new ExpressionList(primaryExpList); } - ("," "(" exp=SimpleExpression() { - if (multiExpr==null) { - multiExpr=new MultiExpressionList(); - multiExpr.addExpressionList((ExpressionList)itemsList); - itemsList = multiExpr; - } - primaryExpList = new ArrayList(); - primaryExpList.add(exp); } - ("," exp=SimpleExpression() { primaryExpList.add(exp); } )* ")" { multiExpr.addExpressionList(primaryExpList); } )* - - | - - ( - LOOKAHEAD(2) "(" { useSelectBrackets = true; } - { insert.setUseValues(false); } - select = Select() - ")" - | - { insert.setUseValues(false); } - select = Select() - ) - - | - - - ( - { - useSet = true; - insert.setUseValues(false); - } - tableColumn=Column() "=" exp=SimpleExpression() - { - setColumns = new ArrayList(); - setExpressionList = new ArrayList(); - setColumns.add(tableColumn); - setExpressionList.add(exp); - } - ("," tableColumn=Column() "=" exp=SimpleExpression() - { setColumns.add(tableColumn); - setExpressionList.add(exp); } )* - ) - ) - - [ - { useDuplicate = true; } - tableColumn=Column() "=" exp=SimpleExpression() - { - duplicateUpdateColumns = new ArrayList(); - duplicateUpdateExpressionList = new ArrayList(); - duplicateUpdateColumns.add(tableColumn); - duplicateUpdateExpressionList.add(exp); - } - ("," tableColumn=Column() "=" exp=SimpleExpression() - { duplicateUpdateColumns.add(tableColumn); - duplicateUpdateExpressionList.add(exp); } )*] - - - [ ( - "*" { insert.setReturningAllColumns(true); } - | returning=ListExpressionItem() - ) - ] - - { - insert.setItemsList(itemsList); - insert.setUseSelectBrackets(useSelectBrackets); - insert.setSelect(select); - insert.setTable(table); - if (columns.size() > 0) - insert.setColumns(columns); - insert.setUseDuplicate(useDuplicate); - insert.setDuplicateUpdateColumns(duplicateUpdateColumns); - insert.setDuplicateUpdateExpressionList(duplicateUpdateExpressionList); - insert.setReturningExpressionList(returning); - insert.setModifierPriority(modifierPriority); - insert.setModifierIgnore(modifierIgnore); - insert.setUseSet(useSet); - insert.setSetColumns(setColumns); - insert.setSetExpressionList(setExpressionList); - return insert; - } -} - -Upsert Upsert(): -{ - Upsert upsert = new Upsert(); - Table table = null; - Column tableColumn = null; - List columns = new ArrayList(); - List primaryExpList = new ArrayList(); - ItemsList itemsList = null; - Expression exp = null; - MultiExpressionList multiExpr = null; - List returning = null; - Select select = null; - boolean useSelectBrackets = false; - boolean useDuplicate = false; - List duplicateUpdateColumns = null; - List duplicateUpdateExpressionList = null; - Token tk = null; -} -{ - - [] table=Table() - - - [LOOKAHEAD(2) "(" tableColumn=Column() { columns.add(tableColumn); } ("," tableColumn=Column() { columns.add(tableColumn); } )* ")" ] - ( - LOOKAHEAD(2) [ | ] "(" exp=SimpleExpression() { primaryExpList.add(exp); } - ("," exp=SimpleExpression() { primaryExpList.add(exp); } )* ")" { itemsList = new ExpressionList(primaryExpList); } - ("," "(" exp=SimpleExpression() { - if (multiExpr==null) { - multiExpr=new MultiExpressionList(); - multiExpr.addExpressionList((ExpressionList)itemsList); - itemsList = multiExpr; - } - primaryExpList = new ArrayList(); - primaryExpList.add(exp); } - ("," exp=SimpleExpression() { primaryExpList.add(exp); } )* ")" { multiExpr.addExpressionList(primaryExpList); } )* - - | - - ( - LOOKAHEAD(2) "(" { useSelectBrackets = true; } - { upsert.setUseValues(false); } - select = Select() - ")" - | - { upsert.setUseValues(false); } - select = Select() - ) - ) - - [ - { useDuplicate = true; } - tableColumn=Column() "=" exp=SimpleExpression() - { - duplicateUpdateColumns = new ArrayList(); - duplicateUpdateExpressionList = new ArrayList(); - duplicateUpdateColumns.add(tableColumn); - duplicateUpdateExpressionList.add(exp); - } - ("," tableColumn=Column() "=" exp=SimpleExpression() - { duplicateUpdateColumns.add(tableColumn); - duplicateUpdateExpressionList.add(exp); } )*] - - { - upsert.setItemsList(itemsList); - upsert.setUseSelectBrackets(useSelectBrackets); - upsert.setSelect(select); - upsert.setTable(table); - if (columns.size() > 0) { - upsert.setColumns(columns); - } - upsert.setUseDuplicate(useDuplicate); - upsert.setDuplicateUpdateColumns(duplicateUpdateColumns); - upsert.setDuplicateUpdateExpressionList(duplicateUpdateExpressionList); - return upsert; - } -} - -Delete Delete(): -{ - Delete delete = new Delete(); - Table table = null; - List
tables = new ArrayList
(); - List joins = null; - Expression where = null; - Limit limit = null; - List orderByElements; -} -{ - [LOOKAHEAD(2) (table=TableWithAlias() { tables.add(table); } - ("," table=TableWithAlias() { tables.add(table); } )* - | )] - - [ table=TableWithAlias() - joins=JoinsList() ] - [where=WhereClause() { delete.setWhere(where); } ] - [orderByElements = OrderByElements() { delete.setOrderByElements(orderByElements); } ] - [limit=PlainLimit() {delete.setLimit(limit); } ] - { - delete.setTables(tables); - if (joins != null && joins.size() > 0) - delete.setJoins(joins); - delete.setTable(table); - return delete; - } -} - -Statement Merge() : { - Merge merge = new Merge(); - Table table; - SubSelect select; - Alias alias; - Expression condition; - MergeUpdate update; - MergeInsert insert; -} -{ - table=TableWithAlias() { merge.setTable(table); } - - ( table=Table() { merge.setUsingTable(table); } - | "(" select=SubSelect() { merge.setUsingSelect(select); } ")" ) - [ alias = Alias() { merge.setUsingAlias(alias); } ] - "(" condition = Expression() { merge.setOnCondition(condition); } ")" - - [ - ( LOOKAHEAD(2) update = MergeUpdateClause() { merge.setMergeUpdate(update); } - [ insert = MergeInsertClause() { merge.setMergeInsert(insert); } ] - | insert = MergeInsertClause() { merge.setMergeInsert(insert); merge.setInsertFirst(true); } - [ update = MergeUpdateClause() { merge.setMergeUpdate(update); } ] - ) - ] - - - /*[ LOOKAHEAD(2) update = MergeUpdateClause() { merge.setMergeUpdate(update); } ] - - [ insert = MergeInsertClause() { merge.setMergeInsert(insert); } ]*/ - - { return merge; } -} - -MergeUpdate MergeUpdateClause() : { - MergeUpdate mu = new MergeUpdate(); - List columns = new ArrayList(); - List expList = new ArrayList(); - Column col; - Expression exp; - Expression condition; -} -{ - - - col = Column() "=" exp = SimpleExpression() - { columns.add(col); expList.add(exp); } - ("," col = Column() "=" exp = SimpleExpression() { columns.add(col); expList.add(exp); } )* - - { mu.setColumns(columns); mu.setValues(expList); } - - [ condition = Expression() { mu.setWhereCondition(condition); }] - [ condition = Expression() { mu.setDeleteWhereCondition(condition); } ] - - { return mu; } -} - -MergeInsert MergeInsertClause() : { - MergeInsert mi = new MergeInsert(); - List columns = new ArrayList(); - List expList = new ArrayList(); - Column col; - Expression exp; -} -{ - - "(" col=Column() { columns.add(col); } ("," col=Column() { columns.add(col); } )* ")" - "(" exp=SimpleExpression() { expList.add(exp); } ("," exp=SimpleExpression() { expList.add(exp); } )* ")" - { - mi.setColumns(columns); - mi.setValues(expList); - return mi; - } -} - -// See: http://technet.microsoft.com/en-us/library/ms187879%28v=sql.105%29.aspx - -Column Column() #Column : -{ - String databaseName = null, schemaName = null, tableName = null, columnName = null; - String token = null; -} -{ - columnName = RelObjectName() - ( "." [LOOKAHEAD(2) token = RelObjectName()] { tableName = columnName; columnName = token; token = null;} - ( "." token = RelObjectName() { schemaName = tableName; tableName = columnName; columnName = token; token = null;} - ( "." token = RelObjectName() { databaseName = schemaName; schemaName = tableName; tableName = columnName; columnName = token; } - )? - )? - )? - - /*( - LOOKAHEAD(7) databaseName=RelObjectName() "." [schemaName=RelObjectName()] "." tableName=RelObjectName() "." columnName=RelObjectName() - | LOOKAHEAD(5) schemaName=RelObjectName() "." tableName=RelObjectName() "." columnName=RelObjectName() - | LOOKAHEAD(3) tableName=RelObjectName() "." columnName=RelObjectName() - | columnName=RelObjectName() - )*/ - - { - if (tableName==null && (databaseName!=null || schemaName!=null)) { - throw generateParseException(); - } - - final Database database = new Database(databaseName); - final Table table = new Table(database, schemaName, tableName); - Column col = new Column(table, columnName); - linkAST(col,jjtThis); - return col; - } -} - -/* -Not all names should be allowed for aliases. -*/ -String RelObjectNameWithoutValue() : -{ Token tk = null; } -{ - (tk= | tk= - | tk= | tk= | tk= | tk= | tk= - | tk= | tk= | tk= | tk= | tk= - | tk= | tk= | tk= | tk= - | tk= | tk= | tk= | tk= | tk= - | tk= | tk= | tk= | tk= - | tk= | tk= | tk= | tk= | tk= - | tk= | tk= | tk= | tk= - | tk= | tk= | tk= | tk= - | tk= - | tk= | tk= | tk= - ) - - { return tk.image; } -} - -/* -Normal names. -*/ -String RelObjectName() : -{ Token tk = null; String result = null; } -{ - (result = RelObjectNameWithoutValue() | tk= | tk=) - - { - if (tk!=null) result=tk.image; - return result; - } -} - -/* -Extended version of object names. -*/ -String RelObjectNameExt(): -{ Token tk = null; - String result=null; -} -{ - ( result=RelObjectName() | tk= | tk= | tk= | tk= | tk=) - { - if (tk!=null) result=tk.image; - return result; - } -} - -/* -Extended usage of object names - part 2. -*/ -String RelObjectNameExt2(): -{ Token tk = null; - String result=null; -} -{ - ( result=RelObjectNameExt() | tk= | tk= ) - { - if (tk!=null) result=tk.image; - return result; - } -} - -Table Table() #Table : -{ - String serverName = null, databaseName = null, schemaName = null, tableName = null; -} -{ - ( - LOOKAHEAD(7) serverName=RelObjectName() "." [databaseName=RelObjectName()] "." [schemaName=RelObjectName()] "." tableName=RelObjectName() - | LOOKAHEAD(5) databaseName=RelObjectName() "." [schemaName=RelObjectName()] "." tableName=RelObjectName() - | LOOKAHEAD(3) schemaName=RelObjectName() "." tableName=RelObjectName() - | tableName=RelObjectName() - ) - { - final Server server = new Server(serverName); - final Database database = new Database(server, databaseName); - Table table = new Table(database, schemaName, tableName); - return table; - } -} - -Table TableWithAlias(): -{ - Table table = null; - Alias alias = null; -} -{ - table=Table() [alias=Alias() { table.setAlias(alias); }] - { return table; } -} - -Select Select(): -{ - Select select = new Select(); - SelectBody selectBody = null; - List with = null; -} -{ - [ with=WithList() { } ] selectBody = SelectBody() - { - select.setWithItemsList(with); - select.setSelectBody(selectBody); - return select; - } -} - -SelectBody SelectBody(): -{ SelectBody selectBody = null; } -{ - selectBody = SetOperationList() - { return selectBody; } -} - -PlainSelect PlainSelect() #PlainSelect: -{ - PlainSelect plainSelect = new PlainSelect(); - List selectItems = null; - FromItem fromItem = null; - List joins = null; - List distinctOn = null; - Expression where = null; - List orderByElements; - List groupByColumnReferences = null; - Expression having = null; - Limit limit = null; - Offset offset = null; - Fetch fetch = null; - Top top = null; - Skip skip = null; - First first = null; - OracleHierarchicalExpression oracleHierarchicalQueryClause = null; - List
intoTables = null; - Table updateTable = null; - Wait wait = null; - boolean mySqlSqlCalcFoundRows = false; -} -{ - - - { plainSelect.setOracleHint(getOracleHint()); } - - [skip = Skip() { plainSelect.setSkip(skip); } ] - - [LOOKAHEAD(2) first = First() { plainSelect.setFirst(first); } ] - - [ - - | - ( - { Distinct distinct = new Distinct(); plainSelect.setDistinct(distinct); } - [ "ON" "(" distinctOn=SelectItemsList() { plainSelect.getDistinct().setOnSelectItems(distinctOn); } ")" ] - ) - | - ( - { Distinct distinct = new Distinct(true); plainSelect.setDistinct(distinct); } - ) - | - ( - { plainSelect.setMySqlSqlCalcFoundRows(true); } - ) - ] - - [top = Top() { plainSelect.setTop(top); } ] - - selectItems=SelectItemsList() - - [intoTables = IntoClause() { plainSelect.setIntoTables(intoTables); } ] - [ - fromItem=FromItem() - joins=JoinsList() ] - - [ where=WhereClause() { plainSelect.setWhere(where); }] - [ oracleHierarchicalQueryClause=OracleHierarchicalQueryClause() { plainSelect.setOracleHierarchical(oracleHierarchicalQueryClause); } ] - [ groupByColumnReferences=GroupByColumnReferences() { plainSelect.setGroupByColumnReferences(groupByColumnReferences); }] - [ having=Having() { plainSelect.setHaving(having); }] - [LOOKAHEAD( ) orderByElements = OrderByElements() { plainSelect.setOracleSiblings(true); plainSelect.setOrderByElements(orderByElements); } ] - [LOOKAHEAD( ) orderByElements = OrderByElements() { plainSelect.setOrderByElements(orderByElements); } ] - [LOOKAHEAD() limit = LimitWithOffset() { plainSelect.setLimit(limit); } ] - [LOOKAHEAD() offset = Offset() { plainSelect.setOffset(offset); } ] - [LOOKAHEAD() fetch = Fetch() { plainSelect.setFetch(fetch); } ] - - [ { plainSelect.setForUpdate(true); } - [ updateTable = Table() { plainSelect.setForUpdateTable(updateTable); } ] - [ LOOKAHEAD() wait = Wait() { plainSelect.setWait(wait); } ] ] - - { - plainSelect.setSelectItems(selectItems); - plainSelect.setFromItem(fromItem); - if (joins != null && joins.size() > 0) - plainSelect.setJoins(joins); - linkAST(plainSelect,jjtThis); - return plainSelect; - } -} - -SelectBody SetOperationList() #SetOperationList: -{ - SetOperationList list = new SetOperationList(); - List orderByElements = null; - Limit limit = null; - Offset offset = null; - Fetch fetch = null; - SelectBody select = null; - List selects = new ArrayList(); - List operations = new ArrayList(); - List brackets = new ArrayList(); - boolean bracket; -} -{ - ( - - ( - (("(" select=SelectBody() ")" { bracket=true;} ) - | select=PlainSelect() { bracket=false;} ) {selects.add(select);brackets.add(bracket); } - ( - (( { UnionOp union = new UnionOp();linkAST(union,jjtThis);operations.add(union); } [ { union.setAll(true); } | { union.setDistinct(true); } ]) - | { operations.add(new IntersectOp()); } - | { operations.add(new MinusOp()); } - | { operations.add(new ExceptOp()); } - ) - - (("(" select=SelectBody() ")" { bracket=true;} ) | select=PlainSelect() { bracket=false;} ) {selects.add(select);brackets.add(bracket);} - )* - ) - - [orderByElements=OrderByElements() {list.setOrderByElements(orderByElements);} ] - [LOOKAHEAD() limit=LimitWithOffset() {list.setLimit(limit);} ] - [LOOKAHEAD() offset = Offset() { list.setOffset(offset);} ] - [LOOKAHEAD() fetch = Fetch() { list.setFetch(fetch);} ] - ) - - { - if (selects.size()==1 && selects.get(0) instanceof PlainSelect) { - if (brackets.get(0)) - ((PlainSelect)selects.get(0)).setUseBrackets(true); - return selects.get(0); - } else { - list.setBracketsOpsAndSelects(brackets,selects,operations); - return list; - } - } -} - -List WithList(): -{ - List withItemsList = new ArrayList(); - WithItem with = null; -} -{ - with=WithItem() { withItemsList.add(with); } ("," with=WithItem() { withItemsList.add(with); } )* - - { return withItemsList; } -} - -WithItem WithItem() #WithItem: -{ - WithItem with = new WithItem(); - String name = null; - List selectItems = null; - SelectBody selectBody = null; -} -{ - [ { with.setRecursive(true); } ] name=RelObjectName() { with.setName(name); } - [ "(" selectItems=SelectItemsList() ")" { with.setWithItemList(selectItems); } ] - - "(" selectBody = SelectBody() { with.setSelectBody(selectBody); } ")" - { return with; } -} - -List SelectItemsList(): -{ - List selectItemsList = new ArrayList(); - SelectItem selectItem = null; -} -{ - selectItem=SelectItem() { selectItemsList.add(selectItem); } ("," selectItem=SelectItem() { selectItemsList.add(selectItem); } )* - - { return selectItemsList; } -} - -SelectExpressionItem SelectExpressionItem(): -{ - SelectExpressionItem selectExpressionItem = null; - Expression expression = null; - Alias alias = null; -} -{ - expression=SimpleExpression() { selectExpressionItem = new SelectExpressionItem(); selectExpressionItem.setExpression(expression); } - [alias=Alias() { selectExpressionItem.setAlias(alias); }] { return selectExpressionItem; } -} - -SelectItem SelectItem() #SelectItem: -{ - SelectItem selectItem = null; -} -{ ("*" { selectItem = new AllColumns(); } - | - LOOKAHEAD(AllTableColumns()) selectItem=AllTableColumns() - | - selectItem=SelectExpressionItem() - ) - { - linkAST(selectItem,jjtThis); - return selectItem; - } -} - -AllTableColumns AllTableColumns(): -{ - Table table = null; -} -{ - table=Table() "." "*" - { - return new AllTableColumns(table); - } - -} - -Alias Alias(): -{ String name = null; - Token token = null; - boolean useAs = false; } -{ - [ { useAs = true; } ] - ( name=RelObjectName() | token= { name=token.image; } ) - { return new Alias(name,useAs); } -} - -MySQLIndexHint MySQLIndexHint(): -{ - Token actionToken = null; - Token indexToken = null; - String indexName = null; - List indexNameList = new ArrayList(); -} -{ - (actionToken = - | actionToken = - | actionToken = ) - (indexToken = - | indexToken = ) - "(" - indexName = Identifier() { indexNameList.add(indexName); } - ("," indexName= Identifier() { indexNameList.add(indexName); })* - ")" - { - return new MySQLIndexHint(actionToken.image, indexToken.image, indexNameList); - } -} - -String Identifier(): -{ - Token tk = null; -} -{ - (tk= - | tk=) - { return tk.image; } -} - -FunctionItem FunctionItem(): -{ - Alias alias = null; - Function function; - FunctionItem functionItem; -} -{ - function=Function() { functionItem = new FunctionItem(); functionItem.setFunction(function); } - [alias=Alias() { functionItem.setAlias(alias); }] - { return functionItem; } -} - -List PivotForColumns(): -{ - List columns = new ArrayList(); - Column column; -} -{ - ( - ("(" column = Column() { columns.add(column); } - ("," column = Column() { columns.add(column); } )* - ")") - | column = Column() { columns.add(column); } - ) - { return columns; } -} - -List PivotFunctionItems(): -{ - List functionItems = new ArrayList(); - FunctionItem item; -} -{ - item = FunctionItem() {functionItems.add(item);} - ( "," item = FunctionItem() {functionItems.add(item);} )* - { return functionItems; } -} - -List PivotSingleInItems(): -{ - List retval = new ArrayList(); - SelectExpressionItem item; -} -{ - item = SelectExpressionItem() {retval.add(item);} - ("," item = SelectExpressionItem() {retval.add(item);} )* - { return retval; } -} - -ExpressionListItem ExpressionListItem(): -{ - ExpressionListItem expressionListItem = null; - ExpressionList expressionList = null; - Alias alias = null; -} -{ - "(" - expressionList=SimpleExpressionList() { expressionListItem = new ExpressionListItem(); expressionListItem.setExpressionList(expressionList); } - ")" - [alias=Alias() { expressionListItem.setAlias(alias); }] - { return expressionListItem; } -} - -List PivotMultiInItems(): -{ - List retval = new ArrayList(); - ExpressionListItem item; -} -{ - item = ExpressionListItem() {retval.add(item);} - ("," item = ExpressionListItem() {retval.add(item);} )* - { return retval; } -} - -Pivot Pivot(): -{ - Pivot retval = new Pivot(); - List functionItems; - List forColumns; - List singleInItems = null; - List multiInItems = null; - Alias alias = null; -} -{ - "(" functionItems = PivotFunctionItems() - forColumns = PivotForColumns() - "(" - (LOOKAHEAD(3) singleInItems = PivotSingleInItems() - | multiInItems = PivotMultiInItems() ) - ")" - ")" - [ alias = Alias() ] - { - retval.setFunctionItems(functionItems); - retval.setForColumns(forColumns); - retval.setSingleInItems(singleInItems); - retval.setMultiInItems(multiInItems); - retval.setAlias(alias); - return retval; - } -} - -PivotXml PivotXml(): -{ - PivotXml retval = new PivotXml(); - List functionItems; - List forColumns; - List singleInItems = null; - List multiInItems = null; - SelectBody inSelect = null; -} -{ - "(" functionItems = PivotFunctionItems() - forColumns = PivotForColumns() - "(" - ( - LOOKAHEAD(2) { retval.setInAny(true); } | - LOOKAHEAD(1) inSelect = SelectBody() | - LOOKAHEAD(2) singleInItems = PivotSingleInItems() | - multiInItems = PivotMultiInItems() - ) - ")" - ")" - { - retval.setFunctionItems(functionItems); - retval.setForColumns(forColumns); - retval.setSingleInItems(singleInItems); - retval.setMultiInItems(multiInItems); - retval.setInSelect(inSelect); - return retval; - } -} - -List
IntoClause(): -{ - List
tables = new ArrayList
(); - Table table; -} -{ - table=Table() { tables.add(table); } ("," table=Table() { tables.add(table); } )* - { - return tables; - } -} - -FromItem FromItem(): -{ - FromItem fromItem = null; - Pivot pivot = null; - Alias alias = null; - MySQLIndexHint indexHint = null; -} -{ - ( - LOOKAHEAD(ValuesList()) fromItem=ValuesList() - | - ( - ( - ( - "(" - ( - LOOKAHEAD(SubJoin()) - fromItem=SubJoin() - | - LOOKAHEAD(3) - fromItem=SubSelect() - | - fromItem=FromItem() - { fromItem = new ParenthesisFromItem(fromItem); } - ) - ")" - ) - | - LOOKAHEAD(TableFunction()) - fromItem=TableFunction() - | - fromItem=Table() - | - fromItem=LateralSubSelect() - ) - [ alias=Alias() { fromItem.setAlias(alias); } ] - [(LOOKAHEAD(2) pivot=PivotXml()|pivot=Pivot()) { fromItem.setPivot(pivot); } ] - [ - LOOKAHEAD(2) - indexHint=MySQLIndexHint() { - if (fromItem instanceof Table) - ((Table) fromItem).setHint(indexHint); - } - ] - ) - ) - { - return fromItem; - } -} - -FromItem ValuesList(): -{ - MultiExpressionList exprList = new MultiExpressionList(); - List primaryExpList = new ArrayList(); - ValuesList valuesList = new ValuesList(); - Expression exp = null; - List colNames = null; - String colName; - Alias alias; -} -{ - "(" - - (LOOKAHEAD(3) ("(" exp=SimpleExpression() { primaryExpList.add(exp); } - ("," exp=SimpleExpression() { primaryExpList.add(exp); } )* ")" { exprList.addExpressionList(primaryExpList); } - - ("," "(" exp=SimpleExpression() { - primaryExpList = new ArrayList(); - primaryExpList.add(exp); } - ("," exp=SimpleExpression() { primaryExpList.add(exp); } )* ")" { exprList.addExpressionList(primaryExpList); } )*) - | - ( exp=SimpleExpression() { exprList.addExpressionList(exp); valuesList.setNoBrackets(true); } - ("," exp=SimpleExpression() { exprList.addExpressionList(exp);} )* - )) - ")" - - [ alias=Alias() { valuesList.setAlias(alias); } - - [ "(" - colName = RelObjectName() { colNames = new ArrayList(); colNames.add(colName); } - ( "," colName = RelObjectName() { colNames.add(colName); } )* - ")" { valuesList.setColumnNames(colNames); } ] - - ] - - { - valuesList.setMultiExpressionList(exprList); - return valuesList; - } -} - -LateralSubSelect LateralSubSelect(): -{ - LateralSubSelect lateralSubSelect = new LateralSubSelect(); - SubSelect subSelect = null; -} -{ - - "(" subSelect=SubSelect() ")" - { - lateralSubSelect.setSubSelect(subSelect); - return lateralSubSelect; - } -} - -FromItem SubJoin(): -{ - FromItem fromItem = null; - Join join = null; - List joinList = null; - SubJoin subJoin = new SubJoin(); -} -{ - fromItem=FromItem() { subJoin.setLeft(fromItem); } - joinList=SubJoinsList() { subJoin.setJoinList(joinList); } - { - return subJoin; - } -} - -List JoinsList(): -{ - List joinsList = new ArrayList(); - Join join = null; -} -{ - (join=JoinerExpression() { joinsList.add(join); })* - { return joinsList; } -} - -List SubJoinsList(): -{ - List joinsList = new ArrayList(); - Join join = null; -} -{ - - (join=JoinerExpression() { joinsList.add(join); })+ - - { return joinsList; } -} - - -Join JoinerExpression() #JoinerExpression: -{ - Join join = new Join(); - FromItem right = null; - Expression onExpression = null; - Column tableColumn; - List columns = null; -} -{ - [ - { join.setLeft(true); } [ { join.setSemi(true); } | { join.setOuter(true); } ] - | ( { join.setRight(true); } - | { join.setFull(true); } - ) [ { join.setOuter(true); } ] - | { join.setInner(true); } - | { join.setNatural(true); } - | { join.setCross(true); } - ] - - ( | "," { join.setSimple(true); } ) - - right=FromItem() - - - [ - LOOKAHEAD(2) (( onExpression=Expression() { join.setOnExpression(onExpression); } ) - | - ( "(" tableColumn=Column() { columns = new ArrayList(); columns.add(tableColumn); } - ("," tableColumn=Column() { columns.add(tableColumn); } )* ")" - { join.setUsingColumns(columns); } )) - ] - { - linkAST(join,jjtThis); - join.setRightItem(right); - return join; - } -} - -Expression WhereClause(): -{ - Expression retval = null; -} -{ - retval=Expression() - { return retval; } -} - -OracleHierarchicalExpression OracleHierarchicalQueryClause(): -{ - OracleHierarchicalExpression result = new OracleHierarchicalExpression(); - Expression expr; -} -{ - ( - expr=AndExpression() {result.setStartExpression(expr);} - [ { result.setNoCycle(true); } ] expr=AndExpression() - { result.setConnectExpression(expr); } - | - [ { result.setNoCycle(true); } ] expr=AndExpression() - { - result.setConnectExpression(expr); - result.setConnectFirst(true); - } - [ expr=AndExpression() {result.setStartExpression(expr);} ] - ) - { - return result; - } -} - -List GroupByColumnReferences(): -{ - Expression columnReference = null; - List columnReferences = new ArrayList(); -} -{ - columnReference=SimpleExpression() {columnReferences.add(columnReference); } - ("," columnReference=SimpleExpression() {columnReferences.add(columnReference); } )* - { - return columnReferences; - } -} - -Expression Having(): -{ - Expression having = null; -} -{ - having=Expression() - { - return having; - } -} - -List OrderByElements(): -{ - List orderByList = new ArrayList(); - OrderByElement orderByElement = null; -} -{ - [ ] orderByElement=OrderByElement() { orderByList.add(orderByElement); } - ("," orderByElement=OrderByElement() { orderByList.add(orderByElement); } )* - { - return orderByList; - } -} - -OrderByElement OrderByElement(): -{ - OrderByElement orderByElement = new OrderByElement(); - Expression columnReference = null; -} -{ - columnReference = SimpleExpression() - [ ( | ( { orderByElement.setAsc(false); } )) { orderByElement.setAscDescPresent(true); } ] - [ ( - { orderByElement.setNullOrdering(OrderByElement.NullOrdering.NULLS_FIRST); } | - { orderByElement.setNullOrdering(OrderByElement.NullOrdering.NULLS_LAST); } - )? - ] - { - orderByElement.setExpression(columnReference); - return orderByElement; - } -} - -JdbcParameter SimpleJdbcParameter() : { - JdbcParameter retval; -} -{ - "?" { retval = new JdbcParameter(++jdbcParameterIndex, false); } - [ LOOKAHEAD(2) token = { retval.setUseFixedIndex(true); retval.setIndex(Integer.valueOf(token.image)); } ] - { - return retval; - } -} - -JdbcNamedParameter SimpleJdbcNamedParameter() : { - Token token; -} -{ - ":" token = - { - return new JdbcNamedParameter(token.image); - } -} - -Limit LimitWithOffset() #LimitWithOffset: -{ - Limit limit = new Limit(); - Token token = null; - JdbcParameter jdbc = null; -} -{ - ( - LOOKAHEAD(5) - // mysql-> LIMIT offset,row_count - - ( - token= { limit.setOffset(new LongValue(token.image)); } - | - jdbc = SimpleJdbcParameter() { limit.setOffset(jdbc); } - | - ":" { limit.setOffset(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = { ((JdbcNamedParameter)limit.getOffset()).setName(token.image); } ] - - ) - "," - - ( - token= { limit.setRowCount(new LongValue(token.image)); } - | - jdbc = SimpleJdbcParameter() { limit.setRowCount(jdbc); } - | - ":" { limit.setRowCount(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = { ((JdbcNamedParameter)limit.getRowCount()).setName(token.image); } ] - ) - | - limit = PlainLimit() - ) - { - linkAST(limit,jjtThis); - return limit; - } -} - -Limit PlainLimit() #PlainLimit: -{ - Limit limit = new Limit(); - Token token = null; - JdbcParameter jdbc; -} -{ - // mysql-postgresql-> LIMIT (row_count | ALL | NULL) - - ( - token= { limit.setRowCount(new LongValue(token.image)); } - | - jdbc = SimpleJdbcParameter() { limit.setRowCount(jdbc); } - | - ":" { limit.setRowCount(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = { ((JdbcNamedParameter)limit.getRowCount()).setName(token.image); } ] - | - { limit.setLimitAll(true);} - | - { limit.setLimitNull(true); } - ) - { - linkAST(limit,jjtThis); - return limit; - } -} - -Offset Offset(): -{ - Offset offset = new Offset(); - Token token = null; - JdbcParameter jdbc; - JdbcNamedParameter jdbcNamed; -} -{ - ( - // postgresql-> OFFSET offset - // sqlserver-oracle-> OFFSET offset (ROW | ROWS) - - (token= { offset.setOffset(Long.parseLong(token.image)); } - | jdbc = SimpleJdbcParameter() { offset.setOffsetJdbcParameter(jdbc); } - | jdbcNamed = SimpleJdbcNamedParameter() { offset.setOffsetJdbcParameter(jdbcNamed); }) - [( { offset.setOffsetParam("ROWS"); } | { offset.setOffsetParam("ROW"); })] - - ) - { - return offset; - } -} - -Fetch Fetch(): -{ - Fetch fetch = new Fetch(); - Token token = null; - JdbcParameter jdbc; -} -{ - ( - // sqlserver-oracle-> FETCH (FIRST | NEXT) row_count (ROW | ROWS) ONLY - - ( { fetch.setFetchParamFirst(true); } | ) - (token= { fetch.setRowCount(Long.parseLong(token.image)); } - | jdbc = SimpleJdbcParameter() { fetch.setFetchJdbcParameter(jdbc); } ) /* "?" { fetch.setFetchJdbcParameter(true); } ) */ - ( { fetch.setFetchParam("ROWS"); } | ) - - - ) - { - return fetch; - } -} - -// according to http://technet.microsoft.com/en-us/library/ms189463.aspx -Top Top(): -{ - Top top = new Top(); - Token token = null; - Expression expr = null; - JdbcParameter jdbc = null; -} -{ - - ( - token= { top.setExpression(new LongValue(token.image)); } - | - jdbc = SimpleJdbcParameter() { top.setExpression(jdbc); } - /*"?" { top.setExpression(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = { ((JdbcParameter)(top.getExpression())).setUseFixedIndex(true); ((JdbcParameter)(top.getExpression())).setIndex(Integer.valueOf(token.image)); } ]*/ - | - ":" { top.setExpression(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = { ((JdbcNamedParameter)top.getExpression()).setName(token.image); } ] - | - "(" - expr=AdditiveExpression() { top.setExpression(expr); } - { top.setParenthesis(true);} - ")" - ) [ LOOKAHEAD(2) { top.setPercentage(true); } ] - { - return top; - } -} - -// according to http://www-01.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.sqls.doc/ids_sqs_0156.htm -Skip Skip(): -{ - Skip skip = new Skip(); - Token token = null; - JdbcParameter jdbc; -} -{ - - ( - token= { skip.setRowCount(Long.parseLong(token.image)); } - | token= { skip.setVariable(token.image); } - | jdbc = SimpleJdbcParameter() { skip.setJdbcParameter(jdbc); } - /* "?" { skip.setJdbcParameter(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = { skip.getJdbcParameter().setUseFixedIndex(true); skip.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ] */ - ) - { - return skip; - } -} - -JAVACODE -OracleHint getOracleHint() { - OracleHint hint = null; - Token tok = getToken(1); - // Retrieve first comment (if any) prior next token - if (tok.specialToken != null) { - tok = tok.specialToken; - while (tok.specialToken != null) tok = tok.specialToken; - // Check if it matches Hint pattern? - if (OracleHint.isHintMatch(tok.image)) { - hint = new OracleHint(); - hint.setComment(tok.image); - } - } - return hint; -} - -First First(): -{ - First first = new First(); - Token token = null; - JdbcParameter jdbc; -} -{ - ( { first.setKeyword(First.Keyword.FIRST); } - | { first.setKeyword(First.Keyword.LIMIT); } - ) - ( - token= { first.setRowCount(Long.parseLong(token.image)); } - | token= { first.setVariable(token.image); } - | jdbc = SimpleJdbcParameter() { first.setJdbcParameter(jdbc); } - /* "?" { first.setJdbcParameter(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = { first.getJdbcParameter().setUseFixedIndex(true); first.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ] */ - ) - { - return first; - } -} - - -Expression Expression() #Expression : -{ - Expression retval = null; -} -{ - retval=OrExpression() - - { return retval; } -} - -Expression OrExpression(): -{ - Expression left, right, result; -} -{ - left=AndExpression() { result = left; } - ( - LOOKAHEAD() - - right=AndExpression() - { - result = new OrExpression(left, right); - left = result; - } - )* - { - return result; - } - -} - -Expression AndExpression() : -{ - Expression left, right, result; - boolean not = false; -} -{ - ( - LOOKAHEAD(Condition()) - left=Condition() - | - [ { not = true; } ] - "(" left=OrExpression() ")" {left = new Parenthesis(left); if (not) { ((Parenthesis)left).setNot(); not = false; } } - ) - { result = left; } - - ( - - ( - LOOKAHEAD(Condition()) - right=Condition() - | - [ { not = true; } ] - "(" right=OrExpression() ")" {right = new Parenthesis(right); if (not) { ((Parenthesis)right).setNot(); not = false; } } - ) - { - result = new AndExpression(left, right); - left = result; - } - )* - { - return result; - } -} - -Expression Condition(): -{ - Expression result; - Token token; -} -{ - (LOOKAHEAD(SQLCondition()) result=SQLCondition() - | LOOKAHEAD(RegularCondition()) result=RegularCondition() - | LOOKAHEAD(Function()) result=Function() - | result=Column() { result = new NotExpression(result); } - | result=Column() - | LOOKAHEAD({ "0".equals(getToken(1).image) || "1".equals(getToken(1).image) }) token= { result = new LongValue(token.image); } - ) - - { return result; } -} - -Expression RegularCondition() #RegularCondition: -{ - Expression result = null; - Expression leftExpression; - Expression rightExpression; - boolean not = false; - int oracleJoin=EqualsTo.NO_ORACLE_JOIN; - int oraclePrior=EqualsTo.NO_ORACLE_PRIOR; - boolean binary = false; -} -{ - [ LOOKAHEAD(2) { oraclePrior = EqualsTo.ORACLE_PRIOR_START; }] - [ { not = true; } ] - leftExpression=ComparisonItem() { result = leftExpression; } - - [ "(" "+" ")" { oracleJoin=EqualsTo.ORACLE_JOIN_RIGHT; } ] - - ( LOOKAHEAD(2) - ">" { result = new GreaterThan(); } - | "<" { result = new MinorThan(); } - | "=" { result = new EqualsTo(); } - | token= { result = new GreaterThanEquals(token.image); } - | token= { result = new MinorThanEquals(token.image); } - | token= { result = new NotEqualsTo(token.image); } - | token= { result = new NotEqualsTo(token.image); } - | "@@" { result = new Matches(); } - | "~" { result = new RegExpMatchOperator(RegExpMatchOperatorType.MATCH_CASESENSITIVE); } - | [ { binary=true; } ] { result = new RegExpMySQLOperator(binary?RegExpMatchOperatorType.MATCH_CASESENSITIVE:RegExpMatchOperatorType.MATCH_CASEINSENSITIVE); } - | [ { binary=true; } ] { result = new RegExpMySQLOperator(binary?RegExpMatchOperatorType.MATCH_CASESENSITIVE:RegExpMatchOperatorType.MATCH_CASEINSENSITIVE).useRLike(); } - | "~*" { result = new RegExpMatchOperator(RegExpMatchOperatorType.MATCH_CASEINSENSITIVE); } - | "!~" { result = new RegExpMatchOperator(RegExpMatchOperatorType.NOT_MATCH_CASESENSITIVE); } - | "!~*" { result = new RegExpMatchOperator(RegExpMatchOperatorType.NOT_MATCH_CASEINSENSITIVE); } - - | "@>" { result = new JsonOperator("@>"); } - | "<@" { result = new JsonOperator("<@"); } - | "?" { result = new JsonOperator("?"); } - | "?|" { result = new JsonOperator("?|"); } - | "?&" { result = new JsonOperator("?&"); } - | { result = new JsonOperator("||"); } - | "-" { result = new JsonOperator("-"); } - | "-#" { result = new JsonOperator("-#"); } - ) - - ( LOOKAHEAD(2) rightExpression=ComparisonItem() { oraclePrior = EqualsTo.ORACLE_PRIOR_END; } - | rightExpression=ComparisonItem() ) - - [ "(" "+" ")" { oracleJoin=EqualsTo.ORACLE_JOIN_LEFT; } ] - - { - BinaryExpression regCond = (BinaryExpression) result; - regCond.setLeftExpression(leftExpression); - regCond.setRightExpression(rightExpression); - if (not) - regCond.setNot(); - - if (oracleJoin>0) - ((SupportsOldOracleJoinSyntax)result).setOldOracleJoinSyntax(oracleJoin); - - if (oraclePrior!=EqualsTo.NO_ORACLE_PRIOR) - ((SupportsOldOracleJoinSyntax)result).setOraclePriorPosition(oraclePrior); - } - - { - linkAST(result,jjtThis); - return result; - } -} - -Expression SQLCondition(): -{ - Expression result; -} -{ - ( - LOOKAHEAD(InExpression()) result=InExpression() - | LOOKAHEAD(Between()) result=Between() - | LOOKAHEAD(IsNullExpression()) result=IsNullExpression() - | LOOKAHEAD(ExistsExpression()) result=ExistsExpression() - | result=LikeExpression() - ) - { return result; } -} - -Expression InExpression() : -{ - InExpression result = new InExpression(); - ItemsList leftItemsList = null; - ItemsList rightItemsList = null; - Expression leftExpression = null; -} -{ - ( LOOKAHEAD(3) "(" ( - LOOKAHEAD(SimpleExpressionList()) leftItemsList = SimpleExpressionList() { result.setLeftItemsList(leftItemsList); } - | - leftExpression=SimpleExpression() - [ "(" "+" ")" { result.setOldOracleJoinSyntax(EqualsTo.ORACLE_JOIN_RIGHT); } ] - ) - ")" - | - leftExpression=SimpleExpression() { result.setLeftExpression(leftExpression); } - [ "(" "+" ")" { result.setOldOracleJoinSyntax(EqualsTo.ORACLE_JOIN_RIGHT); } ] - ) - [ { result.setNot(true); } ] "(" (LOOKAHEAD(3) rightItemsList=SubSelect() | rightItemsList=SimpleExpressionList() ) ")" - { - result.setRightItemsList(rightItemsList); - return result; - } -} - -Expression Between() : -{ - Between result = new Between(); - Expression leftExpression = null; - Expression betweenExpressionStart = null; - Expression betweenExpressionEnd = null; -} -{ - leftExpression=SimpleExpression() - [ { result.setNot(true); }] - betweenExpressionStart=SimpleExpression() betweenExpressionEnd=SimpleExpression() - - { - result.setLeftExpression(leftExpression); - result.setBetweenExpressionStart(betweenExpressionStart); - result.setBetweenExpressionEnd(betweenExpressionEnd); - return result; - } -} - -Expression LikeExpression() #LikeExpression: -{ - LikeExpression result = new LikeExpression(); - Expression leftExpression = null; - Expression rightExpression = null; -} -{ - ( - LOOKAHEAD(3) ( - leftExpression=SimpleExpression() - [ { result.setNot(true); } ] ( | { result.setCaseInsensitive(true); } ) rightExpression=SimpleExpression() - [ token= { result.setEscape((new StringValue(token.image)).getValue()); }] - ) - | - ( - [ { result.setNot(true); } ] leftExpression=SimpleExpression() ( | { result.setCaseInsensitive(true); } ) rightExpression=SimpleExpression() - [ token= { result.setEscape((new StringValue(token.image)).getValue()); }] - ) - ) - { - result.setLeftExpression(leftExpression); - result.setRightExpression(rightExpression); - linkAST(result,jjtThis); - return result; - } -} - -Expression IsNullExpression(): -{ - IsNullExpression result = new IsNullExpression(); - Expression leftExpression = null; -} -{ - ( - { result.setNot(true); } leftExpression=SimpleExpression() - ( { result.setUseIsNull(true); } | ) - | - leftExpression=SimpleExpression() - ( { result.setUseIsNull(true); } | [ { result.setNot(true); } ] ) - ) - - { - result.setLeftExpression(leftExpression); - return result; - } -} - -Expression ExistsExpression(): -{ - ExistsExpression result = new ExistsExpression(); - Expression rightExpression = null; -} -{ - [ { result.setNot(true); } ] rightExpression=SimpleExpression() - { - result.setRightExpression(rightExpression); - return result; - } -} - -ExpressionList SQLExpressionList(): -{ - ExpressionList retval = new ExpressionList(); - List expressions = new ArrayList(); - Expression expr = null; -} -{ - expr=Expression() { expressions.add(expr); } ("," expr=Expression() { expressions.add(expr); })* - { - retval.setExpressions(expressions); - return retval; - } -} - -ExpressionList SimpleExpressionList(): -{ - ExpressionList retval = new ExpressionList(); - List expressions = new ArrayList(); - Expression expr = null; -} -{ - expr=SimpleExpression() { expressions.add(expr); } ("," expr=SimpleExpression() { expressions.add(expr); })* - { - retval.setExpressions(expressions); - return retval; - } -} - -ExpressionList SimpleExpressionListAtLeastTwoItems(): -{ - ExpressionList retval = new ExpressionList(); - List expressions = new ArrayList(); - Expression expr = null; -} -{ - expr=SimpleExpression() { expressions.add(expr); } ("," expr=SimpleExpression() { expressions.add(expr); })+ - { - retval.setExpressions(expressions); - return retval; - } -} - -Expression ComparisonItem() : -{ - Expression retval = null; -} -{ - ( - retval=AllComparisonExpression() - | LOOKAHEAD(3) retval=AnyComparisonExpression() - | LOOKAHEAD(ValueListExpression()) retval=ValueListExpression() - | LOOKAHEAD(3) retval=SimpleExpression() - | retval=RowConstructor() - ) - - { - return retval; - } -} - -Expression AllComparisonExpression() : -{ - AllComparisonExpression retval = null; - SubSelect subselect = null; -} -{ - "(" subselect=SubSelect() ")" { retval = new AllComparisonExpression(subselect); } - { - return retval; - } -} - -Expression AnyComparisonExpression() : -{ - AnyComparisonExpression retval = null; - AnyType anyType; - SubSelect subselect = null; -} -{ - ( { anyType = AnyType.ANY; } | { anyType = AnyType.SOME; } ) - "(" subselect=SubSelect() ")" { retval = new AnyComparisonExpression(anyType, subselect); } - { - return retval; - } -} - -Expression SimpleExpression(): -{ - Expression retval = null; -} -{ - ( - retval=ConcatExpression() - ) - - { - return retval; - } -} - -Expression ConcatExpression(): -{ - Expression result = null; - Expression leftExpression = null; - Expression rightExpression = null; -} -{ - leftExpression=BitwiseAndOr() { result = leftExpression; } - (LOOKAHEAD(3) - /* Oracle allows space between the bars. */ - rightExpression=BitwiseAndOr() - { - Concat binExp = new Concat(); - binExp.setLeftExpression(leftExpression); - binExp.setRightExpression(rightExpression); - result = binExp; - leftExpression = result; - } - )* - - { return result; } -} - -Expression BitwiseAndOr(): -{ - Expression result = null; - Expression leftExpression = null; - Expression rightExpression = null; -} -{ - leftExpression=AdditiveExpression() { result = leftExpression; } - ( - ( - "|" { result = new BitwiseOr(); } - | - "&" { result = new BitwiseAnd(); } - | - "<<" { result = new BitwiseLeftShift(); } - | - ">>" { result = new BitwiseRightShift(); } - ) - - rightExpression=AdditiveExpression() - - { - BinaryExpression binExp = (BinaryExpression) result; - binExp.setLeftExpression(leftExpression); - binExp.setRightExpression(rightExpression); - leftExpression = result; - } - )* - - { return result; } -} - -Expression AdditiveExpression(): -{ - Expression result = null; - Expression leftExpression = null; - Expression rightExpression = null; -} -{ - leftExpression=MultiplicativeExpression() { result = leftExpression; } - ( LOOKAHEAD(2) - ("+" { result = new Addition(); } - | "-" { result = new Subtraction(); } ) - - rightExpression=MultiplicativeExpression() - { - BinaryExpression binExp = (BinaryExpression) result; - binExp.setLeftExpression(leftExpression); - binExp.setRightExpression(rightExpression); - leftExpression = result; - } - )* - - { return result; } -} - -Expression MultiplicativeExpression(): -{ - Expression result = null; - Expression leftExpression = null; - Expression rightExpression = null; -} -{ - ( - leftExpression=BitwiseXor() - ) - { result = leftExpression; } - ( - LOOKAHEAD(2) ("*" { result = new Multiplication(); } - | "/" { result = new Division(); } - | "%" { result = new Modulo(); } - ) - - rightExpression=BitwiseXor() - - { - BinaryExpression binExp = (BinaryExpression) result; - binExp.setLeftExpression(leftExpression); - binExp.setRightExpression(rightExpression); - leftExpression = result; - } - )* - { return result; } -} - -Expression BitwiseXor(): -{ - Expression result = null; - Expression leftExpression = null; - Expression rightExpression = null; -} -{ - leftExpression=PrimaryExpression() { result = leftExpression; } - ( - "^" - rightExpression=PrimaryExpression() - { - BitwiseXor binExp = new BitwiseXor(); - binExp.setLeftExpression(leftExpression); - binExp.setRightExpression(rightExpression); - result = binExp; - leftExpression = result; - } - )* - - { return result; } -} - -Expression PrimaryExpression() #PrimaryExpression: -{ - Expression retval = null; - CastExpression castExpr = null; - Token token = null; - Token sign = null; - String tmp = ""; - ColDataType type = null; -} -{ -[sign="+" | sign="-" | sign="~"] -( - { retval = new NullValue(); } - - | retval=CaseWhenExpression() - - | retval = SimpleJdbcParameter() - - | LOOKAHEAD(2) retval=JdbcNamedParameter() - - | retval=UserVariable() - - | LOOKAHEAD(2) retval=NumericBind() - - | LOOKAHEAD(AnalyticExpression()) retval=AnalyticExpression() - - | LOOKAHEAD(3) retval=ExtractExpression() - - | retval=MySQLGroupConcat() - - | LOOKAHEAD(JsonExpression()) retval=JsonExpression() - - | LOOKAHEAD(Function()) retval=Function() - - | token= { retval = new DoubleValue(token.image); } - - | token= { retval = new LongValue(token.image); } - - | token= { retval = new HexValue(token.image); } - - | LOOKAHEAD(2) retval=CastExpression() - - // support timestamp expressions - | token= { retval = new TimeKeyExpression(token.image); } - - | LOOKAHEAD(2) retval=DateTimeLiteralExpression() - - | retval=Column() - - | LOOKAHEAD("(" SimpleExpression() ")") "(" retval=SimpleExpression() ")" {retval = new Parenthesis(retval); } - - | LOOKAHEAD(3) "(" retval=SubSelect() ")" - - | token= { retval = new StringValue(token.image); linkAST(retval,jjtThis); } - - | "{d" token= "}" { retval = new DateValue(token.image); } - - | "{t" token= "}" { retval = new TimeValue(token.image); } - - | "{ts" token= "}" { retval = new TimestampValue(token.image); } - - | retval = IntervalExpression() -) - - ( "::" type=ColDataType() { - castExpr = new CastExpression(); - castExpr.setUseCastKeyword(false); - castExpr.setLeftExpression(retval); - castExpr.setType(type); - retval=castExpr; - } )* - - { - if (sign != null) { - retval = new SignedExpression(sign.image.charAt(0), retval); - } - return retval; - } -} - -JdbcNamedParameter JdbcNamedParameter() : { - JdbcNamedParameter parameter = new JdbcNamedParameter(); - String name; -} -{ - ":" (name=RelObjectNameExt2() { parameter.setName(name); }) - { - return parameter; - } -} - -UserVariable UserVariable() : { - UserVariable var = new UserVariable(); - String varName; -} -{ - ("@" | "@@" { var.setDoubleAdd(true);} ) - varName=RelObjectNameExt2() - { - var.setName(varName); - return var; - } -} - -NumericBind NumericBind() : { - NumericBind var = new NumericBind(); - Token token; -} -{ - ":" token= - { - var.setBindId(Integer.valueOf(token.image)); - return var; - } -} - -DateTimeLiteralExpression DateTimeLiteralExpression() : { - DateTimeLiteralExpression expr = new DateTimeLiteralExpression(); - Token t; -} { - t= { expr.setType(DateTimeLiteralExpression.DateTime.valueOf(t.image.toUpperCase())); } - - t= { expr.setValue(t.image); return expr; } -} - -JsonExpression JsonExpression() : { - JsonExpression result = new JsonExpression(); - Column column; - Token token; -} -{ - column=Column() ( - "->" token= {result.addIdent(token.image,"->");} | - "->>" token= {result.addIdent(token.image,"->>");} | - "#>" token= {result.addIdent(token.image,"#>");} | - "#>>" token= {result.addIdent(token.image,"#>>");} - )+ - { - result.setColumn(column); - return result; - } -} - -IntervalExpression IntervalExpression() : { - IntervalExpression interval = new IntervalExpression(); - Token token; - boolean signed = false; -} -{ - ["-" {signed=true;}] (token= | token= | token=) - { interval.setParameter((signed?"-":"") + token.image); } - [ LOOKAHEAD(2) token = { interval.setIntervalType(token.image); } ] - { - return interval; - } -} - -KeepExpression KeepExpression() : { - KeepExpression keep = new KeepExpression(); - Token token; - List list; -} -{ - "(" token = ( { keep.setFirst(true); } | { keep.setFirst(false); }) - list = OrderByElements() ")" - - { - keep.setName(token.image); - keep.setOrderByElements(list); - return keep; - } -} - -AnalyticExpression AnalyticExpression() : -{ - AnalyticExpression retval = new AnalyticExpression(); - ExpressionList expressionList = null; - List olist = null; - Token token = null; - Expression expr = null; - Expression offset = null; - Expression defaultValue = null; - WindowElement windowElement = null; - KeepExpression keep = null; - boolean distinct = false; -} -{ - token= { retval.setName(token.image); } - "(" [ - [ {distinct = true;} ] - (expr=SimpleExpression() ["," offset=SimpleExpression() ["," defaultValue=SimpleExpression() ]] | "*" { retval.setAllColumns(true); } ) - ] ")" - - [ keep=KeepExpression() ] - - ( {retval.setType(AnalyticType.OVER);} - | {retval.setType(AnalyticType.WITHIN_GROUP);} ) - - "(" - [ expressionList=SimpleExpressionList() ] - [olist=OrderByElements() [windowElement = WindowElement() ] ] - - { - retval.setDistinct(distinct); - retval.setExpression(expr); - retval.setOffset(offset); - retval.setDefaultValue(defaultValue); - retval.setKeep(keep); - retval.setPartitionExpressionList(expressionList); - retval.setOrderByElements(olist); - retval.setWindowElement(windowElement); - } - ")" - { - return retval; - } -} - -WindowElement WindowElement(): -{ - WindowElement windowElement = new WindowElement(); - WindowRange range = new WindowRange(); - WindowOffset offset = null; -} -{ - ( { windowElement.setType(WindowElement.Type.ROWS); } | { windowElement.setType(WindowElement.Type.RANGE); } ) - ( ( - { windowElement.setRange(range); } - offset = WindowOffset() { range.setStart(offset); } - offset = WindowOffset() { range.setEnd(offset); } - ) - | - offset = WindowOffset() { windowElement.setOffset(offset); } - ) - - { - return windowElement; - } -} - -WindowOffset WindowOffset(): -{ - WindowOffset offset = new WindowOffset(); - Expression expr = null; -} -{ - ( - ( - ( { offset.setType(WindowOffset.Type.PRECEDING); } | - { offset.setType(WindowOffset.Type.FOLLOWING); } ) - ) - | - ( { offset.setType(WindowOffset.Type.CURRENT); } ) - | - ( expr = SimpleExpression() { - offset.setType(WindowOffset.Type.EXPR); - offset.setExpression(expr); - } - ( { offset.setType(WindowOffset.Type.PRECEDING); } | { offset.setType(WindowOffset.Type.FOLLOWING); } ) - ) - ) - - { - return offset; - } -} - -ExtractExpression ExtractExpression() : -{ - ExtractExpression retval = new ExtractExpression(); - Token token = null; - Expression expr = null; -} -{ - - "(" - token= { retval.setName(token.image); } - - expr=SimpleExpression() { retval.setExpression(expr); } - ")" - { - return retval; - } -} - -CastExpression CastExpression(): -{ - CastExpression retval = new CastExpression(); - ColDataType type = null; - Expression expression = null; - boolean useCastKeyword; -} -{ - "(" expression=SimpleExpression() type=ColDataType() ")" { retval.setUseCastKeyword(true); } - - { - retval.setLeftExpression(expression); - retval.setType(type); - return retval; - } -} - -Expression CaseWhenExpression() #CaseWhenExpression: -{ - CaseExpression caseExp = new CaseExpression(); - Expression switchExp = null; - WhenClause clause; - List whenClauses = new ArrayList(); - Expression elseExp = null; -} -{ - - ( - ( clause=WhenThenSearchCondition() { whenClauses.add(clause); } )+ - | - (LOOKAHEAD(RegularCondition()) switchExp=RegularCondition() | switchExp=BitwiseAndOr()) - ( clause=WhenThenValue() { whenClauses.add(clause); } )+ - ) - [ elseExp=SimpleExpression()] - - { - caseExp.setSwitchExpression(switchExp); - caseExp.setWhenClauses(whenClauses); - caseExp.setElseExpression(elseExp); - return caseExp; - } -} - -WhenClause WhenThenSearchCondition(): -{ - WhenClause whenThen = new WhenClause(); - Expression whenExp = null; - Expression thenExp = null; -} -{ - (LOOKAHEAD(Expression()) whenExp=Expression() | whenExp=SimpleExpression()) thenExp=SimpleExpression() - { - whenThen.setWhenExpression(whenExp); - whenThen.setThenExpression(thenExp); - return whenThen; - } -} - -WhenClause WhenThenValue(): -{ - WhenClause whenThen = new WhenClause(); - Expression whenExp = null; - Expression thenExp = null; -} -{ - whenExp=SimpleExpression() thenExp=SimpleExpression() - { - whenThen.setWhenExpression(whenExp); - whenThen.setThenExpression(thenExp); - return whenThen; - } -} - -RowConstructor RowConstructor(): { - ExpressionList list = null; - RowConstructor rowConstructor = new RowConstructor(); -} { - [ { rowConstructor.setName("ROW");} ] - "(" - list = SimpleExpressionList() - ")" - - { - rowConstructor.setExprList(list); - return rowConstructor; - } -} - -Execute Execute(): { - String funcName = null; - ExpressionList expressionList = null; - Execute execute = new Execute(); -} -{ - ( { execute.setExecType(Execute.EXEC_TYPE.EXEC); } - | { execute.setExecType(Execute.EXEC_TYPE.EXECUTE); } - | { execute.setExecType(Execute.EXEC_TYPE.CALL); } ) - - funcName=RelObjectName() { execute.setName(funcName); } - - [ expressionList=SimpleExpressionList() ] - - { - execute.setExprList(expressionList); - return execute; - } -} - -Function Function() #Function: -{ - Function retval = new Function(); - String funcName = null; - String tmp = null; - ExpressionList expressionList = null; - KeepExpression keep = null; - SubSelect expr = null; -} -{ - ["{fn" { retval.setEscaped(true); } ] - - funcName=RelObjectNameExt() - - [ "." tmp=RelObjectNameExt() { funcName+= "." + tmp; } ["." tmp=RelObjectNameExt() { funcName+= "." + tmp; }]] - "(" [ [ { retval.setDistinct(true); } | { retval.setAllColumns(true); }] (LOOKAHEAD(3) expressionList=SimpleExpressionList() | "*" { retval.setAllColumns(true); } - | expr = SubSelect() { expr.setUseBrackets(false); expressionList = new ExpressionList(expr); } ) ] ")" - - [ "." tmp=RelObjectName() { retval.setAttribute(tmp); }] - - [ keep = KeepExpression() ] - - ["}"] - { - retval.setParameters(expressionList); - retval.setName(funcName); - retval.setKeep(keep); - linkAST(retval,jjtThis); - return retval; - } -} - -MySQLGroupConcat MySQLGroupConcat():{ - MySQLGroupConcat retval = new MySQLGroupConcat(); - ExpressionList expressionList = null; - List orderByList = null; - Token t; -} -{ - "(" - [ { retval.setDistinct(true); } ] - expressionList = SimpleExpressionList() - [ orderByList = OrderByElements() { retval.setOrderByElements(orderByList); } ] - [ t= { retval.setSeparator(t.image); } ] - ")" - { - retval.setExpressionList(expressionList); - return retval; - } -} - -ValueListExpression ValueListExpression(): -{ - ValueListExpression retval = new ValueListExpression(); - ExpressionList expressionList = null; -} -{ - "(" expressionList = SimpleExpressionListAtLeastTwoItems() ")" - { - retval.setExpressionList(expressionList); - return retval; - } -} - -TableFunction TableFunction(): -{ - Alias alias = null; - Function function; - TableFunction functionItem; -} -{ - function=Function() { functionItem = new TableFunction(); functionItem.setFunction(function); } - [LOOKAHEAD(2) alias=Alias() { functionItem.setAlias(alias); }] - { return functionItem; } -} - -SubSelect SubSelect() #SubSelect: -{ - SelectBody selectBody = null; - SubSelect subSelect = new SubSelect(); - List with = null; -} -{ - [ with=WithList() { subSelect.setWithItemsList(with); } ] - selectBody=SelectBody() - { - subSelect.setSelectBody(selectBody); - return subSelect; - } -} - -CreateIndex CreateIndex(): -{ - CreateIndex createIndex = new CreateIndex(); - Table table = null; - List colNames = new ArrayList(); - Token columnName; - Index index = null; - String name = null; - List parameter = new ArrayList(); -} -{ - - ( parameter=CreateParameter() )* - - name=RelObjectName() - { - index = new Index(); - index.setName(name); - index.setType(parameter.isEmpty()?null:parameter.get(0)); - } - - table=Table() - - "(" - (columnName= - | - columnName=) - - (CreateParameter() | | )* - { - colNames.add(columnName.image); - } - - ( - "," - (columnName= - | - columnName=) - - (CreateParameter() | | )* - { - colNames.add(columnName.image); - } - )* - - ")" - (CreateParameter() {})* - - { - index.setColumnsNames(colNames); - createIndex.setIndex(index); - createIndex.setTable(table); - return createIndex; - } -} - -CreateTable CreateTable(): -{ - CreateTable createTable = new CreateTable(); - Table table = null; - List columnDefinitions = new ArrayList(); - List columnSpecs = null; - List tableOptions = new ArrayList(); - List createOptions = new ArrayList(); - String columnName; - Token tk = null; - Token tk2 = null; - Token tk3 = null; - String sk3 = null; - ColDataType colDataType = null; - String stringList = null; - ColumnDefinition coldef = null; - List indexes = new ArrayList(); - List colNames = null; - Index index = null; - ForeignKeyIndex fkIndex = null; - List parameter = new ArrayList(); - List idxSpec = new ArrayList(); - Table fkTable = null; - Select select = null; - CheckConstraint checkCs = null; - ExcludeConstraint excludeC = null; -} -{ - - [ { createTable.setUnlogged(true); } ] - - /* [ [ (tk= | tk=) {createOptions.add(tk.image);} ] - ( tk= | tk= ) {createOptions.add(tk.image);}] */ - - (parameter = CreateParameter() { createOptions.addAll(parameter); })* - - - [ { createTable.setIfNotExists(true); }] - table=Table() - [ - ("(" - columnName=RelObjectName() - - colDataType = ColDataType() - { - columnSpecs = new ArrayList(); - } - - ( parameter=CreateParameter() { columnSpecs.addAll(parameter); } )* - - { - coldef = new ColumnDefinition(); - coldef.setColumnName(columnName); - coldef.setColDataType(colDataType); - if (columnSpecs.size() > 0) - coldef.setColumnSpecStrings(columnSpecs); - columnDefinitions.add(coldef); - } - - ( - "," - - ( - LOOKAHEAD(3) ( - tk= - sk3=RelObjectName() - colNames=ColumnsNamesList() - { - index = new Index(); - index.setType(tk.image); - index.setName(sk3); - index.setColumnsNames(colNames); - indexes.add(index); - } - ) - | - LOOKAHEAD(3) ( - { - index = new NamedConstraint(); - } - [ sk3=RelObjectName() {index.setName(sk3);} ] - - (tk= tk2= {index.setType(tk.image + " " + tk2.image);} - | tk= [ tk2= ] {index.setType(tk.image + (tk2!=null?" " + tk2.image:""));} - ) - colNames=ColumnsNamesList() - ( parameter=CreateParameter() { idxSpec.addAll(parameter); } )* - { - index.setColumnsNames(colNames); - index.setIndexSpec(idxSpec); - indexes.add(index); - } - ) - | - LOOKAHEAD(3) ( {tk=null;} - [ tk= ] [ tk3= ] tk2= - sk3=RelObjectName() - colNames=ColumnsNamesList() - { - index = new Index(); - index.setType((tk!=null?tk.image + " ":"") + (tk3!=null?tk3.image + " ":"") + tk2.image); - index.setName(sk3); - index.setColumnsNames(colNames); - indexes.add(index); - } - ) - | - LOOKAHEAD(3)( - { - fkIndex = new ForeignKeyIndex(); - } - [ sk3=RelObjectName() {fkIndex.setName(sk3);} ] - tk= tk2= - colNames=ColumnsNamesList() - { - fkIndex.setType(tk.image + " " + tk2.image); - fkIndex.setColumnsNames(colNames); - } - fkTable=Table() colNames=ColumnsNamesList() - { - fkIndex.setTable(fkTable); - fkIndex.setReferencedColumnNames(colNames); - indexes.add(fkIndex); - } - [LOOKAHEAD(2) ( - ( {fkIndex.setOnDeleteReferenceOption("CASCADE");} - | - {fkIndex.setOnDeleteReferenceOption("NO ACTION");} - | - {fkIndex.setOnDeleteReferenceOption("SET NULL");} - ))] - [LOOKAHEAD(2) ( ( {fkIndex.setOnUpdateReferenceOption("CASCADE");}| {fkIndex.setOnUpdateReferenceOption("NO ACTION");}))] - ) - | - LOOKAHEAD(3)( - [ sk3 = RelObjectName()] - {Expression exp = null;} - ("(" exp = Expression() ")")* { - checkCs = new CheckConstraint(); - checkCs.setName(sk3); - checkCs.setExpression(exp); - indexes.add(checkCs); - } - ) - | - tk= {excludeC = new ExcludeConstraint(); Expression exp = null;} - (tk2= - ("(" exp = Expression() ")")* {excludeC.setExpression(exp);}) - { - indexes.add(excludeC); - } - | - ( - columnName=RelObjectName() - - colDataType = ColDataType() - { - columnSpecs = new ArrayList(); - } - - ( parameter=CreateParameter() { columnSpecs.addAll(parameter); } )* - - { - coldef = new ColumnDefinition(); - coldef.setColumnName(columnName); - coldef.setColDataType(colDataType); - if (columnSpecs.size() > 0) - coldef.setColumnSpecStrings(columnSpecs); - columnDefinitions.add(coldef); - } - ) - ) - )* - - ")" - ( parameter=CreateParameter() { tableOptions.addAll(parameter); } )* - ) - | - ( - ( LOOKAHEAD("(" Select() ")") "(" select = Select() { createTable.setSelect(select, true); } ")" - | select = Select() { createTable.setSelect(select, false); } ) - ) - ] - - { - createTable.setTable(table); - if (indexes.size() > 0) - createTable.setIndexes(indexes); - if (createOptions.size() > 0) - createTable.setCreateOptionsStrings(createOptions); - if (tableOptions.size() > 0) - createTable.setTableOptionsStrings(tableOptions); - if (columnDefinitions.size() > 0) - createTable.setColumnDefinitions(columnDefinitions); - return createTable; - } -} - -ColDataType ColDataType(): -{ - ColDataType colDataType = new ColDataType(); - Token tk = null; - Token tk2 = null; - ArrayList argumentsStringList = new ArrayList(); - List array = new ArrayList(); -} -{ - ( - (tk= | tk=) [tk2=] { colDataType.setDataType(tk.image + (tk2!=null?" " + tk2.image:"")); } - | tk= [LOOKAHEAD(2) tk2=] { colDataType.setDataType(tk.image + (tk2!=null?" " + tk2.image:"")); } - | ( tk= | tk= | tk= | tk= | tk= ) - { colDataType.setDataType(tk.image); } - | tk= tk2= {colDataType.setDataType(tk.image + " " + tk2.image);} - ) - - [LOOKAHEAD(2) "(" ( (tk= | tk= | tk= ) { argumentsStringList.add(tk.image); } ["," {/*argumentsStringList.add(",");*/}] )* ")"] - [( "[" {tk=null;} [ tk= ] { array.add(tk!=null?Integer.valueOf(tk.image):null); } "]" )+ { colDataType.setArrayData(array); } ] - [ tk= { colDataType.setCharacterSet(tk.image); } ] - - { - if (argumentsStringList.size() > 0) - colDataType.setArgumentsStringList(argumentsStringList); - return colDataType; - } -} - -CreateView CreateView(): -{ - CreateView createView = new CreateView(); - Table view = null; - SelectBody select = null; - List columnNames = null; -} -{ - - [ { createView.setOrReplace(true);} ] - [ - { createView.setForce(ForceOption.NO_FORCE); } - | { createView.setForce(ForceOption.FORCE); } - ] - [ - { createView.setTemporary(TemporaryOption.TEMP); } - | { createView.setTemporary(TemporaryOption.TEMPORARY); } - ] - [ { createView.setMaterialized(true);} ] - view=Table() { createView.setView(view); } - [ columnNames = ColumnsNamesList() { createView.setColumnNames(columnNames); } ] - - select=SelectBody() { createView.setSelectBody(select); } - { return createView; } -} - -AlterView AlterView(): -{ - AlterView alterView = new AlterView(); - Table view = null; - SelectBody select = null; - List columnNames = null; -} -{ - - view=Table() { alterView.setView(view); } - [ columnNames = ColumnsNamesList() { alterView.setColumnNames(columnNames); } ] - - select=SelectBody() { alterView.setSelectBody(select); } - { return alterView; } -} - -List CreateParameter(): -{ - String retval = ""; - Token tk = null; - Token tk2 = null; - StringBuilder identifier = new StringBuilder(""); - Expression exp = null; - List param = new ArrayList(); -} -{ - ( - (((tk= | tk=) { identifier.append(tk.image); } - ["." (tk2= | tk2=) { identifier.append("."); identifier.append(tk2.image); }]) - { param.add(identifier.toString()); }) - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - ("+" {retval = "+";} | "-" {retval = "-";})? - ( - tk= { retval += tk.image; } - | - tk= { retval += tk.image; } - ) - { param.add(retval); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(new TimeKeyExpression(tk.image).toString()); } - | - "=" { param.add("="); } - | - LOOKAHEAD(3) retval=RelObjectName() { param.add("USING"); param.add("INDEX"); param.add("TABLESPACE"); param.add(retval); } - | - retval=RelObjectName() { param.add("TABLESPACE"); param.add(retval); } - | - retval=AList() { param.add(retval); } - | - ("(" exp = Expression() ")") { param.add("CHECK"); param.add("(" + exp.toString() + ")");} - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - | - tk= { param.add(tk.image); } - - ) - {return param;} -} - -String AList(): -{ - StringBuilder retval = new StringBuilder("("); - Token tk = null; - Token tk2 = null; -} -{ - "(" - - ( (tk= | tk= | tk= | tk= | tk=) { retval.append(tk.image); } - [("," {retval.append(",");} | "=" {retval.append("=");})] )* - - ")" - { - retval.append(")"); - return retval.toString(); - } -} - -List ColumnsNamesList(): -{ - List retval = new ArrayList(); - Token tk = null; -} -{ - "(" - - (tk= | tk=) { retval.add(tk.image); } - ( "," (tk= | tk=) { retval.add(tk.image); } )* - - ")" - { - return retval; - } -} - -Drop Drop(): -{ - Drop drop = new Drop(); - Token tk = null; - Table name; - List dropArgs = new ArrayList(); -} -{ - - ( - tk= - | - tk= - | - tk= - | - tk= - ) - { drop.setType(tk.image); } - - [ {drop.setIfExists(true);} ] - - name = Table() { drop.setName(name); } - ((tk= | tk= | tk= ) { dropArgs.add(tk.image); })* - - { - if (dropArgs.size() > 0) - drop.setParameters(dropArgs); - return drop; - } -} - -Truncate Truncate(): -{ - Truncate truncate = new Truncate(); - Table table; -} -{ - - table=Table() { truncate.setTable(table); } - { - return truncate; - } -} - - -AlterExpression.ColumnDataType AlterExpressionColumnDataType(): -{ - String columnName = null; - ColDataType dataType = null; - List columnSpecs = null; - List parameter = null; -} -{ - columnName = RelObjectName() - dataType = ColDataType() { columnSpecs = new ArrayList(); } - ( parameter = CreateParameter() { columnSpecs.addAll(parameter); } )* - { - return new AlterExpression.ColumnDataType(columnName, dataType, columnSpecs); - } -} - -List AlterExpressionConstraintState(): -{ - List retval = new ArrayList(); -} -{ - ( - ( - {retval.add(new DeferrableConstraint(false));} - ) - | - ( - {retval.add(new DeferrableConstraint(true));} - ) - | - ( - {retval.add(new ValidateConstraint(false));} - ) - | - ( - {retval.add(new ValidateConstraint(true));} - ) - | - ( - {retval.add(new EnableConstraint(false));} - ) - | - ( - {retval.add(new EnableConstraint(true));} - ) - )* - { - return retval; - } -} - - - -AlterExpression AlterExpression(): -{ - AlterExpression alterExp = new AlterExpression(); - Token tk; - Token tk2 = null; - String sk3 = null; - ColDataType dataType; - List columnNames = null; - List constraints = null; - ForeignKeyIndex fkIndex = null; - NamedConstraint index = null; - Table fkTable = null; - AlterExpression.ColumnDataType alterExpressionColumnDataType = null; -} -{ - - ( - (( { alterExp.setOperation(AlterOperation.ADD); } | { alterExp.setOperation(AlterOperation.MODIFY); }) - ( - LOOKAHEAD(2) ( columnNames=ColumnsNamesList() { alterExp.setPkColumns(columnNames); } ) constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } - | - ( (LOOKAHEAD(2) )? - alterExpressionColumnDataType = AlterExpressionColumnDataType() { alterExp.addColDataType(alterExpressionColumnDataType); } - ) - | - ( - "(" alterExpressionColumnDataType = AlterExpressionColumnDataType() { alterExp.addColDataType(alterExpressionColumnDataType); } - ("," alterExpressionColumnDataType = AlterExpressionColumnDataType() { alterExp.addColDataType(alterExpressionColumnDataType); } )* ")" - ) - | - ( (tk= | tk=) columnNames=ColumnsNamesList() { alterExp.setUkName(tk.image); alterExp.setUkColumns(columnNames); } ) - | -//following two choices regarding foreign keys should be merged - ( columnNames=ColumnsNamesList() { alterExp.setFkColumns(columnNames); } - tk= columnNames=ColumnsNamesList() - { alterExp.setFkSourceTable(tk.image); alterExp.setFkSourceColumns(columnNames); } - [ - ( { alterExp.setOnDeleteCascade(true); } - | { alterExp.setOnDeleteRestrict(true); } - | { alterExp.setOnDeleteSetNull(true); } ) ] - ) - | - ( - sk3=RelObjectName() - - ( ( tk= tk2= - columnNames=ColumnsNamesList() - { - fkIndex = new ForeignKeyIndex(); - fkIndex.setName(sk3); - fkIndex.setType(tk.image + " " + tk2.image); - fkIndex.setColumnsNames(columnNames); - } - fkTable=Table() columnNames=ColumnsNamesList() - { - fkIndex.setTable(fkTable); - fkIndex.setReferencedColumnNames(columnNames); - alterExp.setIndex(fkIndex); - } - constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } - ) - | - ( tk= tk2= - columnNames=ColumnsNamesList() - { - index = new NamedConstraint(); - index.setName(sk3); - index.setType(tk.image + " " + tk2.image); - index.setColumnsNames(columnNames); - alterExp.setIndex(index); - } - constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } - ) - | - ( - {Expression exp = null;} ("(" exp = Expression() ")")* { - CheckConstraint checkCs = new CheckConstraint(); - checkCs.setName(sk3); - checkCs.setExpression(exp); - alterExp.setIndex(checkCs); - } - ) - | - ( - tk= tk2= - columnNames=ColumnsNamesList() - { - index = new NamedConstraint(); - index.setName(sk3); - index.setType(tk.image + " " + tk2.image); - index.setColumnsNames(columnNames); - alterExp.setIndex(index); - } - constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } - ) - | - ( - tk= - columnNames=ColumnsNamesList() - { - index = new NamedConstraint(); - index.setName(sk3); - index.setType(tk.image); - index.setColumnsNames(columnNames); - alterExp.setIndex(index); - } - constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } - ) ) - ) - ) - ) - | - ( - { - alterExp.setOperation(AlterOperation.DROP); - } - ( - ( (LOOKAHEAD(2) )? - (tk= | tk=) - { - alterExp.setColumnName(tk.image); - } - [tk= { alterExp.addParameters(tk.image); } ] - - ) - | - ( - (tk= | tk=) - { - alterExp.setConstraintName(tk.image); - } - ) - ) - ) - ) - - { - return alterExp; - } -} - - -Alter AlterTable(): -{ - Alter alter = new Alter(); - Table table; - AlterExpression alterExp; - -} -{ - table=Table() { alter.setTable(table); } - ( alterExp=AlterExpression() { alter.addAlterExpression(alterExp); } - ("," alterExp=AlterExpression() { alter.addAlterExpression(alterExp); } )* - ) - - { - return alter; - } -} - -Wait Wait(): -{ - Wait wait = new Wait(); - Token token = null; -} -{ - // sqlserver-oracle-> WAIT (TIMEOUT) - // https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_10002.htm#i2126016 - token= { wait.setTimeout(Long.parseLong(token.image)); } - - { - return wait; - } -} - -Commit Commit(): -{ - Commit commit=new Commit(); -} -{ - - { - return commit; - } -} +/* + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2014 JSQLParser + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ + +options{ + IGNORE_CASE = true ; + STATIC = false; + DEBUG_PARSER = false; + DEBUG_LOOKAHEAD = false; + DEBUG_TOKEN_MANAGER = false; + CACHE_TOKENS = false; +// FORCE_LA_CHECK = true; + UNICODE_INPUT = true; + JAVA_TEMPLATE_TYPE = "modern"; + JDK_VERSION = "1.7"; + TOKEN_EXTENDS = "BaseToken"; + COMMON_TOKEN_ACTION = true; + NODE_DEFAULT_VOID = true; + TRACK_TOKENS = true; + VISITOR = true; +} + +PARSER_BEGIN(CCJSqlParser) +/* + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2014 JSQLParser + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ + +package net.sf.jsqlparser.parser; + +import net.sf.jsqlparser.expression.*; +import net.sf.jsqlparser.expression.operators.arithmetic.*; +import net.sf.jsqlparser.expression.operators.conditional.*; +import net.sf.jsqlparser.expression.operators.relational.*; +import net.sf.jsqlparser.schema.*; +import net.sf.jsqlparser.statement.*; +import net.sf.jsqlparser.statement.alter.*; +import net.sf.jsqlparser.statement.create.index.*; +import net.sf.jsqlparser.statement.create.table.*; +import net.sf.jsqlparser.statement.create.view.*; +import net.sf.jsqlparser.statement.delete.*; +import net.sf.jsqlparser.statement.drop.*; +import net.sf.jsqlparser.statement.insert.*; +import net.sf.jsqlparser.statement.replace.*; +import net.sf.jsqlparser.statement.execute.*; +import net.sf.jsqlparser.statement.select.*; +import net.sf.jsqlparser.statement.truncate.*; +import net.sf.jsqlparser.statement.update.*; +import net.sf.jsqlparser.statement.upsert.*; +import net.sf.jsqlparser.statement.merge.*; +import java.util.*; + +/** + * The parser generated by JavaCC + */ +public class CCJSqlParser { + int jdbcParameterIndex = 0; + boolean errorRecovery = false; + List parseErrors = new ArrayList(); + + private void linkAST(ASTNodeAccess access, SimpleNode node) { + access.setASTNode(node); + node.jjtSetValue(access); + } + + public Node getASTRoot() { + return jjtree.rootNode(); + } + + public void setErrorRecovery(boolean errorRecovery) { + this.errorRecovery = errorRecovery; + } + + public List getParseErrors() { + return parseErrors; + } +} + +PARSER_END(CCJSqlParser) + +TOKEN_MGR_DECLS : { + public void CommonTokenAction(Token t) + { + t.absoluteBegin = getCurrentTokenAbsolutePosition(); + t.absoluteEnd = t.absoluteBegin + t.image.length(); + } + + public int getCurrentTokenAbsolutePosition() + { + if (input_stream instanceof SimpleCharStream) + return ((SimpleCharStream)input_stream).getAbsoluteTokenBegin(); + return -1; + } +} + +SKIP: +{ + +} + +TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ +{ + +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +} + +TOKEN : /* Stuff */ +{ + +} + +TOKEN : /* Operators */ +{ + " ()* "="> +| )* "="> +| )* ">"> +| )* "="> +| )* "|"> +} + +TOKEN : /* Date/Time with time zones */ +{ + ()* ("(" ")")? ()* ( | ) ()+ "TIME" ()+ > +} + +TOKEN : /* Numeric Constants */ +{ + < S_DOUBLE: (()? "." ( ["e","E"] (["+", "-"])? )? + | + "." (["e","E"] (["+", "-"])? )? + | + ["e","E"] (["+", "-"])? + )> + | < S_LONG: ( )+ > + | < #DIGIT: ["0" - "9"] > + | < S_HEX: ("x'" ( )+ "'" | "0x" ( )+ ) > + | < #HEX_VALUE: ["0"-"9","A"-"F"] > +} + +SPECIAL_TOKEN: +{ + < LINE_COMMENT: "--"(~["\r","\n"])*> +| < MULTI_LINE_COMMENT: "/*" (~["*"])* "*" ("*" | (~["*","/"] (~["*"])* "*"))* "/"> +} + +TOKEN: +{ + ()*> +| <#LETTER: ["$","A"-"Z","_","#","a"-"z","\u00a2"-"\u00a5","\u00aa","\u00b5","\u00ba","\u00c0"-"\u00d6","\u00d8"-"\u00f6","\u00f8"-"\u021f","\u0222"-"\u0233","\u0250"-"\u02ad","\u02b0"-"\u02b8","\u02bb"-"\u02c1","\u02d0"-"\u02d1","\u02e0"-"\u02e4","\u02ee","\u037a","\u0386","\u0388"-"\u038a","\u038c","\u038e"-"\u03a1","\u03a3"-"\u03ce","\u03d0"-"\u03d7","\u03da"-"\u03f3","\u0400"-"\u0481","\u048c"-"\u04c4","\u04c7"-"\u04c8","\u04cb"-"\u04cc","\u04d0"-"\u04f5","\u04f8"-"\u04f9","\u0531"-"\u0556","\u0559","\u0561"-"\u0587","\u05d0"-"\u05ea","\u05f0"-"\u05f2","\u0621"-"\u063a","\u0640"-"\u064a","\u0671"-"\u06d3","\u06d5","\u06e5"-"\u06e6","\u06fa"-"\u06fc","\u0710","\u0712"-"\u072c","\u0780"-"\u07a5","\u0905"-"\u0939","\u093d","\u0950","\u0958"-"\u0961","\u0985"-"\u098c","\u098f"-"\u0990","\u0993"-"\u09a8","\u09aa"-"\u09b0","\u09b2","\u09b6"-"\u09b9","\u09dc"-"\u09dd","\u09df"-"\u09e1","\u09f0"-"\u09f3","\u0a05"-"\u0a0a","\u0a0f"-"\u0a10","\u0a13"-"\u0a28","\u0a2a"-"\u0a30","\u0a32"-"\u0a33","\u0a35"-"\u0a36","\u0a38"-"\u0a39","\u0a59"-"\u0a5c","\u0a5e","\u0a72"-"\u0a74","\u0a85"-"\u0a8b","\u0a8d","\u0a8f"-"\u0a91","\u0a93"-"\u0aa8","\u0aaa"-"\u0ab0","\u0ab2"-"\u0ab3","\u0ab5"-"\u0ab9","\u0abd","\u0ad0","\u0ae0","\u0b05"-"\u0b0c","\u0b0f"-"\u0b10","\u0b13"-"\u0b28","\u0b2a"-"\u0b30","\u0b32"-"\u0b33","\u0b36"-"\u0b39","\u0b3d","\u0b5c"-"\u0b5d","\u0b5f"-"\u0b61","\u0b85"-"\u0b8a","\u0b8e"-"\u0b90","\u0b92"-"\u0b95","\u0b99"-"\u0b9a","\u0b9c","\u0b9e"-"\u0b9f","\u0ba3"-"\u0ba4","\u0ba8"-"\u0baa","\u0bae"-"\u0bb5","\u0bb7"-"\u0bb9","\u0c05"-"\u0c0c","\u0c0e"-"\u0c10","\u0c12"-"\u0c28","\u0c2a"-"\u0c33","\u0c35"-"\u0c39","\u0c60"-"\u0c61","\u0c85"-"\u0c8c","\u0c8e"-"\u0c90","\u0c92"-"\u0ca8","\u0caa"-"\u0cb3","\u0cb5"-"\u0cb9","\u0cde","\u0ce0"-"\u0ce1","\u0d05"-"\u0d0c","\u0d0e"-"\u0d10","\u0d12"-"\u0d28","\u0d2a"-"\u0d39","\u0d60"-"\u0d61","\u0d85"-"\u0d96","\u0d9a"-"\u0db1","\u0db3"-"\u0dbb","\u0dbd","\u0dc0"-"\u0dc6","\u0e01"-"\u0e30","\u0e32"-"\u0e33","\u0e3f"-"\u0e46","\u0e81"-"\u0e82","\u0e84","\u0e87"-"\u0e88","\u0e8a","\u0e8d","\u0e94"-"\u0e97","\u0e99"-"\u0e9f","\u0ea1"-"\u0ea3","\u0ea5","\u0ea7","\u0eaa"-"\u0eab","\u0ead"-"\u0eb0","\u0eb2"-"\u0eb3","\u0ebd","\u0ec0"-"\u0ec4","\u0ec6","\u0edc"-"\u0edd","\u0f00","\u0f40"-"\u0f47","\u0f49"-"\u0f6a","\u0f88"-"\u0f8b","\u1000"-"\u1021","\u1023"-"\u1027","\u1029"-"\u102a","\u1050"-"\u1055","\u10a0"-"\u10c5","\u10d0"-"\u10f6","\u1100"-"\u1159","\u115f"-"\u11a2","\u11a8"-"\u11f9","\u1200"-"\u1206","\u1208"-"\u1246","\u1248","\u124a"-"\u124d","\u1250"-"\u1256","\u1258","\u125a"-"\u125d","\u1260"-"\u1286","\u1288","\u128a"-"\u128d","\u1290"-"\u12ae","\u12b0","\u12b2"-"\u12b5","\u12b8"-"\u12be","\u12c0","\u12c2"-"\u12c5","\u12c8"-"\u12ce","\u12d0"-"\u12d6","\u12d8"-"\u12ee","\u12f0"-"\u130e","\u1310","\u1312"-"\u1315","\u1318"-"\u131e","\u1320"-"\u1346","\u1348"-"\u135a","\u13a0"-"\u13f4","\u1401"-"\u166c","\u166f"-"\u1676","\u1681"-"\u169a","\u16a0"-"\u16ea","\u1780"-"\u17b3","\u17db","\u1820"-"\u1877","\u1880"-"\u18a8","\u1e00"-"\u1e9b","\u1ea0"-"\u1ef9","\u1f00"-"\u1f15","\u1f18"-"\u1f1d","\u1f20"-"\u1f45","\u1f48"-"\u1f4d","\u1f50"-"\u1f57","\u1f59","\u1f5b","\u1f5d","\u1f5f"-"\u1f7d","\u1f80"-"\u1fb4","\u1fb6"-"\u1fbc","\u1fbe","\u1fc2"-"\u1fc4","\u1fc6"-"\u1fcc","\u1fd0"-"\u1fd3","\u1fd6"-"\u1fdb","\u1fe0"-"\u1fec","\u1ff2"-"\u1ff4","\u1ff6"-"\u1ffc","\u203f"-"\u2040","\u207f","\u20a0"-"\u20af","\u2102","\u2107","\u210a"-"\u2113","\u2115","\u2119"-"\u211d","\u2124","\u2126","\u2128","\u212a"-"\u212d","\u212f"-"\u2131","\u2133"-"\u2139","\u2160"-"\u2183","\u3005"-"\u3007","\u3021"-"\u3029","\u3031"-"\u3035","\u3038"-"\u303a","\u3041"-"\u3094","\u309d"-"\u309e","\u30a1"-"\u30fe","\u3105"-"\u312c","\u3131"-"\u318e","\u31a0"-"\u31b7","\u3400"-"\u4db5","\u4e00"-"\u9fa5","\ua000"-"\ua48c","\uac00"-"\ud7a3","\uf900"-"\ufa2d","\ufb00"-"\ufb06","\ufb13"-"\ufb17","\ufb1d","\ufb1f"-"\ufb28","\ufb2a"-"\ufb36","\ufb38"-"\ufb3c","\ufb3e","\ufb40"-"\ufb41","\ufb43"-"\ufb44","\ufb46"-"\ufbb1","\ufbd3"-"\ufd3d","\ufd50"-"\ufd8f","\ufd92"-"\ufdc7","\ufdf0"-"\ufdfb","\ufe33"-"\ufe34","\ufe4d"-"\ufe4f","\ufe69","\ufe70"-"\ufe72","\ufe74","\ufe76"-"\ufefc","\uff04","\uff21"-"\uff3a","\uff3f","\uff41"-"\uff5a","\uff65"-"\uffbe","\uffc2"-"\uffc7","\uffca"-"\uffcf","\uffd2"-"\uffd7","\uffda"-"\uffdc","\uffe0"-"\uffe1","\uffe5"-"\uffe6"]> +| <#PART_LETTER: ["\u0000"-"\b","\u000e"-"\u001b","$","#","@","0"-"9","A"-"Z","_","a"-"z","\u007f"-"\u009f","\u00a2"-"\u00a5","\u00aa","\u00b5","\u00ba","\u00c0"-"\u00d6","\u00d8"-"\u00f6","\u00f8"-"\u021f","\u0222"-"\u0233","\u0250"-"\u02ad","\u02b0"-"\u02b8","\u02bb"-"\u02c1","\u02d0"-"\u02d1","\u02e0"-"\u02e4","\u02ee","\u0300"-"\u034e","\u0360"-"\u0362","\u037a","\u0386","\u0388"-"\u038a","\u038c","\u038e"-"\u03a1","\u03a3"-"\u03ce","\u03d0"-"\u03d7","\u03da"-"\u03f3","\u0400"-"\u0481","\u0483"-"\u0486","\u048c"-"\u04c4","\u04c7"-"\u04c8","\u04cb"-"\u04cc","\u04d0"-"\u04f5","\u04f8"-"\u04f9","\u0531"-"\u0556","\u0559","\u0561"-"\u0587","\u0591"-"\u05a1","\u05a3"-"\u05b9","\u05bb"-"\u05bd","\u05bf","\u05c1"-"\u05c2","\u05c4","\u05d0"-"\u05ea","\u05f0"-"\u05f2","\u0621"-"\u063a","\u0640"-"\u0655","\u0660"-"\u0669","\u0670"-"\u06d3","\u06d5"-"\u06dc","\u06df"-"\u06e8","\u06ea"-"\u06ed","\u06f0"-"\u06fc","\u070f"-"\u072c","\u0730"-"\u074a","\u0780"-"\u07b0","\u0901"-"\u0903","\u0905"-"\u0939","\u093c"-"\u094d","\u0950"-"\u0954","\u0958"-"\u0963","\u0966"-"\u096f","\u0981"-"\u0983","\u0985"-"\u098c","\u098f"-"\u0990","\u0993"-"\u09a8","\u09aa"-"\u09b0","\u09b2","\u09b6"-"\u09b9","\u09bc","\u09be"-"\u09c4","\u09c7"-"\u09c8","\u09cb"-"\u09cd","\u09d7","\u09dc"-"\u09dd","\u09df"-"\u09e3","\u09e6"-"\u09f3","\u0a02","\u0a05"-"\u0a0a","\u0a0f"-"\u0a10","\u0a13"-"\u0a28","\u0a2a"-"\u0a30","\u0a32"-"\u0a33","\u0a35"-"\u0a36","\u0a38"-"\u0a39","\u0a3c","\u0a3e"-"\u0a42","\u0a47"-"\u0a48","\u0a4b"-"\u0a4d","\u0a59"-"\u0a5c","\u0a5e","\u0a66"-"\u0a74","\u0a81"-"\u0a83","\u0a85"-"\u0a8b","\u0a8d","\u0a8f"-"\u0a91","\u0a93"-"\u0aa8","\u0aaa"-"\u0ab0","\u0ab2"-"\u0ab3","\u0ab5"-"\u0ab9","\u0abc"-"\u0ac5","\u0ac7"-"\u0ac9","\u0acb"-"\u0acd","\u0ad0","\u0ae0","\u0ae6"-"\u0aef","\u0b01"-"\u0b03","\u0b05"-"\u0b0c","\u0b0f"-"\u0b10","\u0b13"-"\u0b28","\u0b2a"-"\u0b30","\u0b32"-"\u0b33","\u0b36"-"\u0b39","\u0b3c"-"\u0b43","\u0b47"-"\u0b48","\u0b4b"-"\u0b4d","\u0b56"-"\u0b57","\u0b5c"-"\u0b5d","\u0b5f"-"\u0b61","\u0b66"-"\u0b6f","\u0b82"-"\u0b83","\u0b85"-"\u0b8a","\u0b8e"-"\u0b90","\u0b92"-"\u0b95","\u0b99"-"\u0b9a","\u0b9c","\u0b9e"-"\u0b9f","\u0ba3"-"\u0ba4","\u0ba8"-"\u0baa","\u0bae"-"\u0bb5","\u0bb7"-"\u0bb9","\u0bbe"-"\u0bc2","\u0bc6"-"\u0bc8","\u0bca"-"\u0bcd","\u0bd7","\u0be7"-"\u0bef","\u0c01"-"\u0c03","\u0c05"-"\u0c0c","\u0c0e"-"\u0c10","\u0c12"-"\u0c28","\u0c2a"-"\u0c33","\u0c35"-"\u0c39","\u0c3e"-"\u0c44","\u0c46"-"\u0c48","\u0c4a"-"\u0c4d","\u0c55"-"\u0c56","\u0c60"-"\u0c61","\u0c66"-"\u0c6f","\u0c82"-"\u0c83","\u0c85"-"\u0c8c","\u0c8e"-"\u0c90","\u0c92"-"\u0ca8","\u0caa"-"\u0cb3","\u0cb5"-"\u0cb9","\u0cbe"-"\u0cc4","\u0cc6"-"\u0cc8","\u0cca"-"\u0ccd","\u0cd5"-"\u0cd6","\u0cde","\u0ce0"-"\u0ce1","\u0ce6"-"\u0cef","\u0d02"-"\u0d03","\u0d05"-"\u0d0c","\u0d0e"-"\u0d10","\u0d12"-"\u0d28","\u0d2a"-"\u0d39","\u0d3e"-"\u0d43","\u0d46"-"\u0d48","\u0d4a"-"\u0d4d","\u0d57","\u0d60"-"\u0d61","\u0d66"-"\u0d6f","\u0d82"-"\u0d83","\u0d85"-"\u0d96","\u0d9a"-"\u0db1","\u0db3"-"\u0dbb","\u0dbd","\u0dc0"-"\u0dc6","\u0dca","\u0dcf"-"\u0dd4","\u0dd6","\u0dd8"-"\u0ddf","\u0df2"-"\u0df3","\u0e01"-"\u0e3a","\u0e3f"-"\u0e4e","\u0e50"-"\u0e59","\u0e81"-"\u0e82","\u0e84","\u0e87"-"\u0e88","\u0e8a","\u0e8d","\u0e94"-"\u0e97","\u0e99"-"\u0e9f","\u0ea1"-"\u0ea3","\u0ea5","\u0ea7","\u0eaa"-"\u0eab","\u0ead"-"\u0eb9","\u0ebb"-"\u0ebd","\u0ec0"-"\u0ec4","\u0ec6","\u0ec8"-"\u0ecd","\u0ed0"-"\u0ed9","\u0edc"-"\u0edd","\u0f00","\u0f18"-"\u0f19","\u0f20"-"\u0f29","\u0f35","\u0f37","\u0f39","\u0f3e"-"\u0f47","\u0f49"-"\u0f6a","\u0f71"-"\u0f84","\u0f86"-"\u0f8b","\u0f90"-"\u0f97","\u0f99"-"\u0fbc","\u0fc6","\u1000"-"\u1021","\u1023"-"\u1027","\u1029"-"\u102a","\u102c"-"\u1032","\u1036"-"\u1039","\u1040"-"\u1049","\u1050"-"\u1059","\u10a0"-"\u10c5","\u10d0"-"\u10f6","\u1100"-"\u1159","\u115f"-"\u11a2","\u11a8"-"\u11f9","\u1200"-"\u1206","\u1208"-"\u1246","\u1248","\u124a"-"\u124d","\u1250"-"\u1256","\u1258","\u125a"-"\u125d","\u1260"-"\u1286","\u1288","\u128a"-"\u128d","\u1290"-"\u12ae","\u12b0","\u12b2"-"\u12b5","\u12b8"-"\u12be","\u12c0","\u12c2"-"\u12c5","\u12c8"-"\u12ce","\u12d0"-"\u12d6","\u12d8"-"\u12ee","\u12f0"-"\u130e","\u1310","\u1312"-"\u1315","\u1318"-"\u131e","\u1320"-"\u1346","\u1348"-"\u135a","\u1369"-"\u1371","\u13a0"-"\u13f4","\u1401"-"\u166c","\u166f"-"\u1676","\u1681"-"\u169a","\u16a0"-"\u16ea","\u1780"-"\u17d3","\u17db","\u17e0"-"\u17e9","\u180b"-"\u180e","\u1810"-"\u1819","\u1820"-"\u1877","\u1880"-"\u18a9","\u1e00"-"\u1e9b","\u1ea0"-"\u1ef9","\u1f00"-"\u1f15","\u1f18"-"\u1f1d","\u1f20"-"\u1f45","\u1f48"-"\u1f4d","\u1f50"-"\u1f57","\u1f59","\u1f5b","\u1f5d","\u1f5f"-"\u1f7d","\u1f80"-"\u1fb4","\u1fb6"-"\u1fbc","\u1fbe","\u1fc2"-"\u1fc4","\u1fc6"-"\u1fcc","\u1fd0"-"\u1fd3","\u1fd6"-"\u1fdb","\u1fe0"-"\u1fec","\u1ff2"-"\u1ff4","\u1ff6"-"\u1ffc","\u200c"-"\u200f","\u202a"-"\u202e","\u203f"-"\u2040","\u206a"-"\u206f","\u207f","\u20a0"-"\u20af","\u20d0"-"\u20dc","\u20e1","\u2102","\u2107","\u210a"-"\u2113","\u2115","\u2119"-"\u211d","\u2124","\u2126","\u2128","\u212a"-"\u212d","\u212f"-"\u2131","\u2133"-"\u2139","\u2160"-"\u2183","\u3005"-"\u3007","\u3021"-"\u302f","\u3031"-"\u3035","\u3038"-"\u303a","\u3041"-"\u3094","\u3099"-"\u309a","\u309d"-"\u309e","\u30a1"-"\u30fe","\u3105"-"\u312c","\u3131"-"\u318e","\u31a0"-"\u31b7","\u3400"-"\u4db5","\u4e00"-"\u9fa5","\ua000"-"\ua48c","\uac00"-"\ud7a3","\uf900"-"\ufa2d","\ufb00"-"\ufb06","\ufb13"-"\ufb17","\ufb1d"-"\ufb28","\ufb2a"-"\ufb36","\ufb38"-"\ufb3c","\ufb3e","\ufb40"-"\ufb41","\ufb43"-"\ufb44","\ufb46"-"\ufbb1","\ufbd3"-"\ufd3d","\ufd50"-"\ufd8f","\ufd92"-"\ufdc7","\ufdf0"-"\ufdfb","\ufe20"-"\ufe23","\ufe33"-"\ufe34","\ufe4d"-"\ufe4f","\ufe69","\ufe70"-"\ufe72","\ufe74","\ufe76"-"\ufefc","\ufeff","\uff04","\uff10"-"\uff19","\uff21"-"\uff3a","\uff3f","\uff41"-"\uff5a","\uff65"-"\uffbe","\uffc2"-"\uffc7","\uffca"-"\uffcf","\uffd2"-"\uffd7","\uffda"-"\uffdc","\uffe0"-"\uffe1","\uffe5"-"\uffe6","\ufff9"-"\ufffb"]> +| < S_CHAR_LITERAL: (["U","E","N"])? (("'" ( | ~["'", "\\", "\n", "\r"] )* "'") | ("'" ("''" | ~["'"])* "'")) > +| < S_QUOTED_IDENTIFIER: "\"" (~["\n","\r","\""])+ "\"" | ("`" (~["\n","\r","`"])+ "`") | ( "[" ~["0"-"9","]"] (~["\n","\r","]"])* "]" ) > +| < #ESC: "\\" ["n","t","b","r","f","\\","'","\""] > +} + +Statement Statement() #Statement: +{ Statement stm = null; } +{ + try { + stm = SingleStatement() + [] + + } catch (ParseException e) { + if (errorRecovery) { + parseErrors.add(e); + error_skipto(ST_SEMICOLON); + } + else + throw e; + } + + { + return stm; + } +} + +Statement SingleStatement() : +{ Statement stm = null;} +{ + try { + ( + stm = Select() + | + stm = Update() + | + stm = Insert() + | + stm = Upsert() + | + stm = Delete() + | + stm = Replace() + | + LOOKAHEAD(2) + stm = AlterTable() + | + stm = Merge() + | + LOOKAHEAD(CreateIndex()) + stm = CreateIndex() + | + LOOKAHEAD(CreateTable()) + stm = CreateTable() + | + LOOKAHEAD(CreateView()) + stm = CreateView() + | + stm = AlterView() + | + stm = Drop() + | + stm = Truncate() + | + stm = Execute() + | + stm = Set() + | + stm = Use() + | + stm = Commit() + | + LOOKAHEAD(CreateSequence()) + stm = CreateSequence() + ) + { return stm; } + } catch (ParseException e) { + if (errorRecovery) { + parseErrors.add(e); + error_skipto(ST_SEMICOLON); + return null; + } + else + throw e; + } +} + +Statements Statements() #Statements : +{ Statements stmts = new Statements(); + List list = new ArrayList(); + Statement stm; } +{ + ()* + try { + stm = SingleStatement() { list.add(stm); } + ( [stm = SingleStatement() { list.add(stm); }] )* + + } catch (ParseException e) { + if (errorRecovery) { + parseErrors.add(e); + error_skipto(ST_SEMICOLON); + } + else + throw e; + } + { + stmts.setStatements(list); + return stmts; + } +} + +JAVACODE +void error_skipto(int kind) { + ParseException e = generateParseException(); + System.out.println(e.toString()); + Token t; + do { + t = getNextToken(); + } while (t.kind != kind && t.kind != EOF); +} + +SetStatement Set(): { + String name; + Expression value; + boolean useEqual = false; +} +{ + name = RelObjectNameExt() ["=" { useEqual=true; } ] value=SimpleExpression() + { + return new SetStatement(name,value).setUseEqual(useEqual); + } +} + +UseStatement Use(): { + String name; +} +{ + name = RelObjectNameExt() + { + return new UseStatement(name); + } +} + +Update Update(): +{ + Update update = new Update(); + Table table = null; + List
tables = new ArrayList
(); + Expression where = null; + Column tableColumn = null; + List expList = new ArrayList(); + List columns = new ArrayList(); + Expression value = null; + FromItem fromItem = null; + List joins = null; + Select select = null; + Limit limit = null; + List orderByElements; + boolean useColumnsBrackets = false; + List returning = null; +} +{ + table=TableWithAlias() { tables.add(table); } + ("," table=TableWithAlias() { tables.add(table); } )* + + ( + LOOKAHEAD(3) tableColumn=Column() "=" value=SimpleExpression() { columns.add(tableColumn); expList.add(value); } + ("," tableColumn=Column() "=" value=SimpleExpression() { columns.add(tableColumn); expList.add(value); } )* + + | + + ["(" { useColumnsBrackets = true; }] tableColumn=Column() { columns.add(tableColumn); } ("," tableColumn=Column() { columns.add(tableColumn); } )* [ ")" ] "=" + "(" + ( + { update.setUseSelect(true); } + select = Select() + ) + ")" + ) + + [ + fromItem=FromItem() + joins=JoinsList() ] + + [ where=WhereClause() { update.setWhere(where); } ] + + [ orderByElements = OrderByElements() { update.setOrderByElements(orderByElements); } ] + [ limit = PlainLimit() { update.setLimit(limit); } ] + [ ( + "*" { update.setReturningAllColumns(true); } + | returning=ListExpressionItem() + ) + ] + + { + update.setColumns(columns); + update.setExpressions(expList); + update.setTables(tables); + update.setFromItem(fromItem); + update.setJoins(joins); + update.setSelect(select); + update.setUseColumnsBrackets(useColumnsBrackets); + update.setReturningExpressionList(returning); + return update; + } +} + +Replace Replace(): +{ + Replace replace = new Replace(); + Table table = null; + Column tableColumn = null; + Expression value = null; + + List columns = new ArrayList(); + List expList = new ArrayList(); + MultiExpressionList multiExpr = null; + ItemsList itemsList = null; + Expression exp = null; +} +{ + [ { replace.setUseIntoTables(true); }] table=Table() + + ( + ( + tableColumn=Column() "=" value=SimpleExpression() { columns.add(tableColumn); expList.add(value); } + ("," tableColumn=Column() "=" value=SimpleExpression() { columns.add(tableColumn); expList.add(value); } )* + { + replace.setExpressions(expList); + } + ) + | + + ( + [LOOKAHEAD(2) "(" tableColumn=Column() { columns.add(tableColumn); } ("," tableColumn=Column() { columns.add(tableColumn); } )* ")" ] + ( + LOOKAHEAD(2) [ | ] "(" exp=PrimaryExpression() { expList.add(exp); } + ("," exp=PrimaryExpression() { expList.add(exp); } )* ")" { itemsList = new ExpressionList(expList); } + ("," "(" exp=SimpleExpression() { + if (multiExpr==null) { + multiExpr=new MultiExpressionList(); + multiExpr.addExpressionList((ExpressionList)itemsList); + itemsList = multiExpr; + } + expList = new ArrayList(); + expList.add(exp); } + ("," exp=SimpleExpression() { expList.add(exp); } )* ")" { multiExpr.addExpressionList(expList); } )* + | + { replace.setUseValues(false); } + itemsList=SubSelect() + { ((SubSelect)itemsList).setUseBrackets(false); } + ) + { + replace.setItemsList(itemsList); + } + ) + ) + { + if (columns.size() > 0) + replace.setColumns(columns); + replace.setTable(table); + return replace; + } +} + +List ListExpressionItem(): +{ + List retval = new ArrayList(); + SelectExpressionItem item; +} +{ + item = SelectExpressionItem() {retval.add(item);} + ("," item = SelectExpressionItem() {retval.add(item);} )* + { return retval; } +} + +Insert Insert(): +{ + Insert insert = new Insert(); + Table table = null; + Column tableColumn = null; + List columns = new ArrayList(); + List primaryExpList = new ArrayList(); + ItemsList itemsList = null; + Expression exp = null; + MultiExpressionList multiExpr = null; + List returning = null; + Select select = null; + boolean useValues = true; + boolean useSelectBrackets = false; + boolean useDuplicate = false; + List duplicateUpdateColumns = null; + List duplicateUpdateExpressionList = null; + Token tk = null; + InsertModifierPriority modifierPriority = null; + boolean modifierIgnore = false; + boolean useSet = false; + List setColumns = new ArrayList(); + List setExpressionList = new ArrayList(); + String name = null; + boolean useAs = false; +} +{ + + [(tk = | tk = | tk = ) + {if (tk!=null) + modifierPriority = InsertModifierPriority.valueOf(tk.image.toUpperCase()); + }] + [{ modifierIgnore = true; }] + [] table=Table() + + [ [ { useAs = true; } ] name=RelObjectNameWithoutValue() { table.setAlias(new Alias(name,useAs)); }] + + [LOOKAHEAD(2) "(" tableColumn=Column() { columns.add(tableColumn); } ("," tableColumn=Column() { columns.add(tableColumn); } )* ")" ] + ( + LOOKAHEAD(2) [ | ] "(" exp=SimpleExpression() { primaryExpList.add(exp); } + ("," exp=SimpleExpression() { primaryExpList.add(exp); } )* ")" { itemsList = new ExpressionList(primaryExpList); } + ("," "(" exp=SimpleExpression() { + if (multiExpr==null) { + multiExpr=new MultiExpressionList(); + multiExpr.addExpressionList((ExpressionList)itemsList); + itemsList = multiExpr; + } + primaryExpList = new ArrayList(); + primaryExpList.add(exp); } + ("," exp=SimpleExpression() { primaryExpList.add(exp); } )* ")" { multiExpr.addExpressionList(primaryExpList); } )* + + | + + ( + LOOKAHEAD(2) "(" { useSelectBrackets = true; } + { insert.setUseValues(false); } + select = Select() + ")" + | + { insert.setUseValues(false); } + select = Select() + ) + + | + + + ( + { + useSet = true; + insert.setUseValues(false); + } + tableColumn=Column() "=" exp=SimpleExpression() + { + setColumns = new ArrayList(); + setExpressionList = new ArrayList(); + setColumns.add(tableColumn); + setExpressionList.add(exp); + } + ("," tableColumn=Column() "=" exp=SimpleExpression() + { setColumns.add(tableColumn); + setExpressionList.add(exp); } )* + ) + ) + + [ + { useDuplicate = true; } + tableColumn=Column() "=" exp=SimpleExpression() + { + duplicateUpdateColumns = new ArrayList(); + duplicateUpdateExpressionList = new ArrayList(); + duplicateUpdateColumns.add(tableColumn); + duplicateUpdateExpressionList.add(exp); + } + ("," tableColumn=Column() "=" exp=SimpleExpression() + { duplicateUpdateColumns.add(tableColumn); + duplicateUpdateExpressionList.add(exp); } )*] + + + [ ( + "*" { insert.setReturningAllColumns(true); } + | returning=ListExpressionItem() + ) + ] + + { + insert.setItemsList(itemsList); + insert.setUseSelectBrackets(useSelectBrackets); + insert.setSelect(select); + insert.setTable(table); + if (columns.size() > 0) + insert.setColumns(columns); + insert.setUseDuplicate(useDuplicate); + insert.setDuplicateUpdateColumns(duplicateUpdateColumns); + insert.setDuplicateUpdateExpressionList(duplicateUpdateExpressionList); + insert.setReturningExpressionList(returning); + insert.setModifierPriority(modifierPriority); + insert.setModifierIgnore(modifierIgnore); + insert.setUseSet(useSet); + insert.setSetColumns(setColumns); + insert.setSetExpressionList(setExpressionList); + return insert; + } +} + +Upsert Upsert(): +{ + Upsert upsert = new Upsert(); + Table table = null; + Column tableColumn = null; + List columns = new ArrayList(); + List primaryExpList = new ArrayList(); + ItemsList itemsList = null; + Expression exp = null; + MultiExpressionList multiExpr = null; + List returning = null; + Select select = null; + boolean useSelectBrackets = false; + boolean useDuplicate = false; + List duplicateUpdateColumns = null; + List duplicateUpdateExpressionList = null; + Token tk = null; +} +{ + + [] table=Table() + + + [LOOKAHEAD(2) "(" tableColumn=Column() { columns.add(tableColumn); } ("," tableColumn=Column() { columns.add(tableColumn); } )* ")" ] + ( + LOOKAHEAD(2) [ | ] "(" exp=SimpleExpression() { primaryExpList.add(exp); } + ("," exp=SimpleExpression() { primaryExpList.add(exp); } )* ")" { itemsList = new ExpressionList(primaryExpList); } + ("," "(" exp=SimpleExpression() { + if (multiExpr==null) { + multiExpr=new MultiExpressionList(); + multiExpr.addExpressionList((ExpressionList)itemsList); + itemsList = multiExpr; + } + primaryExpList = new ArrayList(); + primaryExpList.add(exp); } + ("," exp=SimpleExpression() { primaryExpList.add(exp); } )* ")" { multiExpr.addExpressionList(primaryExpList); } )* + + | + + ( + LOOKAHEAD(2) "(" { useSelectBrackets = true; } + { upsert.setUseValues(false); } + select = Select() + ")" + | + { upsert.setUseValues(false); } + select = Select() + ) + ) + + [ + { useDuplicate = true; } + tableColumn=Column() "=" exp=SimpleExpression() + { + duplicateUpdateColumns = new ArrayList(); + duplicateUpdateExpressionList = new ArrayList(); + duplicateUpdateColumns.add(tableColumn); + duplicateUpdateExpressionList.add(exp); + } + ("," tableColumn=Column() "=" exp=SimpleExpression() + { duplicateUpdateColumns.add(tableColumn); + duplicateUpdateExpressionList.add(exp); } )*] + + { + upsert.setItemsList(itemsList); + upsert.setUseSelectBrackets(useSelectBrackets); + upsert.setSelect(select); + upsert.setTable(table); + if (columns.size() > 0) { + upsert.setColumns(columns); + } + upsert.setUseDuplicate(useDuplicate); + upsert.setDuplicateUpdateColumns(duplicateUpdateColumns); + upsert.setDuplicateUpdateExpressionList(duplicateUpdateExpressionList); + return upsert; + } +} + +Delete Delete(): +{ + Delete delete = new Delete(); + Table table = null; + List
tables = new ArrayList
(); + List joins = null; + Expression where = null; + Limit limit = null; + List orderByElements; +} +{ + [LOOKAHEAD(2) (table=TableWithAlias() { tables.add(table); } + ("," table=TableWithAlias() { tables.add(table); } )* + | )] + + [ table=TableWithAlias() + joins=JoinsList() ] + [where=WhereClause() { delete.setWhere(where); } ] + [orderByElements = OrderByElements() { delete.setOrderByElements(orderByElements); } ] + [limit=PlainLimit() {delete.setLimit(limit); } ] + { + delete.setTables(tables); + if (joins != null && joins.size() > 0) + delete.setJoins(joins); + delete.setTable(table); + return delete; + } +} + +Statement Merge() : { + Merge merge = new Merge(); + Table table; + SubSelect select; + Alias alias; + Expression condition; + MergeUpdate update; + MergeInsert insert; +} +{ + table=TableWithAlias() { merge.setTable(table); } + + ( table=Table() { merge.setUsingTable(table); } + | "(" select=SubSelect() { merge.setUsingSelect(select); } ")" ) + [ alias = Alias() { merge.setUsingAlias(alias); } ] + "(" condition = Expression() { merge.setOnCondition(condition); } ")" + + [ + ( LOOKAHEAD(2) update = MergeUpdateClause() { merge.setMergeUpdate(update); } + [ insert = MergeInsertClause() { merge.setMergeInsert(insert); } ] + | insert = MergeInsertClause() { merge.setMergeInsert(insert); merge.setInsertFirst(true); } + [ update = MergeUpdateClause() { merge.setMergeUpdate(update); } ] + ) + ] + + + /*[ LOOKAHEAD(2) update = MergeUpdateClause() { merge.setMergeUpdate(update); } ] + + [ insert = MergeInsertClause() { merge.setMergeInsert(insert); } ]*/ + + { return merge; } +} + +MergeUpdate MergeUpdateClause() : { + MergeUpdate mu = new MergeUpdate(); + List columns = new ArrayList(); + List expList = new ArrayList(); + Column col; + Expression exp; + Expression condition; +} +{ + + + col = Column() "=" exp = SimpleExpression() + { columns.add(col); expList.add(exp); } + ("," col = Column() "=" exp = SimpleExpression() { columns.add(col); expList.add(exp); } )* + + { mu.setColumns(columns); mu.setValues(expList); } + + [ condition = Expression() { mu.setWhereCondition(condition); }] + [ condition = Expression() { mu.setDeleteWhereCondition(condition); } ] + + { return mu; } +} + +MergeInsert MergeInsertClause() : { + MergeInsert mi = new MergeInsert(); + List columns = new ArrayList(); + List expList = new ArrayList(); + Column col; + Expression exp; +} +{ + + "(" col=Column() { columns.add(col); } ("," col=Column() { columns.add(col); } )* ")" + "(" exp=SimpleExpression() { expList.add(exp); } ("," exp=SimpleExpression() { expList.add(exp); } )* ")" + { + mi.setColumns(columns); + mi.setValues(expList); + return mi; + } +} + +// See: http://technet.microsoft.com/en-us/library/ms187879%28v=sql.105%29.aspx + +Column Column() #Column : +{ + String databaseName = null, schemaName = null, tableName = null, columnName = null; + String token = null; +} +{ + columnName = RelObjectName() + ( "." [LOOKAHEAD(2) token = RelObjectName()] { tableName = columnName; columnName = token; token = null;} + ( "." token = RelObjectName() { schemaName = tableName; tableName = columnName; columnName = token; token = null;} + ( "." token = RelObjectName() { databaseName = schemaName; schemaName = tableName; tableName = columnName; columnName = token; } + )? + )? + )? + + /*( + LOOKAHEAD(7) databaseName=RelObjectName() "." [schemaName=RelObjectName()] "." tableName=RelObjectName() "." columnName=RelObjectName() + | LOOKAHEAD(5) schemaName=RelObjectName() "." tableName=RelObjectName() "." columnName=RelObjectName() + | LOOKAHEAD(3) tableName=RelObjectName() "." columnName=RelObjectName() + | columnName=RelObjectName() + )*/ + + { + if (tableName==null && (databaseName!=null || schemaName!=null)) { + throw generateParseException(); + } + + final Database database = new Database(databaseName); + final Table table = new Table(database, schemaName, tableName); + Column col = new Column(table, columnName); + linkAST(col,jjtThis); + return col; + } +} + +/* +Not all names should be allowed for aliases. +*/ +String RelObjectNameWithoutValue() : +{ Token tk = null; } +{ + (tk= | tk= + | tk= | tk= | tk= | tk= | tk= + | tk= | tk= | tk= | tk= | tk= + | tk= | tk= | tk= | tk= + | tk= | tk= | tk= | tk= | tk= + | tk= | tk= | tk= | tk= + | tk= | tk= | tk= | tk= | tk= + | tk= | tk= | tk= | tk= + | tk= | tk= | tk= | tk= + | tk= + | tk= | tk= | tk= + ) + + { return tk.image; } +} + +/* +Normal names. +*/ +String RelObjectName() : +{ Token tk = null; String result = null; } +{ + (result = RelObjectNameWithoutValue() | tk= | tk=) + + { + if (tk!=null) result=tk.image; + return result; + } +} + +/* +Extended version of object names. +*/ +String RelObjectNameExt(): +{ Token tk = null; + String result=null; +} +{ + ( result=RelObjectName() | tk= | tk= | tk= | tk= | tk=) + { + if (tk!=null) result=tk.image; + return result; + } +} + +/* +Extended usage of object names - part 2. +*/ +String RelObjectNameExt2(): +{ Token tk = null; + String result=null; +} +{ + ( result=RelObjectNameExt() | tk= | tk= ) + { + if (tk!=null) result=tk.image; + return result; + } +} + +Table Table() #Table : +{ + String serverName = null, databaseName = null, schemaName = null, tableName = null; +} +{ + ( + LOOKAHEAD(7) serverName=RelObjectName() "." [databaseName=RelObjectName()] "." [schemaName=RelObjectName()] "." tableName=RelObjectName() + | LOOKAHEAD(5) databaseName=RelObjectName() "." [schemaName=RelObjectName()] "." tableName=RelObjectName() + | LOOKAHEAD(3) schemaName=RelObjectName() "." tableName=RelObjectName() + | tableName=RelObjectName() + ) + { + final Server server = new Server(serverName); + final Database database = new Database(server, databaseName); + Table table = new Table(database, schemaName, tableName); + return table; + } +} + +Table TableWithAlias(): +{ + Table table = null; + Alias alias = null; +} +{ + table=Table() [alias=Alias() { table.setAlias(alias); }] + { return table; } +} + +Select Select(): +{ + Select select = new Select(); + SelectBody selectBody = null; + List with = null; +} +{ + [ with=WithList() { } ] selectBody = SelectBody() + { + select.setWithItemsList(with); + select.setSelectBody(selectBody); + return select; + } +} + +SelectBody SelectBody(): +{ SelectBody selectBody = null; } +{ + selectBody = SetOperationList() + { return selectBody; } +} + +PlainSelect PlainSelect() #PlainSelect: +{ + PlainSelect plainSelect = new PlainSelect(); + List selectItems = null; + FromItem fromItem = null; + List joins = null; + List distinctOn = null; + Expression where = null; + List orderByElements; + List groupByColumnReferences = null; + Expression having = null; + Limit limit = null; + Offset offset = null; + Fetch fetch = null; + Top top = null; + Skip skip = null; + First first = null; + OracleHierarchicalExpression oracleHierarchicalQueryClause = null; + List
intoTables = null; + Table updateTable = null; + Wait wait = null; + boolean mySqlSqlCalcFoundRows = false; +} +{ + + + { plainSelect.setOracleHint(getOracleHint()); } + + [skip = Skip() { plainSelect.setSkip(skip); } ] + + [LOOKAHEAD(2) first = First() { plainSelect.setFirst(first); } ] + + [ + + | + ( + { Distinct distinct = new Distinct(); plainSelect.setDistinct(distinct); } + [ "ON" "(" distinctOn=SelectItemsList() { plainSelect.getDistinct().setOnSelectItems(distinctOn); } ")" ] + ) + | + ( + { Distinct distinct = new Distinct(true); plainSelect.setDistinct(distinct); } + ) + | + ( + { plainSelect.setMySqlSqlCalcFoundRows(true); } + ) + ] + + [top = Top() { plainSelect.setTop(top); } ] + + selectItems=SelectItemsList() + + [intoTables = IntoClause() { plainSelect.setIntoTables(intoTables); } ] + [ + fromItem=FromItem() + joins=JoinsList() ] + + [ where=WhereClause() { plainSelect.setWhere(where); }] + [ oracleHierarchicalQueryClause=OracleHierarchicalQueryClause() { plainSelect.setOracleHierarchical(oracleHierarchicalQueryClause); } ] + [ groupByColumnReferences=GroupByColumnReferences() { plainSelect.setGroupByColumnReferences(groupByColumnReferences); }] + [ having=Having() { plainSelect.setHaving(having); }] + [LOOKAHEAD( ) orderByElements = OrderByElements() { plainSelect.setOracleSiblings(true); plainSelect.setOrderByElements(orderByElements); } ] + [LOOKAHEAD( ) orderByElements = OrderByElements() { plainSelect.setOrderByElements(orderByElements); } ] + [LOOKAHEAD() limit = LimitWithOffset() { plainSelect.setLimit(limit); } ] + [LOOKAHEAD() offset = Offset() { plainSelect.setOffset(offset); } ] + [LOOKAHEAD() fetch = Fetch() { plainSelect.setFetch(fetch); } ] + + [ { plainSelect.setForUpdate(true); } + [ updateTable = Table() { plainSelect.setForUpdateTable(updateTable); } ] + [ LOOKAHEAD() wait = Wait() { plainSelect.setWait(wait); } ] ] + + { + plainSelect.setSelectItems(selectItems); + plainSelect.setFromItem(fromItem); + if (joins != null && joins.size() > 0) + plainSelect.setJoins(joins); + linkAST(plainSelect,jjtThis); + return plainSelect; + } +} + +SelectBody SetOperationList() #SetOperationList: +{ + SetOperationList list = new SetOperationList(); + List orderByElements = null; + Limit limit = null; + Offset offset = null; + Fetch fetch = null; + SelectBody select = null; + List selects = new ArrayList(); + List operations = new ArrayList(); + List brackets = new ArrayList(); + boolean bracket; +} +{ + ( + + ( + (("(" select=SelectBody() ")" { bracket=true;} ) + | select=PlainSelect() { bracket=false;} ) {selects.add(select);brackets.add(bracket); } + ( + (( { UnionOp union = new UnionOp();linkAST(union,jjtThis);operations.add(union); } [ { union.setAll(true); } | { union.setDistinct(true); } ]) + | { operations.add(new IntersectOp()); } + | { operations.add(new MinusOp()); } + | { operations.add(new ExceptOp()); } + ) + + (("(" select=SelectBody() ")" { bracket=true;} ) | select=PlainSelect() { bracket=false;} ) {selects.add(select);brackets.add(bracket);} + )* + ) + + [orderByElements=OrderByElements() {list.setOrderByElements(orderByElements);} ] + [LOOKAHEAD() limit=LimitWithOffset() {list.setLimit(limit);} ] + [LOOKAHEAD() offset = Offset() { list.setOffset(offset);} ] + [LOOKAHEAD() fetch = Fetch() { list.setFetch(fetch);} ] + ) + + { + if (selects.size()==1 && selects.get(0) instanceof PlainSelect) { + if (brackets.get(0)) + ((PlainSelect)selects.get(0)).setUseBrackets(true); + return selects.get(0); + } else { + list.setBracketsOpsAndSelects(brackets,selects,operations); + return list; + } + } +} + +List WithList(): +{ + List withItemsList = new ArrayList(); + WithItem with = null; +} +{ + with=WithItem() { withItemsList.add(with); } ("," with=WithItem() { withItemsList.add(with); } )* + + { return withItemsList; } +} + +WithItem WithItem() #WithItem: +{ + WithItem with = new WithItem(); + String name = null; + List selectItems = null; + SelectBody selectBody = null; +} +{ + [ { with.setRecursive(true); } ] name=RelObjectName() { with.setName(name); } + [ "(" selectItems=SelectItemsList() ")" { with.setWithItemList(selectItems); } ] + + "(" selectBody = SelectBody() { with.setSelectBody(selectBody); } ")" + { return with; } +} + +List SelectItemsList(): +{ + List selectItemsList = new ArrayList(); + SelectItem selectItem = null; +} +{ + selectItem=SelectItem() { selectItemsList.add(selectItem); } ("," selectItem=SelectItem() { selectItemsList.add(selectItem); } )* + + { return selectItemsList; } +} + +SelectExpressionItem SelectExpressionItem(): +{ + SelectExpressionItem selectExpressionItem = null; + Expression expression = null; + Alias alias = null; +} +{ + expression=SimpleExpression() { selectExpressionItem = new SelectExpressionItem(); selectExpressionItem.setExpression(expression); } + [alias=Alias() { selectExpressionItem.setAlias(alias); }] { return selectExpressionItem; } +} + +SelectItem SelectItem() #SelectItem: +{ + SelectItem selectItem = null; +} +{ ("*" { selectItem = new AllColumns(); } + | + LOOKAHEAD(AllTableColumns()) selectItem=AllTableColumns() + | + selectItem=SelectExpressionItem() + ) + { + linkAST(selectItem,jjtThis); + return selectItem; + } +} + +AllTableColumns AllTableColumns(): +{ + Table table = null; +} +{ + table=Table() "." "*" + { + return new AllTableColumns(table); + } + +} + +Alias Alias(): +{ String name = null; + Token token = null; + boolean useAs = false; } +{ + [ { useAs = true; } ] + ( name=RelObjectName() | token= { name=token.image; } ) + { return new Alias(name,useAs); } +} + +MySQLIndexHint MySQLIndexHint(): +{ + Token actionToken = null; + Token indexToken = null; + String indexName = null; + List indexNameList = new ArrayList(); +} +{ + (actionToken = + | actionToken = + | actionToken = ) + (indexToken = + | indexToken = ) + "(" + indexName = Identifier() { indexNameList.add(indexName); } + ("," indexName= Identifier() { indexNameList.add(indexName); })* + ")" + { + return new MySQLIndexHint(actionToken.image, indexToken.image, indexNameList); + } +} + +String Identifier(): +{ + Token tk = null; +} +{ + (tk= + | tk=) + { return tk.image; } +} + +FunctionItem FunctionItem(): +{ + Alias alias = null; + Function function; + FunctionItem functionItem; +} +{ + function=Function() { functionItem = new FunctionItem(); functionItem.setFunction(function); } + [alias=Alias() { functionItem.setAlias(alias); }] + { return functionItem; } +} + +List PivotForColumns(): +{ + List columns = new ArrayList(); + Column column; +} +{ + ( + ("(" column = Column() { columns.add(column); } + ("," column = Column() { columns.add(column); } )* + ")") + | column = Column() { columns.add(column); } + ) + { return columns; } +} + +List PivotFunctionItems(): +{ + List functionItems = new ArrayList(); + FunctionItem item; +} +{ + item = FunctionItem() {functionItems.add(item);} + ( "," item = FunctionItem() {functionItems.add(item);} )* + { return functionItems; } +} + +List PivotSingleInItems(): +{ + List retval = new ArrayList(); + SelectExpressionItem item; +} +{ + item = SelectExpressionItem() {retval.add(item);} + ("," item = SelectExpressionItem() {retval.add(item);} )* + { return retval; } +} + +ExpressionListItem ExpressionListItem(): +{ + ExpressionListItem expressionListItem = null; + ExpressionList expressionList = null; + Alias alias = null; +} +{ + "(" + expressionList=SimpleExpressionList() { expressionListItem = new ExpressionListItem(); expressionListItem.setExpressionList(expressionList); } + ")" + [alias=Alias() { expressionListItem.setAlias(alias); }] + { return expressionListItem; } +} + +List PivotMultiInItems(): +{ + List retval = new ArrayList(); + ExpressionListItem item; +} +{ + item = ExpressionListItem() {retval.add(item);} + ("," item = ExpressionListItem() {retval.add(item);} )* + { return retval; } +} + +Pivot Pivot(): +{ + Pivot retval = new Pivot(); + List functionItems; + List forColumns; + List singleInItems = null; + List multiInItems = null; + Alias alias = null; +} +{ + "(" functionItems = PivotFunctionItems() + forColumns = PivotForColumns() + "(" + (LOOKAHEAD(3) singleInItems = PivotSingleInItems() + | multiInItems = PivotMultiInItems() ) + ")" + ")" + [ alias = Alias() ] + { + retval.setFunctionItems(functionItems); + retval.setForColumns(forColumns); + retval.setSingleInItems(singleInItems); + retval.setMultiInItems(multiInItems); + retval.setAlias(alias); + return retval; + } +} + +PivotXml PivotXml(): +{ + PivotXml retval = new PivotXml(); + List functionItems; + List forColumns; + List singleInItems = null; + List multiInItems = null; + SelectBody inSelect = null; +} +{ + "(" functionItems = PivotFunctionItems() + forColumns = PivotForColumns() + "(" + ( + LOOKAHEAD(2) { retval.setInAny(true); } | + LOOKAHEAD(1) inSelect = SelectBody() | + LOOKAHEAD(2) singleInItems = PivotSingleInItems() | + multiInItems = PivotMultiInItems() + ) + ")" + ")" + { + retval.setFunctionItems(functionItems); + retval.setForColumns(forColumns); + retval.setSingleInItems(singleInItems); + retval.setMultiInItems(multiInItems); + retval.setInSelect(inSelect); + return retval; + } +} + +List
IntoClause(): +{ + List
tables = new ArrayList
(); + Table table; +} +{ + table=Table() { tables.add(table); } ("," table=Table() { tables.add(table); } )* + { + return tables; + } +} + +FromItem FromItem(): +{ + FromItem fromItem = null; + Pivot pivot = null; + Alias alias = null; + MySQLIndexHint indexHint = null; +} +{ + ( + LOOKAHEAD(ValuesList()) fromItem=ValuesList() + | + ( + ( + ( + "(" + ( + LOOKAHEAD(SubJoin()) + fromItem=SubJoin() + | + LOOKAHEAD(3) + fromItem=SubSelect() + | + fromItem=FromItem() + { fromItem = new ParenthesisFromItem(fromItem); } + ) + ")" + ) + | + LOOKAHEAD(TableFunction()) + fromItem=TableFunction() + | + fromItem=Table() + | + fromItem=LateralSubSelect() + ) + [ alias=Alias() { fromItem.setAlias(alias); } ] + [(LOOKAHEAD(2) pivot=PivotXml()|pivot=Pivot()) { fromItem.setPivot(pivot); } ] + [ + LOOKAHEAD(2) + indexHint=MySQLIndexHint() { + if (fromItem instanceof Table) + ((Table) fromItem).setHint(indexHint); + } + ] + ) + ) + { + return fromItem; + } +} + +FromItem ValuesList(): +{ + MultiExpressionList exprList = new MultiExpressionList(); + List primaryExpList = new ArrayList(); + ValuesList valuesList = new ValuesList(); + Expression exp = null; + List colNames = null; + String colName; + Alias alias; +} +{ + "(" + + (LOOKAHEAD(3) ("(" exp=SimpleExpression() { primaryExpList.add(exp); } + ("," exp=SimpleExpression() { primaryExpList.add(exp); } )* ")" { exprList.addExpressionList(primaryExpList); } + + ("," "(" exp=SimpleExpression() { + primaryExpList = new ArrayList(); + primaryExpList.add(exp); } + ("," exp=SimpleExpression() { primaryExpList.add(exp); } )* ")" { exprList.addExpressionList(primaryExpList); } )*) + | + ( exp=SimpleExpression() { exprList.addExpressionList(exp); valuesList.setNoBrackets(true); } + ("," exp=SimpleExpression() { exprList.addExpressionList(exp);} )* + )) + ")" + + [ alias=Alias() { valuesList.setAlias(alias); } + + [ "(" + colName = RelObjectName() { colNames = new ArrayList(); colNames.add(colName); } + ( "," colName = RelObjectName() { colNames.add(colName); } )* + ")" { valuesList.setColumnNames(colNames); } ] + + ] + + { + valuesList.setMultiExpressionList(exprList); + return valuesList; + } +} + +LateralSubSelect LateralSubSelect(): +{ + LateralSubSelect lateralSubSelect = new LateralSubSelect(); + SubSelect subSelect = null; +} +{ + + "(" subSelect=SubSelect() ")" + { + lateralSubSelect.setSubSelect(subSelect); + return lateralSubSelect; + } +} + +FromItem SubJoin(): +{ + FromItem fromItem = null; + Join join = null; + List joinList = null; + SubJoin subJoin = new SubJoin(); +} +{ + fromItem=FromItem() { subJoin.setLeft(fromItem); } + joinList=SubJoinsList() { subJoin.setJoinList(joinList); } + { + return subJoin; + } +} + +List JoinsList(): +{ + List joinsList = new ArrayList(); + Join join = null; +} +{ + (join=JoinerExpression() { joinsList.add(join); })* + { return joinsList; } +} + +List SubJoinsList(): +{ + List joinsList = new ArrayList(); + Join join = null; +} +{ + + (join=JoinerExpression() { joinsList.add(join); })+ + + { return joinsList; } +} + + +Join JoinerExpression() #JoinerExpression: +{ + Join join = new Join(); + FromItem right = null; + Expression onExpression = null; + Column tableColumn; + List columns = null; +} +{ + [ + { join.setLeft(true); } [ { join.setSemi(true); } | { join.setOuter(true); } ] + | ( { join.setRight(true); } + | { join.setFull(true); } + ) [ { join.setOuter(true); } ] + | { join.setInner(true); } + | { join.setNatural(true); } + | { join.setCross(true); } + ] + + ( | "," { join.setSimple(true); } ) + + right=FromItem() + + + [ + LOOKAHEAD(2) (( onExpression=Expression() { join.setOnExpression(onExpression); } ) + | + ( "(" tableColumn=Column() { columns = new ArrayList(); columns.add(tableColumn); } + ("," tableColumn=Column() { columns.add(tableColumn); } )* ")" + { join.setUsingColumns(columns); } )) + ] + { + linkAST(join,jjtThis); + join.setRightItem(right); + return join; + } +} + +Expression WhereClause(): +{ + Expression retval = null; +} +{ + retval=Expression() + { return retval; } +} + +OracleHierarchicalExpression OracleHierarchicalQueryClause(): +{ + OracleHierarchicalExpression result = new OracleHierarchicalExpression(); + Expression expr; +} +{ + ( + expr=AndExpression() {result.setStartExpression(expr);} + [ { result.setNoCycle(true); } ] expr=AndExpression() + { result.setConnectExpression(expr); } + | + [ { result.setNoCycle(true); } ] expr=AndExpression() + { + result.setConnectExpression(expr); + result.setConnectFirst(true); + } + [ expr=AndExpression() {result.setStartExpression(expr);} ] + ) + { + return result; + } +} + +List GroupByColumnReferences(): +{ + Expression columnReference = null; + List columnReferences = new ArrayList(); +} +{ + columnReference=SimpleExpression() {columnReferences.add(columnReference); } + ("," columnReference=SimpleExpression() {columnReferences.add(columnReference); } )* + { + return columnReferences; + } +} + +Expression Having(): +{ + Expression having = null; +} +{ + having=Expression() + { + return having; + } +} + +List OrderByElements(): +{ + List orderByList = new ArrayList(); + OrderByElement orderByElement = null; +} +{ + [ ] orderByElement=OrderByElement() { orderByList.add(orderByElement); } + ("," orderByElement=OrderByElement() { orderByList.add(orderByElement); } )* + { + return orderByList; + } +} + +OrderByElement OrderByElement(): +{ + OrderByElement orderByElement = new OrderByElement(); + Expression columnReference = null; +} +{ + columnReference = SimpleExpression() + [ ( | ( { orderByElement.setAsc(false); } )) { orderByElement.setAscDescPresent(true); } ] + [ ( + { orderByElement.setNullOrdering(OrderByElement.NullOrdering.NULLS_FIRST); } | + { orderByElement.setNullOrdering(OrderByElement.NullOrdering.NULLS_LAST); } + )? + ] + { + orderByElement.setExpression(columnReference); + return orderByElement; + } +} + +JdbcParameter SimpleJdbcParameter() : { + JdbcParameter retval; +} +{ + "?" { retval = new JdbcParameter(++jdbcParameterIndex, false); } + [ LOOKAHEAD(2) token = { retval.setUseFixedIndex(true); retval.setIndex(Integer.valueOf(token.image)); } ] + { + return retval; + } +} + +JdbcNamedParameter SimpleJdbcNamedParameter() : { + Token token; +} +{ + ":" token = + { + return new JdbcNamedParameter(token.image); + } +} + +Limit LimitWithOffset() #LimitWithOffset: +{ + Limit limit = new Limit(); + Token token = null; + JdbcParameter jdbc = null; +} +{ + ( + LOOKAHEAD(5) + // mysql-> LIMIT offset,row_count + + ( + token= { limit.setOffset(new LongValue(token.image)); } + | + jdbc = SimpleJdbcParameter() { limit.setOffset(jdbc); } + | + ":" { limit.setOffset(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = { ((JdbcNamedParameter)limit.getOffset()).setName(token.image); } ] + + ) + "," + + ( + token= { limit.setRowCount(new LongValue(token.image)); } + | + jdbc = SimpleJdbcParameter() { limit.setRowCount(jdbc); } + | + ":" { limit.setRowCount(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = { ((JdbcNamedParameter)limit.getRowCount()).setName(token.image); } ] + ) + | + limit = PlainLimit() + ) + { + linkAST(limit,jjtThis); + return limit; + } +} + +Limit PlainLimit() #PlainLimit: +{ + Limit limit = new Limit(); + Token token = null; + JdbcParameter jdbc; +} +{ + // mysql-postgresql-> LIMIT (row_count | ALL | NULL) + + ( + token= { limit.setRowCount(new LongValue(token.image)); } + | + jdbc = SimpleJdbcParameter() { limit.setRowCount(jdbc); } + | + ":" { limit.setRowCount(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = { ((JdbcNamedParameter)limit.getRowCount()).setName(token.image); } ] + | + { limit.setLimitAll(true);} + | + { limit.setLimitNull(true); } + ) + { + linkAST(limit,jjtThis); + return limit; + } +} + +Offset Offset(): +{ + Offset offset = new Offset(); + Token token = null; + JdbcParameter jdbc; + JdbcNamedParameter jdbcNamed; +} +{ + ( + // postgresql-> OFFSET offset + // sqlserver-oracle-> OFFSET offset (ROW | ROWS) + + (token= { offset.setOffset(Long.parseLong(token.image)); } + | jdbc = SimpleJdbcParameter() { offset.setOffsetJdbcParameter(jdbc); } + | jdbcNamed = SimpleJdbcNamedParameter() { offset.setOffsetJdbcParameter(jdbcNamed); }) + [( { offset.setOffsetParam("ROWS"); } | { offset.setOffsetParam("ROW"); })] + + ) + { + return offset; + } +} + +Fetch Fetch(): +{ + Fetch fetch = new Fetch(); + Token token = null; + JdbcParameter jdbc; +} +{ + ( + // sqlserver-oracle-> FETCH (FIRST | NEXT) row_count (ROW | ROWS) ONLY + + ( { fetch.setFetchParamFirst(true); } | ) + (token= { fetch.setRowCount(Long.parseLong(token.image)); } + | jdbc = SimpleJdbcParameter() { fetch.setFetchJdbcParameter(jdbc); } ) /* "?" { fetch.setFetchJdbcParameter(true); } ) */ + ( { fetch.setFetchParam("ROWS"); } | ) + + + ) + { + return fetch; + } +} + +// according to http://technet.microsoft.com/en-us/library/ms189463.aspx +Top Top(): +{ + Top top = new Top(); + Token token = null; + Expression expr = null; + JdbcParameter jdbc = null; +} +{ + + ( + token= { top.setExpression(new LongValue(token.image)); } + | + jdbc = SimpleJdbcParameter() { top.setExpression(jdbc); } + /*"?" { top.setExpression(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = { ((JdbcParameter)(top.getExpression())).setUseFixedIndex(true); ((JdbcParameter)(top.getExpression())).setIndex(Integer.valueOf(token.image)); } ]*/ + | + ":" { top.setExpression(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = { ((JdbcNamedParameter)top.getExpression()).setName(token.image); } ] + | + "(" + expr=AdditiveExpression() { top.setExpression(expr); } + { top.setParenthesis(true);} + ")" + ) [ LOOKAHEAD(2) { top.setPercentage(true); } ] + { + return top; + } +} + +// according to http://www-01.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.sqls.doc/ids_sqs_0156.htm +Skip Skip(): +{ + Skip skip = new Skip(); + Token token = null; + JdbcParameter jdbc; +} +{ + + ( + token= { skip.setRowCount(Long.parseLong(token.image)); } + | token= { skip.setVariable(token.image); } + | jdbc = SimpleJdbcParameter() { skip.setJdbcParameter(jdbc); } + /* "?" { skip.setJdbcParameter(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = { skip.getJdbcParameter().setUseFixedIndex(true); skip.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ] */ + ) + { + return skip; + } +} + +JAVACODE +OracleHint getOracleHint() { + OracleHint hint = null; + Token tok = getToken(1); + // Retrieve first comment (if any) prior next token + if (tok.specialToken != null) { + tok = tok.specialToken; + while (tok.specialToken != null) tok = tok.specialToken; + // Check if it matches Hint pattern? + if (OracleHint.isHintMatch(tok.image)) { + hint = new OracleHint(); + hint.setComment(tok.image); + } + } + return hint; +} + +First First(): +{ + First first = new First(); + Token token = null; + JdbcParameter jdbc; +} +{ + ( { first.setKeyword(First.Keyword.FIRST); } + | { first.setKeyword(First.Keyword.LIMIT); } + ) + ( + token= { first.setRowCount(Long.parseLong(token.image)); } + | token= { first.setVariable(token.image); } + | jdbc = SimpleJdbcParameter() { first.setJdbcParameter(jdbc); } + /* "?" { first.setJdbcParameter(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = { first.getJdbcParameter().setUseFixedIndex(true); first.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ] */ + ) + { + return first; + } +} + + +Expression Expression() #Expression : +{ + Expression retval = null; +} +{ + retval=OrExpression() + + { return retval; } +} + +Expression OrExpression(): +{ + Expression left, right, result; +} +{ + left=AndExpression() { result = left; } + ( + LOOKAHEAD() + + right=AndExpression() + { + result = new OrExpression(left, right); + left = result; + } + )* + { + return result; + } + +} + +Expression AndExpression() : +{ + Expression left, right, result; + boolean not = false; +} +{ + ( + LOOKAHEAD(Condition()) + left=Condition() + | + [ { not = true; } ] + "(" left=OrExpression() ")" {left = new Parenthesis(left); if (not) { ((Parenthesis)left).setNot(); not = false; } } + ) + { result = left; } + + ( + + ( + LOOKAHEAD(Condition()) + right=Condition() + | + [ { not = true; } ] + "(" right=OrExpression() ")" {right = new Parenthesis(right); if (not) { ((Parenthesis)right).setNot(); not = false; } } + ) + { + result = new AndExpression(left, right); + left = result; + } + )* + { + return result; + } +} + +Expression Condition(): +{ + Expression result; + Token token; +} +{ + (LOOKAHEAD(SQLCondition()) result=SQLCondition() + | LOOKAHEAD(RegularCondition()) result=RegularCondition() + | LOOKAHEAD(Function()) result=Function() + | result=Column() { result = new NotExpression(result); } + | result=Column() + | LOOKAHEAD({ "0".equals(getToken(1).image) || "1".equals(getToken(1).image) }) token= { result = new LongValue(token.image); } + ) + + { return result; } +} + +Expression RegularCondition() #RegularCondition: +{ + Expression result = null; + Expression leftExpression; + Expression rightExpression; + boolean not = false; + int oracleJoin=EqualsTo.NO_ORACLE_JOIN; + int oraclePrior=EqualsTo.NO_ORACLE_PRIOR; + boolean binary = false; +} +{ + [ LOOKAHEAD(2) { oraclePrior = EqualsTo.ORACLE_PRIOR_START; }] + [ { not = true; } ] + leftExpression=ComparisonItem() { result = leftExpression; } + + [ "(" "+" ")" { oracleJoin=EqualsTo.ORACLE_JOIN_RIGHT; } ] + + ( LOOKAHEAD(2) + ">" { result = new GreaterThan(); } + | "<" { result = new MinorThan(); } + | "=" { result = new EqualsTo(); } + | token= { result = new GreaterThanEquals(token.image); } + | token= { result = new MinorThanEquals(token.image); } + | token= { result = new NotEqualsTo(token.image); } + | token= { result = new NotEqualsTo(token.image); } + | "@@" { result = new Matches(); } + | "~" { result = new RegExpMatchOperator(RegExpMatchOperatorType.MATCH_CASESENSITIVE); } + | [ { binary=true; } ] { result = new RegExpMySQLOperator(binary?RegExpMatchOperatorType.MATCH_CASESENSITIVE:RegExpMatchOperatorType.MATCH_CASEINSENSITIVE); } + | [ { binary=true; } ] { result = new RegExpMySQLOperator(binary?RegExpMatchOperatorType.MATCH_CASESENSITIVE:RegExpMatchOperatorType.MATCH_CASEINSENSITIVE).useRLike(); } + | "~*" { result = new RegExpMatchOperator(RegExpMatchOperatorType.MATCH_CASEINSENSITIVE); } + | "!~" { result = new RegExpMatchOperator(RegExpMatchOperatorType.NOT_MATCH_CASESENSITIVE); } + | "!~*" { result = new RegExpMatchOperator(RegExpMatchOperatorType.NOT_MATCH_CASEINSENSITIVE); } + + | "@>" { result = new JsonOperator("@>"); } + | "<@" { result = new JsonOperator("<@"); } + | "?" { result = new JsonOperator("?"); } + | "?|" { result = new JsonOperator("?|"); } + | "?&" { result = new JsonOperator("?&"); } + | { result = new JsonOperator("||"); } + | "-" { result = new JsonOperator("-"); } + | "-#" { result = new JsonOperator("-#"); } + ) + + ( LOOKAHEAD(2) rightExpression=ComparisonItem() { oraclePrior = EqualsTo.ORACLE_PRIOR_END; } + | rightExpression=ComparisonItem() ) + + [ "(" "+" ")" { oracleJoin=EqualsTo.ORACLE_JOIN_LEFT; } ] + + { + BinaryExpression regCond = (BinaryExpression) result; + regCond.setLeftExpression(leftExpression); + regCond.setRightExpression(rightExpression); + if (not) + regCond.setNot(); + + if (oracleJoin>0) + ((SupportsOldOracleJoinSyntax)result).setOldOracleJoinSyntax(oracleJoin); + + if (oraclePrior!=EqualsTo.NO_ORACLE_PRIOR) + ((SupportsOldOracleJoinSyntax)result).setOraclePriorPosition(oraclePrior); + } + + { + linkAST(result,jjtThis); + return result; + } +} + +Expression SQLCondition(): +{ + Expression result; +} +{ + ( + LOOKAHEAD(InExpression()) result=InExpression() + | LOOKAHEAD(Between()) result=Between() + | LOOKAHEAD(IsNullExpression()) result=IsNullExpression() + | LOOKAHEAD(ExistsExpression()) result=ExistsExpression() + | result=LikeExpression() + ) + { return result; } +} + +Expression InExpression() : +{ + InExpression result = new InExpression(); + ItemsList leftItemsList = null; + ItemsList rightItemsList = null; + Expression leftExpression = null; +} +{ + ( LOOKAHEAD(3) "(" ( + LOOKAHEAD(SimpleExpressionList()) leftItemsList = SimpleExpressionList() { result.setLeftItemsList(leftItemsList); } + | + leftExpression=SimpleExpression() + [ "(" "+" ")" { result.setOldOracleJoinSyntax(EqualsTo.ORACLE_JOIN_RIGHT); } ] + ) + ")" + | + leftExpression=SimpleExpression() { result.setLeftExpression(leftExpression); } + [ "(" "+" ")" { result.setOldOracleJoinSyntax(EqualsTo.ORACLE_JOIN_RIGHT); } ] + ) + [ { result.setNot(true); } ] "(" (LOOKAHEAD(3) rightItemsList=SubSelect() | rightItemsList=SimpleExpressionList() ) ")" + { + result.setRightItemsList(rightItemsList); + return result; + } +} + +Expression Between() : +{ + Between result = new Between(); + Expression leftExpression = null; + Expression betweenExpressionStart = null; + Expression betweenExpressionEnd = null; +} +{ + leftExpression=SimpleExpression() + [ { result.setNot(true); }] + betweenExpressionStart=SimpleExpression() betweenExpressionEnd=SimpleExpression() + + { + result.setLeftExpression(leftExpression); + result.setBetweenExpressionStart(betweenExpressionStart); + result.setBetweenExpressionEnd(betweenExpressionEnd); + return result; + } +} + +Expression LikeExpression() #LikeExpression: +{ + LikeExpression result = new LikeExpression(); + Expression leftExpression = null; + Expression rightExpression = null; +} +{ + ( + LOOKAHEAD(3) ( + leftExpression=SimpleExpression() + [ { result.setNot(true); } ] ( | { result.setCaseInsensitive(true); } ) rightExpression=SimpleExpression() + [ token= { result.setEscape((new StringValue(token.image)).getValue()); }] + ) + | + ( + [ { result.setNot(true); } ] leftExpression=SimpleExpression() ( | { result.setCaseInsensitive(true); } ) rightExpression=SimpleExpression() + [ token= { result.setEscape((new StringValue(token.image)).getValue()); }] + ) + ) + { + result.setLeftExpression(leftExpression); + result.setRightExpression(rightExpression); + linkAST(result,jjtThis); + return result; + } +} + +Expression IsNullExpression(): +{ + IsNullExpression result = new IsNullExpression(); + Expression leftExpression = null; +} +{ + ( + { result.setNot(true); } leftExpression=SimpleExpression() + ( { result.setUseIsNull(true); } | ) + | + leftExpression=SimpleExpression() + ( { result.setUseIsNull(true); } | [ { result.setNot(true); } ] ) + ) + + { + result.setLeftExpression(leftExpression); + return result; + } +} + +Expression ExistsExpression(): +{ + ExistsExpression result = new ExistsExpression(); + Expression rightExpression = null; +} +{ + [ { result.setNot(true); } ] rightExpression=SimpleExpression() + { + result.setRightExpression(rightExpression); + return result; + } +} + +ExpressionList SQLExpressionList(): +{ + ExpressionList retval = new ExpressionList(); + List expressions = new ArrayList(); + Expression expr = null; +} +{ + expr=Expression() { expressions.add(expr); } ("," expr=Expression() { expressions.add(expr); })* + { + retval.setExpressions(expressions); + return retval; + } +} + +ExpressionList SimpleExpressionList(): +{ + ExpressionList retval = new ExpressionList(); + List expressions = new ArrayList(); + Expression expr = null; +} +{ + expr=SimpleExpression() { expressions.add(expr); } ("," expr=SimpleExpression() { expressions.add(expr); })* + { + retval.setExpressions(expressions); + return retval; + } +} + +ExpressionList SimpleExpressionListAtLeastTwoItems(): +{ + ExpressionList retval = new ExpressionList(); + List expressions = new ArrayList(); + Expression expr = null; +} +{ + expr=SimpleExpression() { expressions.add(expr); } ("," expr=SimpleExpression() { expressions.add(expr); })+ + { + retval.setExpressions(expressions); + return retval; + } +} + +Expression ComparisonItem() : +{ + Expression retval = null; +} +{ + ( + retval=AllComparisonExpression() + | LOOKAHEAD(3) retval=AnyComparisonExpression() + | LOOKAHEAD(ValueListExpression()) retval=ValueListExpression() + | LOOKAHEAD(3) retval=SimpleExpression() + | retval=RowConstructor() + ) + + { + return retval; + } +} + +Expression AllComparisonExpression() : +{ + AllComparisonExpression retval = null; + SubSelect subselect = null; +} +{ + "(" subselect=SubSelect() ")" { retval = new AllComparisonExpression(subselect); } + { + return retval; + } +} + +Expression AnyComparisonExpression() : +{ + AnyComparisonExpression retval = null; + AnyType anyType; + SubSelect subselect = null; +} +{ + ( { anyType = AnyType.ANY; } | { anyType = AnyType.SOME; } ) + "(" subselect=SubSelect() ")" { retval = new AnyComparisonExpression(anyType, subselect); } + { + return retval; + } +} + +Expression SimpleExpression(): +{ + Expression retval = null; +} +{ + ( + retval=ConcatExpression() + ) + + { + return retval; + } +} + +Expression ConcatExpression(): +{ + Expression result = null; + Expression leftExpression = null; + Expression rightExpression = null; +} +{ + leftExpression=BitwiseAndOr() { result = leftExpression; } + (LOOKAHEAD(3) + /* Oracle allows space between the bars. */ + rightExpression=BitwiseAndOr() + { + Concat binExp = new Concat(); + binExp.setLeftExpression(leftExpression); + binExp.setRightExpression(rightExpression); + result = binExp; + leftExpression = result; + } + )* + + { return result; } +} + +Expression BitwiseAndOr(): +{ + Expression result = null; + Expression leftExpression = null; + Expression rightExpression = null; +} +{ + leftExpression=AdditiveExpression() { result = leftExpression; } + ( + ( + "|" { result = new BitwiseOr(); } + | + "&" { result = new BitwiseAnd(); } + | + "<<" { result = new BitwiseLeftShift(); } + | + ">>" { result = new BitwiseRightShift(); } + ) + + rightExpression=AdditiveExpression() + + { + BinaryExpression binExp = (BinaryExpression) result; + binExp.setLeftExpression(leftExpression); + binExp.setRightExpression(rightExpression); + leftExpression = result; + } + )* + + { return result; } +} + +Expression AdditiveExpression(): +{ + Expression result = null; + Expression leftExpression = null; + Expression rightExpression = null; +} +{ + leftExpression=MultiplicativeExpression() { result = leftExpression; } + ( LOOKAHEAD(2) + ("+" { result = new Addition(); } + | "-" { result = new Subtraction(); } ) + + rightExpression=MultiplicativeExpression() + { + BinaryExpression binExp = (BinaryExpression) result; + binExp.setLeftExpression(leftExpression); + binExp.setRightExpression(rightExpression); + leftExpression = result; + } + )* + + { return result; } +} + +Expression MultiplicativeExpression(): +{ + Expression result = null; + Expression leftExpression = null; + Expression rightExpression = null; +} +{ + ( + leftExpression=BitwiseXor() + ) + { result = leftExpression; } + ( + LOOKAHEAD(2) ("*" { result = new Multiplication(); } + | "/" { result = new Division(); } + | "%" { result = new Modulo(); } + ) + + rightExpression=BitwiseXor() + + { + BinaryExpression binExp = (BinaryExpression) result; + binExp.setLeftExpression(leftExpression); + binExp.setRightExpression(rightExpression); + leftExpression = result; + } + )* + { return result; } +} + +Expression BitwiseXor(): +{ + Expression result = null; + Expression leftExpression = null; + Expression rightExpression = null; +} +{ + leftExpression=PrimaryExpression() { result = leftExpression; } + ( + "^" + rightExpression=PrimaryExpression() + { + BitwiseXor binExp = new BitwiseXor(); + binExp.setLeftExpression(leftExpression); + binExp.setRightExpression(rightExpression); + result = binExp; + leftExpression = result; + } + )* + + { return result; } +} + +Expression PrimaryExpression() #PrimaryExpression: +{ + Expression retval = null; + CastExpression castExpr = null; + Token token = null; + Token sign = null; + String tmp = ""; + ColDataType type = null; +} +{ +[sign="+" | sign="-" | sign="~"] +( + { retval = new NullValue(); } + + | retval=CaseWhenExpression() + + | retval = SimpleJdbcParameter() + + | LOOKAHEAD(2) retval=JdbcNamedParameter() + + | retval=UserVariable() + + | LOOKAHEAD(2) retval=NumericBind() + + | LOOKAHEAD(AnalyticExpression()) retval=AnalyticExpression() + + | LOOKAHEAD(3) retval=ExtractExpression() + + | retval=MySQLGroupConcat() + + | LOOKAHEAD(JsonExpression()) retval=JsonExpression() + + | LOOKAHEAD(Function()) retval=Function() + + | token= { retval = new DoubleValue(token.image); } + + | token= { retval = new LongValue(token.image); } + + | token= { retval = new HexValue(token.image); } + + | LOOKAHEAD(2) retval=CastExpression() + + // support timestamp expressions + | token= { retval = new TimeKeyExpression(token.image); } + + | LOOKAHEAD(2) retval=DateTimeLiteralExpression() + + | retval=Column() + + | LOOKAHEAD("(" SimpleExpression() ")") "(" retval=SimpleExpression() ")" {retval = new Parenthesis(retval); } + + | LOOKAHEAD(3) "(" retval=SubSelect() ")" + + | token= { retval = new StringValue(token.image); linkAST(retval,jjtThis); } + + | "{d" token= "}" { retval = new DateValue(token.image); } + + | "{t" token= "}" { retval = new TimeValue(token.image); } + + | "{ts" token= "}" { retval = new TimestampValue(token.image); } + + | retval = IntervalExpression() +) + + ( "::" type=ColDataType() { + castExpr = new CastExpression(); + castExpr.setUseCastKeyword(false); + castExpr.setLeftExpression(retval); + castExpr.setType(type); + retval=castExpr; + } )* + + { + if (sign != null) { + retval = new SignedExpression(sign.image.charAt(0), retval); + } + return retval; + } +} + +JdbcNamedParameter JdbcNamedParameter() : { + JdbcNamedParameter parameter = new JdbcNamedParameter(); + String name; +} +{ + ":" (name=RelObjectNameExt2() { parameter.setName(name); }) + { + return parameter; + } +} + +UserVariable UserVariable() : { + UserVariable var = new UserVariable(); + String varName; +} +{ + ("@" | "@@" { var.setDoubleAdd(true);} ) + varName=RelObjectNameExt2() + { + var.setName(varName); + return var; + } +} + +NumericBind NumericBind() : { + NumericBind var = new NumericBind(); + Token token; +} +{ + ":" token= + { + var.setBindId(Integer.valueOf(token.image)); + return var; + } +} + +DateTimeLiteralExpression DateTimeLiteralExpression() : { + DateTimeLiteralExpression expr = new DateTimeLiteralExpression(); + Token t; +} { + t= { expr.setType(DateTimeLiteralExpression.DateTime.valueOf(t.image.toUpperCase())); } + + t= { expr.setValue(t.image); return expr; } +} + +JsonExpression JsonExpression() : { + JsonExpression result = new JsonExpression(); + Column column; + Token token; +} +{ + column=Column() ( + "->" token= {result.addIdent(token.image,"->");} | + "->>" token= {result.addIdent(token.image,"->>");} | + "#>" token= {result.addIdent(token.image,"#>");} | + "#>>" token= {result.addIdent(token.image,"#>>");} + )+ + { + result.setColumn(column); + return result; + } +} + +IntervalExpression IntervalExpression() : { + IntervalExpression interval = new IntervalExpression(); + Token token; + boolean signed = false; +} +{ + ["-" {signed=true;}] (token= | token= | token=) + { interval.setParameter((signed?"-":"") + token.image); } + [ LOOKAHEAD(2) token = { interval.setIntervalType(token.image); } ] + { + return interval; + } +} + +KeepExpression KeepExpression() : { + KeepExpression keep = new KeepExpression(); + Token token; + List list; +} +{ + "(" token = ( { keep.setFirst(true); } | { keep.setFirst(false); }) + list = OrderByElements() ")" + + { + keep.setName(token.image); + keep.setOrderByElements(list); + return keep; + } +} + +AnalyticExpression AnalyticExpression() : +{ + AnalyticExpression retval = new AnalyticExpression(); + ExpressionList expressionList = null; + List olist = null; + Token token = null; + Expression expr = null; + Expression offset = null; + Expression defaultValue = null; + WindowElement windowElement = null; + KeepExpression keep = null; + boolean distinct = false; +} +{ + token= { retval.setName(token.image); } + "(" [ + [ {distinct = true;} ] + (expr=SimpleExpression() ["," offset=SimpleExpression() ["," defaultValue=SimpleExpression() ]] | "*" { retval.setAllColumns(true); } ) + ] ")" + + [ keep=KeepExpression() ] + + ( {retval.setType(AnalyticType.OVER);} + | {retval.setType(AnalyticType.WITHIN_GROUP);} ) + + "(" + [ expressionList=SimpleExpressionList() ] + [olist=OrderByElements() [windowElement = WindowElement() ] ] + + { + retval.setDistinct(distinct); + retval.setExpression(expr); + retval.setOffset(offset); + retval.setDefaultValue(defaultValue); + retval.setKeep(keep); + retval.setPartitionExpressionList(expressionList); + retval.setOrderByElements(olist); + retval.setWindowElement(windowElement); + } + ")" + { + return retval; + } +} + +WindowElement WindowElement(): +{ + WindowElement windowElement = new WindowElement(); + WindowRange range = new WindowRange(); + WindowOffset offset = null; +} +{ + ( { windowElement.setType(WindowElement.Type.ROWS); } | { windowElement.setType(WindowElement.Type.RANGE); } ) + ( ( + { windowElement.setRange(range); } + offset = WindowOffset() { range.setStart(offset); } + offset = WindowOffset() { range.setEnd(offset); } + ) + | + offset = WindowOffset() { windowElement.setOffset(offset); } + ) + + { + return windowElement; + } +} + +WindowOffset WindowOffset(): +{ + WindowOffset offset = new WindowOffset(); + Expression expr = null; +} +{ + ( + ( + ( { offset.setType(WindowOffset.Type.PRECEDING); } | + { offset.setType(WindowOffset.Type.FOLLOWING); } ) + ) + | + ( { offset.setType(WindowOffset.Type.CURRENT); } ) + | + ( expr = SimpleExpression() { + offset.setType(WindowOffset.Type.EXPR); + offset.setExpression(expr); + } + ( { offset.setType(WindowOffset.Type.PRECEDING); } | { offset.setType(WindowOffset.Type.FOLLOWING); } ) + ) + ) + + { + return offset; + } +} + +ExtractExpression ExtractExpression() : +{ + ExtractExpression retval = new ExtractExpression(); + Token token = null; + Expression expr = null; +} +{ + + "(" + token= { retval.setName(token.image); } + + expr=SimpleExpression() { retval.setExpression(expr); } + ")" + { + return retval; + } +} + +CastExpression CastExpression(): +{ + CastExpression retval = new CastExpression(); + ColDataType type = null; + Expression expression = null; + boolean useCastKeyword; +} +{ + "(" expression=SimpleExpression() type=ColDataType() ")" { retval.setUseCastKeyword(true); } + + { + retval.setLeftExpression(expression); + retval.setType(type); + return retval; + } +} + +Expression CaseWhenExpression() #CaseWhenExpression: +{ + CaseExpression caseExp = new CaseExpression(); + Expression switchExp = null; + WhenClause clause; + List whenClauses = new ArrayList(); + Expression elseExp = null; +} +{ + + ( + ( clause=WhenThenSearchCondition() { whenClauses.add(clause); } )+ + | + (LOOKAHEAD(RegularCondition()) switchExp=RegularCondition() | switchExp=BitwiseAndOr()) + ( clause=WhenThenValue() { whenClauses.add(clause); } )+ + ) + [ elseExp=SimpleExpression()] + + { + caseExp.setSwitchExpression(switchExp); + caseExp.setWhenClauses(whenClauses); + caseExp.setElseExpression(elseExp); + return caseExp; + } +} + +WhenClause WhenThenSearchCondition(): +{ + WhenClause whenThen = new WhenClause(); + Expression whenExp = null; + Expression thenExp = null; +} +{ + (LOOKAHEAD(Expression()) whenExp=Expression() | whenExp=SimpleExpression()) thenExp=SimpleExpression() + { + whenThen.setWhenExpression(whenExp); + whenThen.setThenExpression(thenExp); + return whenThen; + } +} + +WhenClause WhenThenValue(): +{ + WhenClause whenThen = new WhenClause(); + Expression whenExp = null; + Expression thenExp = null; +} +{ + whenExp=SimpleExpression() thenExp=SimpleExpression() + { + whenThen.setWhenExpression(whenExp); + whenThen.setThenExpression(thenExp); + return whenThen; + } +} + +RowConstructor RowConstructor(): { + ExpressionList list = null; + RowConstructor rowConstructor = new RowConstructor(); +} { + [ { rowConstructor.setName("ROW");} ] + "(" + list = SimpleExpressionList() + ")" + + { + rowConstructor.setExprList(list); + return rowConstructor; + } +} + +Execute Execute(): { + String funcName = null; + ExpressionList expressionList = null; + Execute execute = new Execute(); +} +{ + ( { execute.setExecType(Execute.EXEC_TYPE.EXEC); } + | { execute.setExecType(Execute.EXEC_TYPE.EXECUTE); } + | { execute.setExecType(Execute.EXEC_TYPE.CALL); } ) + + funcName=RelObjectName() { execute.setName(funcName); } + + [ expressionList=SimpleExpressionList() ] + + { + execute.setExprList(expressionList); + return execute; + } +} + +Function Function() #Function: +{ + Function retval = new Function(); + String funcName = null; + String tmp = null; + ExpressionList expressionList = null; + KeepExpression keep = null; + SubSelect expr = null; +} +{ + ["{fn" { retval.setEscaped(true); } ] + + funcName=RelObjectNameExt() + + [ "." tmp=RelObjectNameExt() { funcName+= "." + tmp; } ["." tmp=RelObjectNameExt() { funcName+= "." + tmp; }]] + "(" [ [ { retval.setDistinct(true); } | { retval.setAllColumns(true); }] (LOOKAHEAD(3) expressionList=SimpleExpressionList() | "*" { retval.setAllColumns(true); } + | expr = SubSelect() { expr.setUseBrackets(false); expressionList = new ExpressionList(expr); } ) ] ")" + + [ "." tmp=RelObjectName() { retval.setAttribute(tmp); }] + + [ keep = KeepExpression() ] + + ["}"] + { + retval.setParameters(expressionList); + retval.setName(funcName); + retval.setKeep(keep); + linkAST(retval,jjtThis); + return retval; + } +} + +MySQLGroupConcat MySQLGroupConcat():{ + MySQLGroupConcat retval = new MySQLGroupConcat(); + ExpressionList expressionList = null; + List orderByList = null; + Token t; +} +{ + "(" + [ { retval.setDistinct(true); } ] + expressionList = SimpleExpressionList() + [ orderByList = OrderByElements() { retval.setOrderByElements(orderByList); } ] + [ t= { retval.setSeparator(t.image); } ] + ")" + { + retval.setExpressionList(expressionList); + return retval; + } +} + +ValueListExpression ValueListExpression(): +{ + ValueListExpression retval = new ValueListExpression(); + ExpressionList expressionList = null; +} +{ + "(" expressionList = SimpleExpressionListAtLeastTwoItems() ")" + { + retval.setExpressionList(expressionList); + return retval; + } +} + +TableFunction TableFunction(): +{ + Alias alias = null; + Function function; + TableFunction functionItem; +} +{ + function=Function() { functionItem = new TableFunction(); functionItem.setFunction(function); } + [LOOKAHEAD(2) alias=Alias() { functionItem.setAlias(alias); }] + { return functionItem; } +} + +SubSelect SubSelect() #SubSelect: +{ + SelectBody selectBody = null; + SubSelect subSelect = new SubSelect(); + List with = null; +} +{ + [ with=WithList() { subSelect.setWithItemsList(with); } ] + selectBody=SelectBody() + { + subSelect.setSelectBody(selectBody); + return subSelect; + } +} + +CreateIndex CreateIndex(): +{ + CreateIndex createIndex = new CreateIndex(); + Table table = null; + List colNames = new ArrayList(); + Token columnName; + Index index = null; + String name = null; + List parameter = new ArrayList(); +} +{ + + ( parameter=CreateParameter() )* + + name=RelObjectName() + { + index = new Index(); + index.setName(name); + index.setType(parameter.isEmpty()?null:parameter.get(0)); + } + + table=Table() + + "(" + (columnName= + | + columnName=) + + (CreateParameter() | | )* + { + colNames.add(columnName.image); + } + + ( + "," + (columnName= + | + columnName=) + + (CreateParameter() | | )* + { + colNames.add(columnName.image); + } + )* + + ")" + (CreateParameter() {})* + + { + index.setColumnsNames(colNames); + createIndex.setIndex(index); + createIndex.setTable(table); + return createIndex; + } +} + +CreateTable CreateTable(): +{ + CreateTable createTable = new CreateTable(); + Table table = null; + List columnDefinitions = new ArrayList(); + List columnSpecs = null; + List tableOptions = new ArrayList(); + List createOptions = new ArrayList(); + String columnName; + Token tk = null; + Token tk2 = null; + Token tk3 = null; + String sk3 = null; + ColDataType colDataType = null; + String stringList = null; + ColumnDefinition coldef = null; + List indexes = new ArrayList(); + List colNames = null; + Index index = null; + ForeignKeyIndex fkIndex = null; + List parameter = new ArrayList(); + List idxSpec = new ArrayList(); + Table fkTable = null; + Select select = null; + CheckConstraint checkCs = null; + ExcludeConstraint excludeC = null; +} +{ + + [ { createTable.setUnlogged(true); } ] + + /* [ [ (tk= | tk=) {createOptions.add(tk.image);} ] + ( tk= | tk= ) {createOptions.add(tk.image);}] */ + + (parameter = CreateParameter() { createOptions.addAll(parameter); })* + + + [ { createTable.setIfNotExists(true); }] + table=Table() + [ + ("(" + columnName=RelObjectName() + + colDataType = ColDataType() + { + columnSpecs = new ArrayList(); + } + + ( parameter=CreateParameter() { columnSpecs.addAll(parameter); } )* + + { + coldef = new ColumnDefinition(); + coldef.setColumnName(columnName); + coldef.setColDataType(colDataType); + if (columnSpecs.size() > 0) + coldef.setColumnSpecStrings(columnSpecs); + columnDefinitions.add(coldef); + } + + ( + "," + + ( + LOOKAHEAD(3) ( + tk= + sk3=RelObjectName() + colNames=ColumnsNamesList() + { + index = new Index(); + index.setType(tk.image); + index.setName(sk3); + index.setColumnsNames(colNames); + indexes.add(index); + } + ) + | + LOOKAHEAD(3) ( + { + index = new NamedConstraint(); + } + [ sk3=RelObjectName() {index.setName(sk3);} ] + + (tk= tk2= {index.setType(tk.image + " " + tk2.image);} + | tk= [ tk2= ] {index.setType(tk.image + (tk2!=null?" " + tk2.image:""));} + ) + colNames=ColumnsNamesList() + ( parameter=CreateParameter() { idxSpec.addAll(parameter); } )* + { + index.setColumnsNames(colNames); + index.setIndexSpec(idxSpec); + indexes.add(index); + } + ) + | + LOOKAHEAD(3) ( {tk=null;} + [ tk= ] [ tk3= ] tk2= + sk3=RelObjectName() + colNames=ColumnsNamesList() + { + index = new Index(); + index.setType((tk!=null?tk.image + " ":"") + (tk3!=null?tk3.image + " ":"") + tk2.image); + index.setName(sk3); + index.setColumnsNames(colNames); + indexes.add(index); + } + ) + | + LOOKAHEAD(3)( + { + fkIndex = new ForeignKeyIndex(); + } + [ sk3=RelObjectName() {fkIndex.setName(sk3);} ] + tk= tk2= + colNames=ColumnsNamesList() + { + fkIndex.setType(tk.image + " " + tk2.image); + fkIndex.setColumnsNames(colNames); + } + fkTable=Table() colNames=ColumnsNamesList() + { + fkIndex.setTable(fkTable); + fkIndex.setReferencedColumnNames(colNames); + indexes.add(fkIndex); + } + [LOOKAHEAD(2) ( + ( {fkIndex.setOnDeleteReferenceOption("CASCADE");} + | + {fkIndex.setOnDeleteReferenceOption("NO ACTION");} + | + {fkIndex.setOnDeleteReferenceOption("SET NULL");} + ))] + [LOOKAHEAD(2) ( ( {fkIndex.setOnUpdateReferenceOption("CASCADE");}| {fkIndex.setOnUpdateReferenceOption("NO ACTION");}))] + ) + | + LOOKAHEAD(3)( + [ sk3 = RelObjectName()] + {Expression exp = null;} + ("(" exp = Expression() ")")* { + checkCs = new CheckConstraint(); + checkCs.setName(sk3); + checkCs.setExpression(exp); + indexes.add(checkCs); + } + ) + | + tk= {excludeC = new ExcludeConstraint(); Expression exp = null;} + (tk2= + ("(" exp = Expression() ")")* {excludeC.setExpression(exp);}) + { + indexes.add(excludeC); + } + | + ( + columnName=RelObjectName() + + colDataType = ColDataType() + { + columnSpecs = new ArrayList(); + } + + ( parameter=CreateParameter() { columnSpecs.addAll(parameter); } )* + + { + coldef = new ColumnDefinition(); + coldef.setColumnName(columnName); + coldef.setColDataType(colDataType); + if (columnSpecs.size() > 0) + coldef.setColumnSpecStrings(columnSpecs); + columnDefinitions.add(coldef); + } + ) + ) + )* + + ")" + ( parameter=CreateParameter() { tableOptions.addAll(parameter); } )* + ) + | + ( + ( LOOKAHEAD("(" Select() ")") "(" select = Select() { createTable.setSelect(select, true); } ")" + | select = Select() { createTable.setSelect(select, false); } ) + ) + ] + + { + createTable.setTable(table); + if (indexes.size() > 0) + createTable.setIndexes(indexes); + if (createOptions.size() > 0) + createTable.setCreateOptionsStrings(createOptions); + if (tableOptions.size() > 0) + createTable.setTableOptionsStrings(tableOptions); + if (columnDefinitions.size() > 0) + createTable.setColumnDefinitions(columnDefinitions); + return createTable; + } +} + +ColDataType ColDataType(): +{ + ColDataType colDataType = new ColDataType(); + Token tk = null; + Token tk2 = null; + ArrayList argumentsStringList = new ArrayList(); + List array = new ArrayList(); +} +{ + ( + (tk= | tk=) [tk2=] { colDataType.setDataType(tk.image + (tk2!=null?" " + tk2.image:"")); } + | tk= [LOOKAHEAD(2) tk2=] { colDataType.setDataType(tk.image + (tk2!=null?" " + tk2.image:"")); } + | ( tk= | tk= | tk= | tk= | tk= ) + { colDataType.setDataType(tk.image); } + | tk= tk2= {colDataType.setDataType(tk.image + " " + tk2.image);} + ) + + [LOOKAHEAD(2) "(" ( (tk= | tk= | tk= ) { argumentsStringList.add(tk.image); } ["," {/*argumentsStringList.add(",");*/}] )* ")"] + [( "[" {tk=null;} [ tk= ] { array.add(tk!=null?Integer.valueOf(tk.image):null); } "]" )+ { colDataType.setArrayData(array); } ] + [ tk= { colDataType.setCharacterSet(tk.image); } ] + + { + if (argumentsStringList.size() > 0) + colDataType.setArgumentsStringList(argumentsStringList); + return colDataType; + } +} + +CreateView CreateView(): +{ + CreateView createView = new CreateView(); + Table view = null; + SelectBody select = null; + List columnNames = null; +} +{ + + [ { createView.setOrReplace(true);} ] + [ + { createView.setForce(ForceOption.NO_FORCE); } + | { createView.setForce(ForceOption.FORCE); } + ] + [ + { createView.setTemporary(TemporaryOption.TEMP); } + | { createView.setTemporary(TemporaryOption.TEMPORARY); } + ] + [ { createView.setMaterialized(true);} ] + view=Table() { createView.setView(view); } + [ columnNames = ColumnsNamesList() { createView.setColumnNames(columnNames); } ] + + select=SelectBody() { createView.setSelectBody(select); } + { return createView; } +} + +AlterView AlterView(): +{ + AlterView alterView = new AlterView(); + Table view = null; + SelectBody select = null; + List columnNames = null; +} +{ + + view=Table() { alterView.setView(view); } + [ columnNames = ColumnsNamesList() { alterView.setColumnNames(columnNames); } ] + + select=SelectBody() { alterView.setSelectBody(select); } + { return alterView; } +} + +List CreateParameter(): +{ + String retval = ""; + Token tk = null; + Token tk2 = null; + StringBuilder identifier = new StringBuilder(""); + Expression exp = null; + List param = new ArrayList(); +} +{ + ( + (((tk= | tk=) { identifier.append(tk.image); } + ["." (tk2= | tk2=) { identifier.append("."); identifier.append(tk2.image); }]) + { param.add(identifier.toString()); }) + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + ("+" {retval = "+";} | "-" {retval = "-";})? + ( + tk= { retval += tk.image; } + | + tk= { retval += tk.image; } + ) + { param.add(retval); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(new TimeKeyExpression(tk.image).toString()); } + | + "=" { param.add("="); } + | + LOOKAHEAD(3) retval=RelObjectName() { param.add("USING"); param.add("INDEX"); param.add("TABLESPACE"); param.add(retval); } + | + retval=RelObjectName() { param.add("TABLESPACE"); param.add(retval); } + | + retval=AList() { param.add(retval); } + | + ("(" exp = Expression() ")") { param.add("CHECK"); param.add("(" + exp.toString() + ")");} + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + | + tk= { param.add(tk.image); } + + ) + {return param;} +} + +String AList(): +{ + StringBuilder retval = new StringBuilder("("); + Token tk = null; + Token tk2 = null; +} +{ + "(" + + ( (tk= | tk= | tk= | tk= | tk=) { retval.append(tk.image); } + [("," {retval.append(",");} | "=" {retval.append("=");})] )* + + ")" + { + retval.append(")"); + return retval.toString(); + } +} + +List ColumnsNamesList(): +{ + List retval = new ArrayList(); + Token tk = null; +} +{ + "(" + + (tk= | tk=) { retval.add(tk.image); } + ( "," (tk= | tk=) { retval.add(tk.image); } )* + + ")" + { + return retval; + } +} + +Drop Drop(): +{ + Drop drop = new Drop(); + Token tk = null; + Table name; + List dropArgs = new ArrayList(); +} +{ + + ( + tk= + | + tk= + | + tk= + | + tk= + ) + { drop.setType(tk.image); } + + [ {drop.setIfExists(true);} ] + + name = Table() { drop.setName(name); } + ((tk= | tk= | tk= ) { dropArgs.add(tk.image); })* + + { + if (dropArgs.size() > 0) + drop.setParameters(dropArgs); + return drop; + } +} + +Truncate Truncate(): +{ + Truncate truncate = new Truncate(); + Table table; +} +{ + + table=Table() { truncate.setTable(table); } + { + return truncate; + } +} + + +AlterExpression.ColumnDataType AlterExpressionColumnDataType(): +{ + String columnName = null; + ColDataType dataType = null; + List columnSpecs = null; + List parameter = null; +} +{ + columnName = RelObjectName() + dataType = ColDataType() { columnSpecs = new ArrayList(); } + ( parameter = CreateParameter() { columnSpecs.addAll(parameter); } )* + { + return new AlterExpression.ColumnDataType(columnName, dataType, columnSpecs); + } +} + +List AlterExpressionConstraintState(): +{ + List retval = new ArrayList(); +} +{ + ( + ( + {retval.add(new DeferrableConstraint(false));} + ) + | + ( + {retval.add(new DeferrableConstraint(true));} + ) + | + ( + {retval.add(new ValidateConstraint(false));} + ) + | + ( + {retval.add(new ValidateConstraint(true));} + ) + | + ( + {retval.add(new EnableConstraint(false));} + ) + | + ( + {retval.add(new EnableConstraint(true));} + ) + )* + { + return retval; + } +} + + + +AlterExpression AlterExpression(): +{ + AlterExpression alterExp = new AlterExpression(); + Token tk; + Token tk2 = null; + String sk3 = null; + ColDataType dataType; + List columnNames = null; + List constraints = null; + ForeignKeyIndex fkIndex = null; + NamedConstraint index = null; + Table fkTable = null; + AlterExpression.ColumnDataType alterExpressionColumnDataType = null; +} +{ + + ( + (( { alterExp.setOperation(AlterOperation.ADD); } | { alterExp.setOperation(AlterOperation.MODIFY); }) + ( + LOOKAHEAD(2) ( columnNames=ColumnsNamesList() { alterExp.setPkColumns(columnNames); } ) constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } + | + ( (LOOKAHEAD(2) )? + alterExpressionColumnDataType = AlterExpressionColumnDataType() { alterExp.addColDataType(alterExpressionColumnDataType); } + ) + | + ( + "(" alterExpressionColumnDataType = AlterExpressionColumnDataType() { alterExp.addColDataType(alterExpressionColumnDataType); } + ("," alterExpressionColumnDataType = AlterExpressionColumnDataType() { alterExp.addColDataType(alterExpressionColumnDataType); } )* ")" + ) + | + ( (tk= | tk=) columnNames=ColumnsNamesList() { alterExp.setUkName(tk.image); alterExp.setUkColumns(columnNames); } ) + | +//following two choices regarding foreign keys should be merged + ( columnNames=ColumnsNamesList() { alterExp.setFkColumns(columnNames); } + tk= columnNames=ColumnsNamesList() + { alterExp.setFkSourceTable(tk.image); alterExp.setFkSourceColumns(columnNames); } + [ + ( { alterExp.setOnDeleteCascade(true); } + | { alterExp.setOnDeleteRestrict(true); } + | { alterExp.setOnDeleteSetNull(true); } ) ] + ) + | + ( + sk3=RelObjectName() + + ( ( tk= tk2= + columnNames=ColumnsNamesList() + { + fkIndex = new ForeignKeyIndex(); + fkIndex.setName(sk3); + fkIndex.setType(tk.image + " " + tk2.image); + fkIndex.setColumnsNames(columnNames); + } + fkTable=Table() columnNames=ColumnsNamesList() + { + fkIndex.setTable(fkTable); + fkIndex.setReferencedColumnNames(columnNames); + alterExp.setIndex(fkIndex); + } + constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } + ) + | + ( tk= tk2= + columnNames=ColumnsNamesList() + { + index = new NamedConstraint(); + index.setName(sk3); + index.setType(tk.image + " " + tk2.image); + index.setColumnsNames(columnNames); + alterExp.setIndex(index); + } + constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } + ) + | + ( + {Expression exp = null;} ("(" exp = Expression() ")")* { + CheckConstraint checkCs = new CheckConstraint(); + checkCs.setName(sk3); + checkCs.setExpression(exp); + alterExp.setIndex(checkCs); + } + ) + | + ( + tk= tk2= + columnNames=ColumnsNamesList() + { + index = new NamedConstraint(); + index.setName(sk3); + index.setType(tk.image + " " + tk2.image); + index.setColumnsNames(columnNames); + alterExp.setIndex(index); + } + constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } + ) + | + ( + tk= + columnNames=ColumnsNamesList() + { + index = new NamedConstraint(); + index.setName(sk3); + index.setType(tk.image); + index.setColumnsNames(columnNames); + alterExp.setIndex(index); + } + constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } + ) ) + ) + ) + ) + | + ( + { + alterExp.setOperation(AlterOperation.DROP); + } + ( + ( (LOOKAHEAD(2) )? + (tk= | tk=) + { + alterExp.setColumnName(tk.image); + } + [tk= { alterExp.addParameters(tk.image); } ] + + ) + | + ( + (tk= | tk=) + { + alterExp.setConstraintName(tk.image); + } + ) + ) + ) + ) + + { + return alterExp; + } +} + + +Alter AlterTable(): +{ + Alter alter = new Alter(); + Table table; + AlterExpression alterExp; + +} +{ + table=Table() { alter.setTable(table); } + ( alterExp=AlterExpression() { alter.addAlterExpression(alterExp); } + ("," alterExp=AlterExpression() { alter.addAlterExpression(alterExp); } )* + ) + + { + return alter; + } +} + +Wait Wait(): +{ + Wait wait = new Wait(); + Token token = null; +} +{ + // sqlserver-oracle-> WAIT (TIMEOUT) + // https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_10002.htm#i2126016 + token= { wait.setTimeout(Long.parseLong(token.image)); } + + { + return wait; + } +} + +Commit Commit(): +{ + Commit commit=new Commit(); +} +{ + + { + return commit; + } +} + +CreateSequence CreateSequence(): +{ + CreateSequence createSequence = new CreateSequence(); +} +{ + + +} diff --git a/src/test/java/issues/Issue482Test.java b/src/test/java/issues/Issue482Test.java new file mode 100644 index 0000000000..fa4d31f5e8 --- /dev/null +++ b/src/test/java/issues/Issue482Test.java @@ -0,0 +1,21 @@ +package issues; + +import org.junit.Test; + +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.statement.Statements; +import net.sf.jsqlparser.statement.select.Select; + +public class Issue482Test { + + @Test + public void test() throws Exception { + String sql = "SELECT SUM(orderTotalValue) as value, MONTH(invoiceDate) as month, YEAR(invoiceDate) as year FROM invoice.Invoices WHERE projectID = 1 GROUP BY MONTH(invoiceDate), YEAR(invoiceDate) ORDER BY YEAR(invoiceDate) DESC, MONTH(invoiceDate) DESC"; + Select select = (Select) CCJSqlParserUtil.parse(sql); + System.out.println(select.toString()); + + Statements stmts = CCJSqlParserUtil.parseStatements(sql); + System.out.println(stmts.toString()); + } + +} diff --git a/src/test/java/issues/Issue483Test.java b/src/test/java/issues/Issue483Test.java new file mode 100644 index 0000000000..4012d43428 --- /dev/null +++ b/src/test/java/issues/Issue483Test.java @@ -0,0 +1,17 @@ +package issues; + +import org.junit.Test; + +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.statement.select.Select; + +public class Issue483Test { + + @Test + public void test() throws Exception{ + String sql = "select * from ((TABLE_A), (TABLE_b as b))"; + Select select = (Select) CCJSqlParserUtil.parse(sql); + System.out.println(select.toString()); + } + +} diff --git a/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java b/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java new file mode 100644 index 0000000000..45d4d31d35 --- /dev/null +++ b/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java @@ -0,0 +1,16 @@ +package net.sf.jsqlparser.statement.create; + +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.parser.ParseException; +import net.sf.jsqlparser.statement.create.sequence.CreateSequence; +import org.junit.Test; + +public class CreateSequenceTest { + + @Test + public void testCreateSequence() throws JSQLParserException { + CreateSequence statement = (CreateSequence) CCJSqlParserUtil.parse("CREATE SEQUENCE"); + System.out.println(statement); + } +} From e6123a1ff01f60ea0388f80abc5cd1530b87c157 Mon Sep 17 00:00:00 2001 From: AnEmortalKid Date: Wed, 22 Apr 2020 23:05:37 -0500 Subject: [PATCH 2/6] wip, some parsing --- .../net/sf/jsqlparser/schema/Sequence.java | 121 ++ .../statement/StatementVisitorAdapter.java | 274 +-- .../create/sequence/CreateSequence.java | 17 +- .../sf/jsqlparser/util/TablesNamesFinder.java | 1628 +++++++++-------- .../util/deparser/CreateSequenceDeParser.java | 43 + .../util/deparser/StatementDeParser.java | 454 ++--- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 43 +- .../statement/create/CreateSequenceTest.java | 3 +- 8 files changed, 1408 insertions(+), 1175 deletions(-) create mode 100644 src/main/java/net/sf/jsqlparser/schema/Sequence.java create mode 100644 src/main/java/net/sf/jsqlparser/util/deparser/CreateSequenceDeParser.java diff --git a/src/main/java/net/sf/jsqlparser/schema/Sequence.java b/src/main/java/net/sf/jsqlparser/schema/Sequence.java new file mode 100644 index 0000000000..1523e84e24 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/schema/Sequence.java @@ -0,0 +1,121 @@ +/* + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2020 JSQLParser + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ +package net.sf.jsqlparser.schema; + +import net.sf.jsqlparser.parser.ASTNodeAccessImpl; + +/** + * Represents the database type for a {@code SEQUENCE} + */ +public class Sequence extends ASTNodeAccessImpl implements MultiPartName { + + private String name; + private String schemaName; + private Database database; + + private Long incrementBy; + + private CacheMode cacheMode; + private Long cache; + + + public Sequence() { + } + + public Sequence(String name) { + this.name = name; + } + + public Sequence(String schemaName, String name) { + this.schemaName = schemaName; + this.schemaName = schemaName; + this.name = name; + } + + public Sequence(Database database, String schemaName, String name) { + this.database = database; + this.schemaName = schemaName; + this.name = name; + } + + public void setIncrementBy(Long incrementBy) { + this.incrementBy = incrementBy; + } + + public Long getIncrementBy() { + return incrementBy; + } + + public void setCacheMode(CacheMode cacheMode) { + this.cacheMode = cacheMode; + } + + /** + * @return the Cache attribute, null if one was not specified. + */ + public CacheMode getCacheMode() { + return cacheMode; + } + + public void setCache(Long cache) { + this.cache = cache; + } + + /** + * @return the value for Cache, returns null if a {@code CACHE|NOCACHE} clause was not specified or the {@link #getCacheMode()} is #NOCACHE + */ + public Long getCache() { + return cache; + } + + @Override + public String getFullyQualifiedName() { + String fqn = ""; + + if (database != null) { + fqn += database.getFullyQualifiedName(); + } + if (!fqn.isEmpty()) { + fqn += "."; + } + + if (schemaName != null) { + fqn += schemaName; + } + if (!fqn.isEmpty()) { + fqn += "."; + } + + if (name != null) { + fqn += name; + } + + return fqn; + } + + /** + * Caching mode between CACHE and NOCACHE, when the mode is CACHE a value will exist in Cache + */ + public enum CacheMode { + CACHE, NOCACHE + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java index ee88680fd5..fd83a727f8 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java @@ -1,134 +1,140 @@ -/* - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2013 JSQLParser - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * . - * #L% - */ -package net.sf.jsqlparser.statement; - -import net.sf.jsqlparser.statement.alter.Alter; -import net.sf.jsqlparser.statement.create.index.CreateIndex; -import net.sf.jsqlparser.statement.create.table.CreateTable; -import net.sf.jsqlparser.statement.create.view.AlterView; -import net.sf.jsqlparser.statement.create.view.CreateView; -import net.sf.jsqlparser.statement.delete.Delete; -import net.sf.jsqlparser.statement.drop.Drop; -import net.sf.jsqlparser.statement.execute.Execute; -import net.sf.jsqlparser.statement.insert.Insert; -import net.sf.jsqlparser.statement.merge.Merge; -import net.sf.jsqlparser.statement.replace.Replace; -import net.sf.jsqlparser.statement.select.Select; -import net.sf.jsqlparser.statement.truncate.Truncate; -import net.sf.jsqlparser.statement.update.Update; -import net.sf.jsqlparser.statement.upsert.Upsert; - -public class StatementVisitorAdapter implements StatementVisitor { - @Override - public void visit(Commit commit) { - - } - - @Override - public void visit(Select select) { - - } - - @Override - public void visit(Delete delete) { - - } - - @Override - public void visit(Update update) { - - } - - @Override - public void visit(Insert insert) { - - } - - @Override - public void visit(Replace replace) { - - } - - @Override - public void visit(Drop drop) { - - } - - @Override - public void visit(Truncate truncate) { - - } - - @Override - public void visit(CreateIndex createIndex) { - - } - - @Override - public void visit(CreateTable createTable) { - - } - - @Override - public void visit(CreateView createView) { - - } - - @Override - public void visit(Alter alter) { - - } - - @Override - public void visit(Statements stmts) { - for (Statement statement : stmts.getStatements()) { - statement.accept(this); - } - } - - @Override - public void visit(Execute execute) { - - } - - @Override - public void visit(SetStatement set) { - - } - - @Override - public void visit(Merge merge) { - - } - - @Override - public void visit(AlterView alterView) { - } - - @Override - public void visit(Upsert upsert) { - } - - @Override - public void visit(UseStatement use) { - } -} +/* + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2013 JSQLParser + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.statement.alter.Alter; +import net.sf.jsqlparser.statement.create.index.CreateIndex; +import net.sf.jsqlparser.statement.create.sequence.CreateSequence; +import net.sf.jsqlparser.statement.create.table.CreateTable; +import net.sf.jsqlparser.statement.create.view.AlterView; +import net.sf.jsqlparser.statement.create.view.CreateView; +import net.sf.jsqlparser.statement.delete.Delete; +import net.sf.jsqlparser.statement.drop.Drop; +import net.sf.jsqlparser.statement.execute.Execute; +import net.sf.jsqlparser.statement.insert.Insert; +import net.sf.jsqlparser.statement.merge.Merge; +import net.sf.jsqlparser.statement.replace.Replace; +import net.sf.jsqlparser.statement.select.Select; +import net.sf.jsqlparser.statement.truncate.Truncate; +import net.sf.jsqlparser.statement.update.Update; +import net.sf.jsqlparser.statement.upsert.Upsert; + +public class StatementVisitorAdapter implements StatementVisitor { + @Override + public void visit(Commit commit) { + + } + + @Override + public void visit(Select select) { + + } + + @Override + public void visit(Delete delete) { + + } + + @Override + public void visit(Update update) { + + } + + @Override + public void visit(Insert insert) { + + } + + @Override + public void visit(Replace replace) { + + } + + @Override + public void visit(Drop drop) { + + } + + @Override + public void visit(Truncate truncate) { + + } + + @Override + public void visit(CreateIndex createIndex) { + + } + + @Override + public void visit(CreateTable createTable) { + + } + + @Override + public void visit(CreateView createView) { + + } + + @Override + public void visit(Alter alter) { + + } + + @Override + public void visit(Statements stmts) { + for (Statement statement : stmts.getStatements()) { + statement.accept(this); + } + } + + @Override + public void visit(Execute execute) { + + } + + @Override + public void visit(SetStatement set) { + + } + + @Override + public void visit(Merge merge) { + + } + + @Override + public void visit(AlterView alterView) { + } + + @Override + public void visit(Upsert upsert) { + } + + @Override + public void visit(UseStatement use) { + } + + @Override + public void visit(CreateSequence createSequence) { + + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java b/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java index 0322daeb21..4b275c79f9 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java @@ -1,4 +1,4 @@ -/* +/* * #%L * JSQLParser library * %% @@ -17,10 +17,11 @@ * You should have received a copy of the GNU General Lesser Public * License along with this program. If not, see * . - * #L% - */ + * #L% + */ package net.sf.jsqlparser.statement.create.sequence; +import net.sf.jsqlparser.schema.Sequence; import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.StatementVisitor; @@ -29,6 +30,16 @@ */ public class CreateSequence implements Statement { + public Sequence sequence; + + public void setSequence(Sequence sequence) { + this.sequence = sequence; + } + + public Sequence getSequence() { + return sequence; + } + @Override public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java index f29932722c..f7b5c2050b 100644 --- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java +++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java @@ -1,811 +1,817 @@ -/* - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2013 JSQLParser - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * . - * #L% - */ -package net.sf.jsqlparser.util; - -import java.util.ArrayList; -import java.util.List; - -import net.sf.jsqlparser.expression.AllComparisonExpression; -import net.sf.jsqlparser.expression.AnalyticExpression; -import net.sf.jsqlparser.expression.AnyComparisonExpression; -import net.sf.jsqlparser.expression.BinaryExpression; -import net.sf.jsqlparser.expression.CaseExpression; -import net.sf.jsqlparser.expression.CastExpression; -import net.sf.jsqlparser.expression.DateTimeLiteralExpression; -import net.sf.jsqlparser.expression.DateValue; -import net.sf.jsqlparser.expression.DoubleValue; -import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.expression.ExpressionVisitor; -import net.sf.jsqlparser.expression.ExtractExpression; -import net.sf.jsqlparser.expression.Function; -import net.sf.jsqlparser.expression.HexValue; -import net.sf.jsqlparser.expression.IntervalExpression; -import net.sf.jsqlparser.expression.JdbcNamedParameter; -import net.sf.jsqlparser.expression.JdbcParameter; -import net.sf.jsqlparser.expression.JsonExpression; -import net.sf.jsqlparser.expression.KeepExpression; -import net.sf.jsqlparser.expression.LongValue; -import net.sf.jsqlparser.expression.MySQLGroupConcat; -import net.sf.jsqlparser.expression.ValueListExpression; -import net.sf.jsqlparser.expression.NotExpression; -import net.sf.jsqlparser.expression.NullValue; -import net.sf.jsqlparser.expression.NumericBind; -import net.sf.jsqlparser.expression.OracleHierarchicalExpression; -import net.sf.jsqlparser.expression.OracleHint; -import net.sf.jsqlparser.expression.Parenthesis; -import net.sf.jsqlparser.expression.RowConstructor; -import net.sf.jsqlparser.expression.SignedExpression; -import net.sf.jsqlparser.expression.StringValue; -import net.sf.jsqlparser.expression.TimeKeyExpression; -import net.sf.jsqlparser.expression.TimeValue; -import net.sf.jsqlparser.expression.TimestampValue; -import net.sf.jsqlparser.expression.UserVariable; -import net.sf.jsqlparser.expression.WhenClause; -import net.sf.jsqlparser.expression.operators.arithmetic.Addition; -import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseAnd; -import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseLeftShift; -import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseOr; -import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseRightShift; -import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseXor; -import net.sf.jsqlparser.expression.operators.arithmetic.Concat; -import net.sf.jsqlparser.expression.operators.arithmetic.Division; -import net.sf.jsqlparser.expression.operators.arithmetic.Modulo; -import net.sf.jsqlparser.expression.operators.arithmetic.Multiplication; -import net.sf.jsqlparser.expression.operators.arithmetic.Subtraction; -import net.sf.jsqlparser.expression.operators.conditional.AndExpression; -import net.sf.jsqlparser.expression.operators.conditional.OrExpression; -import net.sf.jsqlparser.expression.operators.relational.Between; -import net.sf.jsqlparser.expression.operators.relational.EqualsTo; -import net.sf.jsqlparser.expression.operators.relational.ExistsExpression; -import net.sf.jsqlparser.expression.operators.relational.ExpressionList; -import net.sf.jsqlparser.expression.operators.relational.GreaterThan; -import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals; -import net.sf.jsqlparser.expression.operators.relational.InExpression; -import net.sf.jsqlparser.expression.operators.relational.IsNullExpression; -import net.sf.jsqlparser.expression.operators.relational.ItemsListVisitor; -import net.sf.jsqlparser.expression.operators.relational.JsonOperator; -import net.sf.jsqlparser.expression.operators.relational.LikeExpression; -import net.sf.jsqlparser.expression.operators.relational.Matches; -import net.sf.jsqlparser.expression.operators.relational.MinorThan; -import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals; -import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList; -import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo; -import net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperator; -import net.sf.jsqlparser.expression.operators.relational.RegExpMySQLOperator; -import net.sf.jsqlparser.schema.Column; -import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Commit; -import net.sf.jsqlparser.statement.SetStatement; -import net.sf.jsqlparser.statement.Statement; -import net.sf.jsqlparser.statement.StatementVisitor; -import net.sf.jsqlparser.statement.Statements; -import net.sf.jsqlparser.statement.UseStatement; -import net.sf.jsqlparser.statement.alter.Alter; -import net.sf.jsqlparser.statement.create.index.CreateIndex; -import net.sf.jsqlparser.statement.create.table.CreateTable; -import net.sf.jsqlparser.statement.create.view.AlterView; -import net.sf.jsqlparser.statement.create.view.CreateView; -import net.sf.jsqlparser.statement.delete.Delete; -import net.sf.jsqlparser.statement.drop.Drop; -import net.sf.jsqlparser.statement.execute.Execute; -import net.sf.jsqlparser.statement.insert.Insert; -import net.sf.jsqlparser.statement.merge.Merge; -import net.sf.jsqlparser.statement.replace.Replace; -import net.sf.jsqlparser.statement.select.AllColumns; -import net.sf.jsqlparser.statement.select.AllTableColumns; -import net.sf.jsqlparser.statement.select.FromItemVisitor; -import net.sf.jsqlparser.statement.select.Join; -import net.sf.jsqlparser.statement.select.LateralSubSelect; -import net.sf.jsqlparser.statement.select.ParenthesisFromItem; -import net.sf.jsqlparser.statement.select.PlainSelect; -import net.sf.jsqlparser.statement.select.Select; -import net.sf.jsqlparser.statement.select.SelectBody; -import net.sf.jsqlparser.statement.select.SelectExpressionItem; -import net.sf.jsqlparser.statement.select.SelectItem; -import net.sf.jsqlparser.statement.select.SelectItemVisitor; -import net.sf.jsqlparser.statement.select.SelectVisitor; -import net.sf.jsqlparser.statement.select.SetOperationList; -import net.sf.jsqlparser.statement.select.SubJoin; -import net.sf.jsqlparser.statement.select.SubSelect; -import net.sf.jsqlparser.statement.select.TableFunction; -import net.sf.jsqlparser.statement.select.ValuesList; -import net.sf.jsqlparser.statement.select.WithItem; -import net.sf.jsqlparser.statement.truncate.Truncate; -import net.sf.jsqlparser.statement.update.Update; -import net.sf.jsqlparser.statement.upsert.Upsert; - -/** - * Find all used tables within an select statement. - * - * Override extractTableName method to modify the extracted table names (e.g. without schema). - */ -public class TablesNamesFinder implements SelectVisitor, FromItemVisitor, ExpressionVisitor, ItemsListVisitor, SelectItemVisitor, StatementVisitor { - - private static final String NOT_SUPPORTED_YET = "Not supported yet."; - private List tables; - private boolean allowColumnProcessing = false; - - /** - * There are special names, that are not table names but are parsed as tables. These names are - * collected here and are not included in the tables - names anymore. - */ - private List otherItemNames; - - /** - * Main entry for this Tool class. A list of found tables is returned. - * - * @param delete - * @return - */ - public List getTableList(Statement statement) { - init(false); - statement.accept(this); - return tables; - } - - @Override - public void visit(Select select) { - if (select.getWithItemsList() != null) { - for (WithItem withItem : select.getWithItemsList()) { - withItem.accept(this); - } - } - select.getSelectBody().accept(this); - } - - /** - * Main entry for this Tool class. A list of found tables is returned. - * - * @param update - * @return - */ - public List getTableList(Expression expr) { - init(true); - expr.accept(this); - return tables; - } - - @Override - public void visit(WithItem withItem) { - otherItemNames.add(withItem.getName().toLowerCase()); - withItem.getSelectBody().accept(this); - } - - @Override - public void visit(PlainSelect plainSelect) { - if (plainSelect.getSelectItems() != null) { - for (SelectItem item : plainSelect.getSelectItems()) { - item.accept(this); - } - } - - if (plainSelect.getFromItem() != null) { - plainSelect.getFromItem().accept(this); - } - - if (plainSelect.getJoins() != null) { - for (Join join : plainSelect.getJoins()) { - join.getRightItem().accept(this); - } - } - if (plainSelect.getWhere() != null) { - plainSelect.getWhere().accept(this); - } - - if(plainSelect.getHaving() != null){ - plainSelect.getHaving().accept(this); - } - - if (plainSelect.getOracleHierarchical() != null) { - plainSelect.getOracleHierarchical().accept(this); - } - } - - /** - * Override to adapt the tableName generation (e.g. with / without schema). - * @param table - * @return - */ - protected String extractTableName(Table table) { - return table.getFullyQualifiedName(); - } - - @Override - public void visit(Table tableName) { - String tableWholeName = extractTableName(tableName); - if (!otherItemNames.contains(tableWholeName.toLowerCase()) - && !tables.contains(tableWholeName)) { - tables.add(tableWholeName); - } - } - - @Override - public void visit(SubSelect subSelect) { - if (subSelect.getWithItemsList() != null) { - for (WithItem withItem : subSelect.getWithItemsList()) { - withItem.accept(this); - } - } - subSelect.getSelectBody().accept(this); - } - - @Override - public void visit(Addition addition) { - visitBinaryExpression(addition); - } - - @Override - public void visit(AndExpression andExpression) { - visitBinaryExpression(andExpression); - } - - @Override - public void visit(Between between) { - between.getLeftExpression().accept(this); - between.getBetweenExpressionStart().accept(this); - between.getBetweenExpressionEnd().accept(this); - } - - @Override - public void visit(Column tableColumn) { - if (allowColumnProcessing && tableColumn.getTable() != null && tableColumn.getTable().getName() != null) { - visit(tableColumn.getTable()); - } - } - - @Override - public void visit(Division division) { - visitBinaryExpression(division); - } - - @Override - public void visit(DoubleValue doubleValue) { - } - - @Override - public void visit(EqualsTo equalsTo) { - visitBinaryExpression(equalsTo); - } - - @Override - public void visit(Function function) { - ExpressionList exprList = function.getParameters(); - if (exprList != null) { - visit(exprList); - } - } - - @Override - public void visit(GreaterThan greaterThan) { - visitBinaryExpression(greaterThan); - } - - @Override - public void visit(GreaterThanEquals greaterThanEquals) { - visitBinaryExpression(greaterThanEquals); - } - - @Override - public void visit(InExpression inExpression) { - if (inExpression.getLeftExpression() != null) { - inExpression.getLeftExpression().accept(this); - } else if (inExpression.getLeftItemsList() != null) { - inExpression.getLeftItemsList().accept(this); - } - inExpression.getRightItemsList().accept(this); - } - - @Override - public void visit(SignedExpression signedExpression) { - signedExpression.getExpression().accept(this); - } - - @Override - public void visit(IsNullExpression isNullExpression) { - } - - @Override - public void visit(JdbcParameter jdbcParameter) { - } - - @Override - public void visit(LikeExpression likeExpression) { - visitBinaryExpression(likeExpression); - } - - @Override - public void visit(ExistsExpression existsExpression) { - existsExpression.getRightExpression().accept(this); - } - - @Override - public void visit(LongValue longValue) { - } - - @Override - public void visit(MinorThan minorThan) { - visitBinaryExpression(minorThan); - } - - @Override - public void visit(MinorThanEquals minorThanEquals) { - visitBinaryExpression(minorThanEquals); - } - - @Override - public void visit(Multiplication multiplication) { - visitBinaryExpression(multiplication); - } - - @Override - public void visit(NotEqualsTo notEqualsTo) { - visitBinaryExpression(notEqualsTo); - } - - @Override - public void visit(NullValue nullValue) { - } - - @Override - public void visit(OrExpression orExpression) { - visitBinaryExpression(orExpression); - } - - @Override - public void visit(Parenthesis parenthesis) { - parenthesis.getExpression().accept(this); - } - - @Override - public void visit(StringValue stringValue) { - } - - @Override - public void visit(Subtraction subtraction) { - visitBinaryExpression(subtraction); - } - - @Override - public void visit(NotExpression notExpr) { - notExpr.getExpression().accept(this); - } - - @Override - public void visit(BitwiseRightShift expr) { - visitBinaryExpression(expr); - } - - @Override - public void visit(BitwiseLeftShift expr) { - visitBinaryExpression(expr); - } - - public void visitBinaryExpression(BinaryExpression binaryExpression) { - binaryExpression.getLeftExpression().accept(this); - binaryExpression.getRightExpression().accept(this); - } - - @Override - public void visit(ExpressionList expressionList) { - for (Expression expression : expressionList.getExpressions()) { - expression.accept(this); - } - } - - @Override - public void visit(DateValue dateValue) { - } - - @Override - public void visit(TimestampValue timestampValue) { - } - - @Override - public void visit(TimeValue timeValue) { - } - - /* - * (non-Javadoc) - * - * @see net.sf.jsqlparser.expression.ExpressionVisitor#visit(net.sf.jsqlparser.expression.CaseExpression) - */ - @Override - public void visit(CaseExpression caseExpression) { - if (caseExpression.getSwitchExpression() != null) { - caseExpression.getSwitchExpression().accept(this); - } - if (caseExpression.getWhenClauses() != null) { - for (WhenClause when : caseExpression.getWhenClauses()) { - when.accept(this); - } - } - if (caseExpression.getElseExpression() != null) { - caseExpression.getElseExpression().accept(this); - } - } - - /* - * (non-Javadoc) - * - * @see net.sf.jsqlparser.expression.ExpressionVisitor#visit(net.sf.jsqlparser.expression.WhenClause) - */ - @Override - public void visit(WhenClause whenClause) { - if (whenClause.getWhenExpression() != null) { - whenClause.getWhenExpression().accept(this); - } - if (whenClause.getThenExpression() != null) { - whenClause.getThenExpression().accept(this); - } - } - - @Override - public void visit(AllComparisonExpression allComparisonExpression) { - allComparisonExpression.getSubSelect().getSelectBody().accept(this); - } - - @Override - public void visit(AnyComparisonExpression anyComparisonExpression) { - anyComparisonExpression.getSubSelect().getSelectBody().accept(this); - } - - @Override - public void visit(SubJoin subjoin) { - subjoin.getLeft().accept(this); - for(Join join : subjoin.getJoinList()) { - join.getRightItem().accept(this); - } - } - - @Override - public void visit(Concat concat) { - visitBinaryExpression(concat); - } - - @Override - public void visit(Matches matches) { - visitBinaryExpression(matches); - } - - @Override - public void visit(BitwiseAnd bitwiseAnd) { - visitBinaryExpression(bitwiseAnd); - } - - @Override - public void visit(BitwiseOr bitwiseOr) { - visitBinaryExpression(bitwiseOr); - } - - @Override - public void visit(BitwiseXor bitwiseXor) { - visitBinaryExpression(bitwiseXor); - } - - @Override - public void visit(CastExpression cast) { - cast.getLeftExpression().accept(this); - } - - @Override - public void visit(Modulo modulo) { - visitBinaryExpression(modulo); - } - - @Override - public void visit(AnalyticExpression analytic) { - } - - @Override - public void visit(SetOperationList list) { - for (SelectBody plainSelect : list.getSelects()) { - plainSelect.accept(this); - } - } - - @Override - public void visit(ExtractExpression eexpr) { - } - - @Override - public void visit(LateralSubSelect lateralSubSelect) { - lateralSubSelect.getSubSelect().getSelectBody().accept(this); - } - - @Override - public void visit(MultiExpressionList multiExprList) { - for (ExpressionList exprList : multiExprList.getExprList()) { - exprList.accept(this); - } - } - - @Override - public void visit(ValuesList valuesList) { - } - - /** - * Initializes table names collector. Important is the usage of Column instances to find - * table names. This is only allowed for expression parsing, where a better place for - * tablenames could not be there. For complete statements only from items are used to avoid - * some alias as tablenames. - * @param allowColumnProcessing - */ - protected void init(boolean allowColumnProcessing) { - otherItemNames = new ArrayList(); - tables = new ArrayList(); - this.allowColumnProcessing = allowColumnProcessing; - } - - @Override - public void visit(IntervalExpression iexpr) { - } - - @Override - public void visit(JdbcNamedParameter jdbcNamedParameter) { - } - - @Override - public void visit(OracleHierarchicalExpression oexpr) { - if (oexpr.getStartExpression() != null) { - oexpr.getStartExpression().accept(this); - } - - if (oexpr.getConnectExpression() != null) { - oexpr.getConnectExpression().accept(this); - } - } - - @Override - public void visit(RegExpMatchOperator rexpr) { - visitBinaryExpression(rexpr); - } - - @Override - public void visit(RegExpMySQLOperator rexpr) { - visitBinaryExpression(rexpr); - } - - @Override - public void visit(JsonExpression jsonExpr) { - } - - @Override - public void visit(JsonOperator jsonExpr) { - } - - @Override - public void visit(AllColumns allColumns) { - } - - @Override - public void visit(AllTableColumns allTableColumns) { - } - - @Override - public void visit(SelectExpressionItem item) { - item.getExpression().accept(this); - } - - @Override - public void visit(UserVariable var) { - } - - @Override - public void visit(NumericBind bind) { - - } - - @Override - public void visit(KeepExpression aexpr) { - } - - @Override - public void visit(MySQLGroupConcat groupConcat) { - } - - @Override - public void visit(ValueListExpression valueList) { - valueList.getExpressionList().accept(this); - } - - @Override - public void visit(Delete delete) { - visit(delete.getTable()); - - if (delete.getJoins() != null) { - for (Join join : delete.getJoins()) { - join.getRightItem().accept(this); - } - } - - if (delete.getWhere() != null) { - delete.getWhere().accept(this); - } - } - - @Override - public void visit(Update update) { - for (Table table : update.getTables()) { - visit(table); - } - if (update.getExpressions() != null) { - for (Expression expression : update.getExpressions()) { - expression.accept(this); - } - } - - if (update.getFromItem() != null) { - update.getFromItem().accept(this); - } - - if (update.getJoins() != null) { - for (Join join : update.getJoins()) { - join.getRightItem().accept(this); - } - } - - if (update.getWhere() != null) { - update.getWhere().accept(this); - } - } - - @Override - public void visit(Insert insert) { - visit(insert.getTable()); - if (insert.getItemsList() != null) { - insert.getItemsList().accept(this); - } - if (insert.getSelect() != null) { - visit(insert.getSelect()); - } - } - - @Override - public void visit(Replace replace) { - visit(replace.getTable()); - if (replace.getExpressions() != null) { - for (Expression expression : replace.getExpressions()) { - expression.accept(this); - } - } - if (replace.getItemsList() != null) { - replace.getItemsList().accept(this); - } - } - - @Override - public void visit(Drop drop) { - throw new UnsupportedOperationException(NOT_SUPPORTED_YET); - } - - @Override - public void visit(Truncate truncate) { - throw new UnsupportedOperationException(NOT_SUPPORTED_YET); - } - - @Override - public void visit(CreateIndex createIndex) { - throw new UnsupportedOperationException(NOT_SUPPORTED_YET); - } - - @Override - public void visit(CreateTable create) { - visit(create.getTable()); - if (create.getSelect() != null) { - create.getSelect().accept(this); - } - } - - @Override - public void visit(CreateView createView) { - throw new UnsupportedOperationException(NOT_SUPPORTED_YET); - } - - @Override - public void visit(Alter alter) { - throw new UnsupportedOperationException(NOT_SUPPORTED_YET); - } - - @Override - public void visit(Statements stmts) { - throw new UnsupportedOperationException(NOT_SUPPORTED_YET); - } - - @Override - public void visit(Execute execute) { - throw new UnsupportedOperationException(NOT_SUPPORTED_YET); - } - - @Override - public void visit(SetStatement set) { - throw new UnsupportedOperationException(NOT_SUPPORTED_YET); - } - - @Override - public void visit(RowConstructor rowConstructor) { - for (Expression expr : rowConstructor.getExprList().getExpressions()) { - expr.accept(this); - } - } - - @Override - public void visit(HexValue hexValue) { - - } - - @Override - public void visit(Merge merge) { - visit(merge.getTable()); - if (merge.getUsingTable() != null) { - merge.getUsingTable().accept(this); - } else if (merge.getUsingSelect() != null) { - merge.getUsingSelect().accept((FromItemVisitor) this); - } - } - - @Override - public void visit(OracleHint hint) { - } - - @Override - public void visit(TableFunction valuesList) { - } - - @Override - public void visit(AlterView alterView) { - throw new UnsupportedOperationException(NOT_SUPPORTED_YET); - } - - @Override - public void visit(TimeKeyExpression timeKeyExpression) { - } - - @Override - public void visit(DateTimeLiteralExpression literal) { - - } - - @Override - public void visit(Commit commit) { - - } - - @Override - public void visit(Upsert upsert) { - visit(upsert.getTable()); - if (upsert.getItemsList() != null) { - upsert.getItemsList().accept(this); - } - if (upsert.getSelect() != null) { - visit(upsert.getSelect()); - } - } - - @Override - public void visit(UseStatement use) { - } - - @Override - public void visit(ParenthesisFromItem parenthesis) { - parenthesis.getFromItem().accept(this); - } -} +/* + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2013 JSQLParser + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ +package net.sf.jsqlparser.util; + +import java.util.ArrayList; +import java.util.List; + +import net.sf.jsqlparser.expression.AllComparisonExpression; +import net.sf.jsqlparser.expression.AnalyticExpression; +import net.sf.jsqlparser.expression.AnyComparisonExpression; +import net.sf.jsqlparser.expression.BinaryExpression; +import net.sf.jsqlparser.expression.CaseExpression; +import net.sf.jsqlparser.expression.CastExpression; +import net.sf.jsqlparser.expression.DateTimeLiteralExpression; +import net.sf.jsqlparser.expression.DateValue; +import net.sf.jsqlparser.expression.DoubleValue; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.ExpressionVisitor; +import net.sf.jsqlparser.expression.ExtractExpression; +import net.sf.jsqlparser.expression.Function; +import net.sf.jsqlparser.expression.HexValue; +import net.sf.jsqlparser.expression.IntervalExpression; +import net.sf.jsqlparser.expression.JdbcNamedParameter; +import net.sf.jsqlparser.expression.JdbcParameter; +import net.sf.jsqlparser.expression.JsonExpression; +import net.sf.jsqlparser.expression.KeepExpression; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.MySQLGroupConcat; +import net.sf.jsqlparser.expression.ValueListExpression; +import net.sf.jsqlparser.expression.NotExpression; +import net.sf.jsqlparser.expression.NullValue; +import net.sf.jsqlparser.expression.NumericBind; +import net.sf.jsqlparser.expression.OracleHierarchicalExpression; +import net.sf.jsqlparser.expression.OracleHint; +import net.sf.jsqlparser.expression.Parenthesis; +import net.sf.jsqlparser.expression.RowConstructor; +import net.sf.jsqlparser.expression.SignedExpression; +import net.sf.jsqlparser.expression.StringValue; +import net.sf.jsqlparser.expression.TimeKeyExpression; +import net.sf.jsqlparser.expression.TimeValue; +import net.sf.jsqlparser.expression.TimestampValue; +import net.sf.jsqlparser.expression.UserVariable; +import net.sf.jsqlparser.expression.WhenClause; +import net.sf.jsqlparser.expression.operators.arithmetic.Addition; +import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseAnd; +import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseLeftShift; +import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseOr; +import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseRightShift; +import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseXor; +import net.sf.jsqlparser.expression.operators.arithmetic.Concat; +import net.sf.jsqlparser.expression.operators.arithmetic.Division; +import net.sf.jsqlparser.expression.operators.arithmetic.Modulo; +import net.sf.jsqlparser.expression.operators.arithmetic.Multiplication; +import net.sf.jsqlparser.expression.operators.arithmetic.Subtraction; +import net.sf.jsqlparser.expression.operators.conditional.AndExpression; +import net.sf.jsqlparser.expression.operators.conditional.OrExpression; +import net.sf.jsqlparser.expression.operators.relational.Between; +import net.sf.jsqlparser.expression.operators.relational.EqualsTo; +import net.sf.jsqlparser.expression.operators.relational.ExistsExpression; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.expression.operators.relational.GreaterThan; +import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals; +import net.sf.jsqlparser.expression.operators.relational.InExpression; +import net.sf.jsqlparser.expression.operators.relational.IsNullExpression; +import net.sf.jsqlparser.expression.operators.relational.ItemsListVisitor; +import net.sf.jsqlparser.expression.operators.relational.JsonOperator; +import net.sf.jsqlparser.expression.operators.relational.LikeExpression; +import net.sf.jsqlparser.expression.operators.relational.Matches; +import net.sf.jsqlparser.expression.operators.relational.MinorThan; +import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals; +import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList; +import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo; +import net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperator; +import net.sf.jsqlparser.expression.operators.relational.RegExpMySQLOperator; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.Commit; +import net.sf.jsqlparser.statement.SetStatement; +import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.StatementVisitor; +import net.sf.jsqlparser.statement.Statements; +import net.sf.jsqlparser.statement.UseStatement; +import net.sf.jsqlparser.statement.alter.Alter; +import net.sf.jsqlparser.statement.create.index.CreateIndex; +import net.sf.jsqlparser.statement.create.sequence.CreateSequence; +import net.sf.jsqlparser.statement.create.table.CreateTable; +import net.sf.jsqlparser.statement.create.view.AlterView; +import net.sf.jsqlparser.statement.create.view.CreateView; +import net.sf.jsqlparser.statement.delete.Delete; +import net.sf.jsqlparser.statement.drop.Drop; +import net.sf.jsqlparser.statement.execute.Execute; +import net.sf.jsqlparser.statement.insert.Insert; +import net.sf.jsqlparser.statement.merge.Merge; +import net.sf.jsqlparser.statement.replace.Replace; +import net.sf.jsqlparser.statement.select.AllColumns; +import net.sf.jsqlparser.statement.select.AllTableColumns; +import net.sf.jsqlparser.statement.select.FromItemVisitor; +import net.sf.jsqlparser.statement.select.Join; +import net.sf.jsqlparser.statement.select.LateralSubSelect; +import net.sf.jsqlparser.statement.select.ParenthesisFromItem; +import net.sf.jsqlparser.statement.select.PlainSelect; +import net.sf.jsqlparser.statement.select.Select; +import net.sf.jsqlparser.statement.select.SelectBody; +import net.sf.jsqlparser.statement.select.SelectExpressionItem; +import net.sf.jsqlparser.statement.select.SelectItem; +import net.sf.jsqlparser.statement.select.SelectItemVisitor; +import net.sf.jsqlparser.statement.select.SelectVisitor; +import net.sf.jsqlparser.statement.select.SetOperationList; +import net.sf.jsqlparser.statement.select.SubJoin; +import net.sf.jsqlparser.statement.select.SubSelect; +import net.sf.jsqlparser.statement.select.TableFunction; +import net.sf.jsqlparser.statement.select.ValuesList; +import net.sf.jsqlparser.statement.select.WithItem; +import net.sf.jsqlparser.statement.truncate.Truncate; +import net.sf.jsqlparser.statement.update.Update; +import net.sf.jsqlparser.statement.upsert.Upsert; + +/** + * Find all used tables within an select statement. + * + * Override extractTableName method to modify the extracted table names (e.g. without schema). + */ +public class TablesNamesFinder implements SelectVisitor, FromItemVisitor, ExpressionVisitor, ItemsListVisitor, SelectItemVisitor, StatementVisitor { + + private static final String NOT_SUPPORTED_YET = "Not supported yet."; + private List tables; + private boolean allowColumnProcessing = false; + + /** + * There are special names, that are not table names but are parsed as tables. These names are + * collected here and are not included in the tables - names anymore. + */ + private List otherItemNames; + + /** + * Main entry for this Tool class. A list of found tables is returned. + * + * @param delete + * @return + */ + public List getTableList(Statement statement) { + init(false); + statement.accept(this); + return tables; + } + + @Override + public void visit(Select select) { + if (select.getWithItemsList() != null) { + for (WithItem withItem : select.getWithItemsList()) { + withItem.accept(this); + } + } + select.getSelectBody().accept(this); + } + + /** + * Main entry for this Tool class. A list of found tables is returned. + * + * @param update + * @return + */ + public List getTableList(Expression expr) { + init(true); + expr.accept(this); + return tables; + } + + @Override + public void visit(WithItem withItem) { + otherItemNames.add(withItem.getName().toLowerCase()); + withItem.getSelectBody().accept(this); + } + + @Override + public void visit(PlainSelect plainSelect) { + if (plainSelect.getSelectItems() != null) { + for (SelectItem item : plainSelect.getSelectItems()) { + item.accept(this); + } + } + + if (plainSelect.getFromItem() != null) { + plainSelect.getFromItem().accept(this); + } + + if (plainSelect.getJoins() != null) { + for (Join join : plainSelect.getJoins()) { + join.getRightItem().accept(this); + } + } + if (plainSelect.getWhere() != null) { + plainSelect.getWhere().accept(this); + } + + if(plainSelect.getHaving() != null){ + plainSelect.getHaving().accept(this); + } + + if (plainSelect.getOracleHierarchical() != null) { + plainSelect.getOracleHierarchical().accept(this); + } + } + + /** + * Override to adapt the tableName generation (e.g. with / without schema). + * @param table + * @return + */ + protected String extractTableName(Table table) { + return table.getFullyQualifiedName(); + } + + @Override + public void visit(Table tableName) { + String tableWholeName = extractTableName(tableName); + if (!otherItemNames.contains(tableWholeName.toLowerCase()) + && !tables.contains(tableWholeName)) { + tables.add(tableWholeName); + } + } + + @Override + public void visit(SubSelect subSelect) { + if (subSelect.getWithItemsList() != null) { + for (WithItem withItem : subSelect.getWithItemsList()) { + withItem.accept(this); + } + } + subSelect.getSelectBody().accept(this); + } + + @Override + public void visit(Addition addition) { + visitBinaryExpression(addition); + } + + @Override + public void visit(AndExpression andExpression) { + visitBinaryExpression(andExpression); + } + + @Override + public void visit(Between between) { + between.getLeftExpression().accept(this); + between.getBetweenExpressionStart().accept(this); + between.getBetweenExpressionEnd().accept(this); + } + + @Override + public void visit(Column tableColumn) { + if (allowColumnProcessing && tableColumn.getTable() != null && tableColumn.getTable().getName() != null) { + visit(tableColumn.getTable()); + } + } + + @Override + public void visit(Division division) { + visitBinaryExpression(division); + } + + @Override + public void visit(DoubleValue doubleValue) { + } + + @Override + public void visit(EqualsTo equalsTo) { + visitBinaryExpression(equalsTo); + } + + @Override + public void visit(Function function) { + ExpressionList exprList = function.getParameters(); + if (exprList != null) { + visit(exprList); + } + } + + @Override + public void visit(GreaterThan greaterThan) { + visitBinaryExpression(greaterThan); + } + + @Override + public void visit(GreaterThanEquals greaterThanEquals) { + visitBinaryExpression(greaterThanEquals); + } + + @Override + public void visit(InExpression inExpression) { + if (inExpression.getLeftExpression() != null) { + inExpression.getLeftExpression().accept(this); + } else if (inExpression.getLeftItemsList() != null) { + inExpression.getLeftItemsList().accept(this); + } + inExpression.getRightItemsList().accept(this); + } + + @Override + public void visit(SignedExpression signedExpression) { + signedExpression.getExpression().accept(this); + } + + @Override + public void visit(IsNullExpression isNullExpression) { + } + + @Override + public void visit(JdbcParameter jdbcParameter) { + } + + @Override + public void visit(LikeExpression likeExpression) { + visitBinaryExpression(likeExpression); + } + + @Override + public void visit(ExistsExpression existsExpression) { + existsExpression.getRightExpression().accept(this); + } + + @Override + public void visit(LongValue longValue) { + } + + @Override + public void visit(MinorThan minorThan) { + visitBinaryExpression(minorThan); + } + + @Override + public void visit(MinorThanEquals minorThanEquals) { + visitBinaryExpression(minorThanEquals); + } + + @Override + public void visit(Multiplication multiplication) { + visitBinaryExpression(multiplication); + } + + @Override + public void visit(NotEqualsTo notEqualsTo) { + visitBinaryExpression(notEqualsTo); + } + + @Override + public void visit(NullValue nullValue) { + } + + @Override + public void visit(OrExpression orExpression) { + visitBinaryExpression(orExpression); + } + + @Override + public void visit(Parenthesis parenthesis) { + parenthesis.getExpression().accept(this); + } + + @Override + public void visit(StringValue stringValue) { + } + + @Override + public void visit(Subtraction subtraction) { + visitBinaryExpression(subtraction); + } + + @Override + public void visit(NotExpression notExpr) { + notExpr.getExpression().accept(this); + } + + @Override + public void visit(BitwiseRightShift expr) { + visitBinaryExpression(expr); + } + + @Override + public void visit(BitwiseLeftShift expr) { + visitBinaryExpression(expr); + } + + public void visitBinaryExpression(BinaryExpression binaryExpression) { + binaryExpression.getLeftExpression().accept(this); + binaryExpression.getRightExpression().accept(this); + } + + @Override + public void visit(ExpressionList expressionList) { + for (Expression expression : expressionList.getExpressions()) { + expression.accept(this); + } + } + + @Override + public void visit(DateValue dateValue) { + } + + @Override + public void visit(TimestampValue timestampValue) { + } + + @Override + public void visit(TimeValue timeValue) { + } + + /* + * (non-Javadoc) + * + * @see net.sf.jsqlparser.expression.ExpressionVisitor#visit(net.sf.jsqlparser.expression.CaseExpression) + */ + @Override + public void visit(CaseExpression caseExpression) { + if (caseExpression.getSwitchExpression() != null) { + caseExpression.getSwitchExpression().accept(this); + } + if (caseExpression.getWhenClauses() != null) { + for (WhenClause when : caseExpression.getWhenClauses()) { + when.accept(this); + } + } + if (caseExpression.getElseExpression() != null) { + caseExpression.getElseExpression().accept(this); + } + } + + /* + * (non-Javadoc) + * + * @see net.sf.jsqlparser.expression.ExpressionVisitor#visit(net.sf.jsqlparser.expression.WhenClause) + */ + @Override + public void visit(WhenClause whenClause) { + if (whenClause.getWhenExpression() != null) { + whenClause.getWhenExpression().accept(this); + } + if (whenClause.getThenExpression() != null) { + whenClause.getThenExpression().accept(this); + } + } + + @Override + public void visit(AllComparisonExpression allComparisonExpression) { + allComparisonExpression.getSubSelect().getSelectBody().accept(this); + } + + @Override + public void visit(AnyComparisonExpression anyComparisonExpression) { + anyComparisonExpression.getSubSelect().getSelectBody().accept(this); + } + + @Override + public void visit(SubJoin subjoin) { + subjoin.getLeft().accept(this); + for(Join join : subjoin.getJoinList()) { + join.getRightItem().accept(this); + } + } + + @Override + public void visit(Concat concat) { + visitBinaryExpression(concat); + } + + @Override + public void visit(Matches matches) { + visitBinaryExpression(matches); + } + + @Override + public void visit(BitwiseAnd bitwiseAnd) { + visitBinaryExpression(bitwiseAnd); + } + + @Override + public void visit(BitwiseOr bitwiseOr) { + visitBinaryExpression(bitwiseOr); + } + + @Override + public void visit(BitwiseXor bitwiseXor) { + visitBinaryExpression(bitwiseXor); + } + + @Override + public void visit(CastExpression cast) { + cast.getLeftExpression().accept(this); + } + + @Override + public void visit(Modulo modulo) { + visitBinaryExpression(modulo); + } + + @Override + public void visit(AnalyticExpression analytic) { + } + + @Override + public void visit(SetOperationList list) { + for (SelectBody plainSelect : list.getSelects()) { + plainSelect.accept(this); + } + } + + @Override + public void visit(ExtractExpression eexpr) { + } + + @Override + public void visit(LateralSubSelect lateralSubSelect) { + lateralSubSelect.getSubSelect().getSelectBody().accept(this); + } + + @Override + public void visit(MultiExpressionList multiExprList) { + for (ExpressionList exprList : multiExprList.getExprList()) { + exprList.accept(this); + } + } + + @Override + public void visit(ValuesList valuesList) { + } + + /** + * Initializes table names collector. Important is the usage of Column instances to find + * table names. This is only allowed for expression parsing, where a better place for + * tablenames could not be there. For complete statements only from items are used to avoid + * some alias as tablenames. + * @param allowColumnProcessing + */ + protected void init(boolean allowColumnProcessing) { + otherItemNames = new ArrayList(); + tables = new ArrayList(); + this.allowColumnProcessing = allowColumnProcessing; + } + + @Override + public void visit(IntervalExpression iexpr) { + } + + @Override + public void visit(JdbcNamedParameter jdbcNamedParameter) { + } + + @Override + public void visit(OracleHierarchicalExpression oexpr) { + if (oexpr.getStartExpression() != null) { + oexpr.getStartExpression().accept(this); + } + + if (oexpr.getConnectExpression() != null) { + oexpr.getConnectExpression().accept(this); + } + } + + @Override + public void visit(RegExpMatchOperator rexpr) { + visitBinaryExpression(rexpr); + } + + @Override + public void visit(RegExpMySQLOperator rexpr) { + visitBinaryExpression(rexpr); + } + + @Override + public void visit(JsonExpression jsonExpr) { + } + + @Override + public void visit(JsonOperator jsonExpr) { + } + + @Override + public void visit(AllColumns allColumns) { + } + + @Override + public void visit(AllTableColumns allTableColumns) { + } + + @Override + public void visit(SelectExpressionItem item) { + item.getExpression().accept(this); + } + + @Override + public void visit(UserVariable var) { + } + + @Override + public void visit(NumericBind bind) { + + } + + @Override + public void visit(KeepExpression aexpr) { + } + + @Override + public void visit(MySQLGroupConcat groupConcat) { + } + + @Override + public void visit(ValueListExpression valueList) { + valueList.getExpressionList().accept(this); + } + + @Override + public void visit(Delete delete) { + visit(delete.getTable()); + + if (delete.getJoins() != null) { + for (Join join : delete.getJoins()) { + join.getRightItem().accept(this); + } + } + + if (delete.getWhere() != null) { + delete.getWhere().accept(this); + } + } + + @Override + public void visit(Update update) { + for (Table table : update.getTables()) { + visit(table); + } + if (update.getExpressions() != null) { + for (Expression expression : update.getExpressions()) { + expression.accept(this); + } + } + + if (update.getFromItem() != null) { + update.getFromItem().accept(this); + } + + if (update.getJoins() != null) { + for (Join join : update.getJoins()) { + join.getRightItem().accept(this); + } + } + + if (update.getWhere() != null) { + update.getWhere().accept(this); + } + } + + @Override + public void visit(Insert insert) { + visit(insert.getTable()); + if (insert.getItemsList() != null) { + insert.getItemsList().accept(this); + } + if (insert.getSelect() != null) { + visit(insert.getSelect()); + } + } + + @Override + public void visit(Replace replace) { + visit(replace.getTable()); + if (replace.getExpressions() != null) { + for (Expression expression : replace.getExpressions()) { + expression.accept(this); + } + } + if (replace.getItemsList() != null) { + replace.getItemsList().accept(this); + } + } + + @Override + public void visit(Drop drop) { + throw new UnsupportedOperationException(NOT_SUPPORTED_YET); + } + + @Override + public void visit(Truncate truncate) { + throw new UnsupportedOperationException(NOT_SUPPORTED_YET); + } + + @Override + public void visit(CreateIndex createIndex) { + throw new UnsupportedOperationException(NOT_SUPPORTED_YET); + } + + @Override + public void visit(CreateTable create) { + visit(create.getTable()); + if (create.getSelect() != null) { + create.getSelect().accept(this); + } + } + + @Override + public void visit(CreateView createView) { + throw new UnsupportedOperationException(NOT_SUPPORTED_YET); + } + + @Override + public void visit(Alter alter) { + throw new UnsupportedOperationException(NOT_SUPPORTED_YET); + } + + @Override + public void visit(Statements stmts) { + throw new UnsupportedOperationException(NOT_SUPPORTED_YET); + } + + @Override + public void visit(Execute execute) { + throw new UnsupportedOperationException(NOT_SUPPORTED_YET); + } + + @Override + public void visit(SetStatement set) { + throw new UnsupportedOperationException(NOT_SUPPORTED_YET); + } + + @Override + public void visit(RowConstructor rowConstructor) { + for (Expression expr : rowConstructor.getExprList().getExpressions()) { + expr.accept(this); + } + } + + @Override + public void visit(HexValue hexValue) { + + } + + @Override + public void visit(Merge merge) { + visit(merge.getTable()); + if (merge.getUsingTable() != null) { + merge.getUsingTable().accept(this); + } else if (merge.getUsingSelect() != null) { + merge.getUsingSelect().accept((FromItemVisitor) this); + } + } + + @Override + public void visit(OracleHint hint) { + } + + @Override + public void visit(TableFunction valuesList) { + } + + @Override + public void visit(AlterView alterView) { + throw new UnsupportedOperationException(NOT_SUPPORTED_YET); + } + + @Override + public void visit(TimeKeyExpression timeKeyExpression) { + } + + @Override + public void visit(DateTimeLiteralExpression literal) { + + } + + @Override + public void visit(Commit commit) { + + } + + @Override + public void visit(Upsert upsert) { + visit(upsert.getTable()); + if (upsert.getItemsList() != null) { + upsert.getItemsList().accept(this); + } + if (upsert.getSelect() != null) { + visit(upsert.getSelect()); + } + } + + @Override + public void visit(UseStatement use) { + } + + @Override + public void visit(ParenthesisFromItem parenthesis) { + parenthesis.getFromItem().accept(this); + } + + @Override + public void visit(CreateSequence createSequence) { + + } +} diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/CreateSequenceDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/CreateSequenceDeParser.java new file mode 100644 index 0000000000..fa4c8ae405 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/util/deparser/CreateSequenceDeParser.java @@ -0,0 +1,43 @@ +/* + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2020 JSQLParser + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ +package net.sf.jsqlparser.util.deparser; + +import net.sf.jsqlparser.statement.create.sequence.CreateSequence; + +/** + * A class to de-parse (that is, transform from JSqlParser hierarchy into a string) a + * {@link net.sf.jsqlparser.statement.create.sequence.CreateSequence} + */ +public class CreateSequenceDeParser { + + private StringBuilder buffer; + + /** + * @param buffer the buffer that will be filled with the select + */ + public CreateSequenceDeParser(StringBuilder buffer) { + this.buffer = buffer; + } + + public void deParse(CreateSequence createSequence) { + } +} diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java index 0140d89e20..37dd9a7fa2 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java @@ -1,224 +1,230 @@ -/* - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2013 JSQLParser - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * . - * #L% - */ -package net.sf.jsqlparser.util.deparser; - -import java.util.Iterator; - -import net.sf.jsqlparser.statement.Commit; -import net.sf.jsqlparser.statement.SetStatement; -import net.sf.jsqlparser.statement.StatementVisitor; -import net.sf.jsqlparser.statement.Statements; -import net.sf.jsqlparser.statement.UseStatement; -import net.sf.jsqlparser.statement.alter.Alter; -import net.sf.jsqlparser.statement.create.index.CreateIndex; -import net.sf.jsqlparser.statement.create.table.CreateTable; -import net.sf.jsqlparser.statement.create.view.AlterView; -import net.sf.jsqlparser.statement.create.view.CreateView; -import net.sf.jsqlparser.statement.delete.Delete; -import net.sf.jsqlparser.statement.drop.Drop; -import net.sf.jsqlparser.statement.execute.Execute; -import net.sf.jsqlparser.statement.insert.Insert; -import net.sf.jsqlparser.statement.merge.Merge; -import net.sf.jsqlparser.statement.replace.Replace; -import net.sf.jsqlparser.statement.select.Select; -import net.sf.jsqlparser.statement.select.WithItem; -import net.sf.jsqlparser.statement.truncate.Truncate; -import net.sf.jsqlparser.statement.update.Update; -import net.sf.jsqlparser.statement.upsert.Upsert; - -public class StatementDeParser implements StatementVisitor { - private ExpressionDeParser expressionDeParser; - - private SelectDeParser selectDeParser; - - private StringBuilder buffer; - - public StatementDeParser(StringBuilder buffer) { - this(new ExpressionDeParser(), new SelectDeParser(), buffer); - } - - public StatementDeParser(ExpressionDeParser expressionDeParser, SelectDeParser selectDeParser, StringBuilder buffer) { - this.expressionDeParser = expressionDeParser; - this.selectDeParser = selectDeParser; - this.buffer = buffer; - } - - @Override - public void visit(CreateIndex createIndex) { - CreateIndexDeParser createIndexDeParser = new CreateIndexDeParser(buffer); - createIndexDeParser.deParse(createIndex); - } - - @Override - public void visit(CreateTable createTable) { - CreateTableDeParser createTableDeParser = new CreateTableDeParser(buffer); - createTableDeParser.deParse(createTable); - } - - @Override - public void visit(CreateView createView) { - CreateViewDeParser createViewDeParser = new CreateViewDeParser(buffer); - createViewDeParser.deParse(createView); - } - - @Override - public void visit(AlterView alterView) { - AlterViewDeParser alterViewDeParser = new AlterViewDeParser(buffer); - alterViewDeParser.deParse(alterView); - } - - @Override - public void visit(Delete delete) { - selectDeParser.setBuffer(buffer); - expressionDeParser.setSelectVisitor(selectDeParser); - expressionDeParser.setBuffer(buffer); - selectDeParser.setExpressionVisitor(expressionDeParser); - DeleteDeParser deleteDeParser = new DeleteDeParser(expressionDeParser, buffer); - deleteDeParser.deParse(delete); - } - - @Override - public void visit(Drop drop) { - DropDeParser dropDeParser = new DropDeParser(buffer); - dropDeParser.deParse(drop); - } - - @Override - public void visit(Insert insert) { - selectDeParser.setBuffer(buffer); - expressionDeParser.setSelectVisitor(selectDeParser); - expressionDeParser.setBuffer(buffer); - selectDeParser.setExpressionVisitor(expressionDeParser); - InsertDeParser insertDeParser = new InsertDeParser(expressionDeParser, selectDeParser, buffer); - insertDeParser.deParse(insert); - } - - @Override - public void visit(Replace replace) { - selectDeParser.setBuffer(buffer); - expressionDeParser.setSelectVisitor(selectDeParser); - expressionDeParser.setBuffer(buffer); - selectDeParser.setExpressionVisitor(expressionDeParser); - ReplaceDeParser replaceDeParser = new ReplaceDeParser(expressionDeParser, selectDeParser, buffer); - replaceDeParser.deParse(replace); - } - - @Override - public void visit(Select select) { - selectDeParser.setBuffer(buffer); - expressionDeParser.setSelectVisitor(selectDeParser); - expressionDeParser.setBuffer(buffer); - selectDeParser.setExpressionVisitor(expressionDeParser); - if (select.getWithItemsList() != null && !select.getWithItemsList().isEmpty()) { - buffer.append("WITH "); - for (Iterator iter = select.getWithItemsList().iterator(); iter.hasNext();) { - WithItem withItem = iter.next(); - withItem.accept(selectDeParser); - if (iter.hasNext()) { - buffer.append(","); - } - buffer.append(" "); - } - } - select.getSelectBody().accept(selectDeParser); - } - - @Override - public void visit(Truncate truncate) { - } - - @Override - public void visit(Update update) { - selectDeParser.setBuffer(buffer); - expressionDeParser.setSelectVisitor(selectDeParser); - expressionDeParser.setBuffer(buffer); - UpdateDeParser updateDeParser = new UpdateDeParser(expressionDeParser, selectDeParser, buffer); - selectDeParser.setExpressionVisitor(expressionDeParser); - updateDeParser.deParse(update); - - } - - public StringBuilder getBuffer() { - return buffer; - } - - public void setBuffer(StringBuilder buffer) { - this.buffer = buffer; - } - - @Override - public void visit(Alter alter) { - AlterDeParser alterDeParser = new AlterDeParser(buffer); - alterDeParser.deParse(alter); - } - - @Override - public void visit(Statements stmts) { - stmts.accept(this); - } - - @Override - public void visit(Execute execute) { - selectDeParser.setBuffer(buffer); - expressionDeParser.setSelectVisitor(selectDeParser); - expressionDeParser.setBuffer(buffer); - ExecuteDeParser executeDeParser = new ExecuteDeParser(expressionDeParser, buffer); - selectDeParser.setExpressionVisitor(expressionDeParser); - executeDeParser.deParse(execute); - } - - @Override - public void visit(SetStatement set) { - selectDeParser.setBuffer(buffer); - expressionDeParser.setSelectVisitor(selectDeParser); - expressionDeParser.setBuffer(buffer); - SetStatementDeParser setStatementDeparser = new SetStatementDeParser(expressionDeParser, buffer); - selectDeParser.setExpressionVisitor(expressionDeParser); - setStatementDeparser.deParse(set); - } - - @Override - public void visit(Merge merge) { - //TODO implementation of a deparser - buffer.append(merge.toString()); - } - - @Override - public void visit(Commit commit) { - buffer.append(commit.toString()); - } - - @Override - public void visit(Upsert upsert) { - selectDeParser.setBuffer(buffer); - expressionDeParser.setSelectVisitor(selectDeParser); - expressionDeParser.setBuffer(buffer); - selectDeParser.setExpressionVisitor(expressionDeParser); - UpsertDeParser upsertDeParser = new UpsertDeParser(expressionDeParser, selectDeParser, buffer); - upsertDeParser.deParse(upsert); - } - - @Override - public void visit(UseStatement use) { - new UseStatementDeParser(buffer).deParse(use); - } -} +/* + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2013 JSQLParser + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ +package net.sf.jsqlparser.util.deparser; + +import java.util.Iterator; + +import net.sf.jsqlparser.statement.Commit; +import net.sf.jsqlparser.statement.SetStatement; +import net.sf.jsqlparser.statement.StatementVisitor; +import net.sf.jsqlparser.statement.Statements; +import net.sf.jsqlparser.statement.UseStatement; +import net.sf.jsqlparser.statement.alter.Alter; +import net.sf.jsqlparser.statement.create.index.CreateIndex; +import net.sf.jsqlparser.statement.create.sequence.CreateSequence; +import net.sf.jsqlparser.statement.create.table.CreateTable; +import net.sf.jsqlparser.statement.create.view.AlterView; +import net.sf.jsqlparser.statement.create.view.CreateView; +import net.sf.jsqlparser.statement.delete.Delete; +import net.sf.jsqlparser.statement.drop.Drop; +import net.sf.jsqlparser.statement.execute.Execute; +import net.sf.jsqlparser.statement.insert.Insert; +import net.sf.jsqlparser.statement.merge.Merge; +import net.sf.jsqlparser.statement.replace.Replace; +import net.sf.jsqlparser.statement.select.Select; +import net.sf.jsqlparser.statement.select.WithItem; +import net.sf.jsqlparser.statement.truncate.Truncate; +import net.sf.jsqlparser.statement.update.Update; +import net.sf.jsqlparser.statement.upsert.Upsert; + +public class StatementDeParser implements StatementVisitor { + private ExpressionDeParser expressionDeParser; + + private SelectDeParser selectDeParser; + + private StringBuilder buffer; + + public StatementDeParser(StringBuilder buffer) { + this(new ExpressionDeParser(), new SelectDeParser(), buffer); + } + + public StatementDeParser(ExpressionDeParser expressionDeParser, SelectDeParser selectDeParser, StringBuilder buffer) { + this.expressionDeParser = expressionDeParser; + this.selectDeParser = selectDeParser; + this.buffer = buffer; + } + + @Override + public void visit(CreateIndex createIndex) { + CreateIndexDeParser createIndexDeParser = new CreateIndexDeParser(buffer); + createIndexDeParser.deParse(createIndex); + } + + @Override + public void visit(CreateTable createTable) { + CreateTableDeParser createTableDeParser = new CreateTableDeParser(buffer); + createTableDeParser.deParse(createTable); + } + + @Override + public void visit(CreateView createView) { + CreateViewDeParser createViewDeParser = new CreateViewDeParser(buffer); + createViewDeParser.deParse(createView); + } + + @Override + public void visit(AlterView alterView) { + AlterViewDeParser alterViewDeParser = new AlterViewDeParser(buffer); + alterViewDeParser.deParse(alterView); + } + + @Override + public void visit(Delete delete) { + selectDeParser.setBuffer(buffer); + expressionDeParser.setSelectVisitor(selectDeParser); + expressionDeParser.setBuffer(buffer); + selectDeParser.setExpressionVisitor(expressionDeParser); + DeleteDeParser deleteDeParser = new DeleteDeParser(expressionDeParser, buffer); + deleteDeParser.deParse(delete); + } + + @Override + public void visit(Drop drop) { + DropDeParser dropDeParser = new DropDeParser(buffer); + dropDeParser.deParse(drop); + } + + @Override + public void visit(Insert insert) { + selectDeParser.setBuffer(buffer); + expressionDeParser.setSelectVisitor(selectDeParser); + expressionDeParser.setBuffer(buffer); + selectDeParser.setExpressionVisitor(expressionDeParser); + InsertDeParser insertDeParser = new InsertDeParser(expressionDeParser, selectDeParser, buffer); + insertDeParser.deParse(insert); + } + + @Override + public void visit(Replace replace) { + selectDeParser.setBuffer(buffer); + expressionDeParser.setSelectVisitor(selectDeParser); + expressionDeParser.setBuffer(buffer); + selectDeParser.setExpressionVisitor(expressionDeParser); + ReplaceDeParser replaceDeParser = new ReplaceDeParser(expressionDeParser, selectDeParser, buffer); + replaceDeParser.deParse(replace); + } + + @Override + public void visit(Select select) { + selectDeParser.setBuffer(buffer); + expressionDeParser.setSelectVisitor(selectDeParser); + expressionDeParser.setBuffer(buffer); + selectDeParser.setExpressionVisitor(expressionDeParser); + if (select.getWithItemsList() != null && !select.getWithItemsList().isEmpty()) { + buffer.append("WITH "); + for (Iterator iter = select.getWithItemsList().iterator(); iter.hasNext();) { + WithItem withItem = iter.next(); + withItem.accept(selectDeParser); + if (iter.hasNext()) { + buffer.append(","); + } + buffer.append(" "); + } + } + select.getSelectBody().accept(selectDeParser); + } + + @Override + public void visit(Truncate truncate) { + } + + @Override + public void visit(Update update) { + selectDeParser.setBuffer(buffer); + expressionDeParser.setSelectVisitor(selectDeParser); + expressionDeParser.setBuffer(buffer); + UpdateDeParser updateDeParser = new UpdateDeParser(expressionDeParser, selectDeParser, buffer); + selectDeParser.setExpressionVisitor(expressionDeParser); + updateDeParser.deParse(update); + + } + + public StringBuilder getBuffer() { + return buffer; + } + + public void setBuffer(StringBuilder buffer) { + this.buffer = buffer; + } + + @Override + public void visit(Alter alter) { + AlterDeParser alterDeParser = new AlterDeParser(buffer); + alterDeParser.deParse(alter); + } + + @Override + public void visit(Statements stmts) { + stmts.accept(this); + } + + @Override + public void visit(Execute execute) { + selectDeParser.setBuffer(buffer); + expressionDeParser.setSelectVisitor(selectDeParser); + expressionDeParser.setBuffer(buffer); + ExecuteDeParser executeDeParser = new ExecuteDeParser(expressionDeParser, buffer); + selectDeParser.setExpressionVisitor(expressionDeParser); + executeDeParser.deParse(execute); + } + + @Override + public void visit(SetStatement set) { + selectDeParser.setBuffer(buffer); + expressionDeParser.setSelectVisitor(selectDeParser); + expressionDeParser.setBuffer(buffer); + SetStatementDeParser setStatementDeparser = new SetStatementDeParser(expressionDeParser, buffer); + selectDeParser.setExpressionVisitor(expressionDeParser); + setStatementDeparser.deParse(set); + } + + @Override + public void visit(Merge merge) { + //TODO implementation of a deparser + buffer.append(merge.toString()); + } + + @Override + public void visit(Commit commit) { + buffer.append(commit.toString()); + } + + @Override + public void visit(Upsert upsert) { + selectDeParser.setBuffer(buffer); + expressionDeParser.setSelectVisitor(selectDeParser); + expressionDeParser.setBuffer(buffer); + selectDeParser.setExpressionVisitor(expressionDeParser); + UpsertDeParser upsertDeParser = new UpsertDeParser(expressionDeParser, selectDeParser, buffer); + upsertDeParser.deParse(upsert); + } + + @Override + public void visit(UseStatement use) { + new UseStatementDeParser(buffer).deParse(use); + } + + @Override + public void visit(CreateSequence createSequence) { + new CreateSequenceDeParser(buffer).deParse(createSequence); + } +} diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 12516f3289..c84cd87549 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -71,6 +71,7 @@ import net.sf.jsqlparser.schema.*; import net.sf.jsqlparser.statement.*; import net.sf.jsqlparser.statement.alter.*; import net.sf.jsqlparser.statement.create.index.*; +import net.sf.jsqlparser.statement.create.sequence.*; import net.sf.jsqlparser.statement.create.table.*; import net.sf.jsqlparser.statement.create.view.*; import net.sf.jsqlparser.statement.delete.*; @@ -148,6 +149,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -199,6 +201,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -224,6 +227,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -3666,11 +3670,48 @@ Commit Commit(): } } +Sequence Sequence() #Sequence : +{ + String serverName = null, databaseName = null, schemaName = null, sequenceName = null; +} +{ + ( + LOOKAHEAD(7) serverName=RelObjectName() "." [databaseName=RelObjectName()] "." [sequenceName=RelObjectName()] "." sequenceName=RelObjectName() + | LOOKAHEAD(5) databaseName=RelObjectName() "." [schemaName=RelObjectName()] "." sequenceName=RelObjectName() + | LOOKAHEAD(3) schemaName=RelObjectName() "." sequenceName=RelObjectName() + | sequenceName=RelObjectName() + ) + { + final Server server = new Server(serverName); + final Database database = new Database(server, databaseName); + Sequence sequence = new Sequence(database, schemaName, sequenceName); + return sequence; + } +} + CreateSequence CreateSequence(): { CreateSequence createSequence = new CreateSequence(); + Sequence sequence; + Token token = null; + Token mode = null; + // TODO preserve order, probably need a type for sequence parameters } { - + sequence=Sequence() { createSequence.setSequence(sequence); } + ( + ( { sequence.setCacheMode(Sequence.CacheMode.NOCACHE); } + | token= + { + sequence.setCacheMode(Sequence.CacheMode.CACHE); + sequence.setCache(Long.parseLong(token.image)); + } + ) + | + ( token= { sequence.setIncrementBy(Long.parseLong(token.image)); }) + )* //zero or many times those productions + { + return createSequence; + } } diff --git a/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java b/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java index 45d4d31d35..89cad82629 100644 --- a/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java @@ -2,7 +2,6 @@ import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.parser.CCJSqlParserUtil; -import net.sf.jsqlparser.parser.ParseException; import net.sf.jsqlparser.statement.create.sequence.CreateSequence; import org.junit.Test; @@ -10,7 +9,7 @@ public class CreateSequenceTest { @Test public void testCreateSequence() throws JSQLParserException { - CreateSequence statement = (CreateSequence) CCJSqlParserUtil.parse("CREATE SEQUENCE"); + CreateSequence statement = (CreateSequence) CCJSqlParserUtil.parse("CREATE SEQUENCE foo CACHE 10 INCREMENT BY 5"); System.out.println(statement); } } From e4dc7ca180c5892bd34db09735c107ea22632296 Mon Sep 17 00:00:00 2001 From: AnEmortalKid Date: Thu, 23 Apr 2020 22:09:52 -0500 Subject: [PATCH 3/6] support sequence --- .../net/sf/jsqlparser/schema/Sequence.java | 146 +++++++++++------- .../create/sequence/CreateSequence.java | 43 +++--- .../util/deparser/CreateSequenceDeParser.java | 44 +++--- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 38 +++-- .../statement/create/CreateSequenceTest.java | 39 ++++- 5 files changed, 205 insertions(+), 105 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/schema/Sequence.java b/src/main/java/net/sf/jsqlparser/schema/Sequence.java index 1523e84e24..deb8a739fe 100644 --- a/src/main/java/net/sf/jsqlparser/schema/Sequence.java +++ b/src/main/java/net/sf/jsqlparser/schema/Sequence.java @@ -1,28 +1,30 @@ /* - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2020 JSQLParser - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * . + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2020 JSQLParser + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . * #L% */ package net.sf.jsqlparser.schema; import net.sf.jsqlparser.parser.ASTNodeAccessImpl; +import java.util.List; + /** * Represents the database type for a {@code SEQUENCE} */ @@ -32,11 +34,7 @@ public class Sequence extends ASTNodeAccessImpl implements MultiPartName { private String schemaName; private Database database; - private Long incrementBy; - - private CacheMode cacheMode; - private Long cache; - + private List parameters; public Sequence() { } @@ -57,34 +55,12 @@ public Sequence(Database database, String schemaName, String name) { this.name = name; } - public void setIncrementBy(Long incrementBy) { - this.incrementBy = incrementBy; - } - - public Long getIncrementBy() { - return incrementBy; + public void setParameters(List parameters) { + this.parameters = parameters; } - public void setCacheMode(CacheMode cacheMode) { - this.cacheMode = cacheMode; - } - - /** - * @return the Cache attribute, null if one was not specified. - */ - public CacheMode getCacheMode() { - return cacheMode; - } - - public void setCache(Long cache) { - this.cache = cache; - } - - /** - * @return the value for Cache, returns null if a {@code CACHE|NOCACHE} clause was not specified or the {@link #getCacheMode()} is #NOCACHE - */ - public Long getCache() { - return cache; + public List getParameters() { + return parameters; } @Override @@ -112,10 +88,76 @@ public String getFullyQualifiedName() { return fqn; } + @Override + public String toString() { + StringBuilder sql = new StringBuilder(getFullyQualifiedName()); + if(parameters != null) { + for (Sequence.Parameter parameter : parameters) { + sql.append(" ").append(parameter.formatParameter()); + } + } + return sql.toString(); + } + + /** + * The available parameters to a sequence + */ + public enum ParameterType { + INCREMENT_BY, + START_WITH, + MAXVALUE, + NOMAXVALUE, + MINVALUE, + NOMINVALUE, + CYCLE, + NOCYCLE, + CACHE, + NOCACHE, + ORDER, + NOORDER, + KEEP, + NOKEEP, + SESSION, + GLOBAL + } + /** - * Caching mode between CACHE and NOCACHE, when the mode is CACHE a value will exist in Cache + * Represents a parameter when declaring a sequence */ - public enum CacheMode { - CACHE, NOCACHE + public static class Parameter { + private final ParameterType option; + private Long value; + + public Parameter(ParameterType option) { + this.option = option; + } + + public Long getValue() { + return value; + } + + public void setValue(Long value) { + this.value = value; + } + + public String formatParameter() { + switch (option) { + case INCREMENT_BY: + return withValue("INCREMENT BY"); + case START_WITH: + return withValue("START WITH"); + case MAXVALUE: + case MINVALUE: + case CACHE: + return withValue(option.name()); + default: + // fallthrough just return option name + return option.name(); + } + } + + private String withValue(String prefix) { + return prefix + " " + value; + } } } diff --git a/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java b/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java index 4b275c79f9..d46ea17478 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java @@ -1,22 +1,22 @@ /* - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2020 JSQLParser - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * . + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2020 JSQLParser + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . * #L% */ package net.sf.jsqlparser.statement.create.sequence; @@ -44,4 +44,11 @@ public Sequence getSequence() { public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); } + + @Override + public String toString() { + String sql; + sql = "CREATE SEQUENCE " + sequence; + return sql; + } } diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/CreateSequenceDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/CreateSequenceDeParser.java index fa4c8ae405..deca258e25 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/CreateSequenceDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/CreateSequenceDeParser.java @@ -1,24 +1,24 @@ -/* - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2020 JSQLParser - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * . - * #L% - */ +/* + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2020 JSQLParser + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ package net.sf.jsqlparser.util.deparser; import net.sf.jsqlparser.statement.create.sequence.CreateSequence; @@ -39,5 +39,7 @@ public CreateSequenceDeParser(StringBuilder buffer) { } public void deParse(CreateSequence createSequence) { + buffer.append("CREATE SEQUENCE "); + buffer.append(createSequence.getSequence()); } } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index c84cd87549..3f40845dcb 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -3693,25 +3693,45 @@ CreateSequence CreateSequence(): { CreateSequence createSequence = new CreateSequence(); Sequence sequence; + List sequenceParameters = new ArrayList(); + Sequence.Parameter parameter = null; Token token = null; - Token mode = null; - // TODO preserve order, probably need a type for sequence parameters } { sequence=Sequence() { createSequence.setSequence(sequence); } ( - ( { sequence.setCacheMode(Sequence.CacheMode.NOCACHE); } - | token= - { - sequence.setCacheMode(Sequence.CacheMode.CACHE); - sequence.setCache(Long.parseLong(token.image)); - } + ( token= + { + parameter = new Sequence.Parameter(Sequence.ParameterType.INCREMENT_BY); + parameter.setValue(Long.parseLong(token.image)); + sequenceParameters.add(parameter); + } ) | - ( token= { sequence.setIncrementBy(Long.parseLong(token.image)); }) + ( token= + { + parameter = new Sequence.Parameter(Sequence.ParameterType.START_WITH); + parameter.setValue(Long.parseLong(token.image)); + sequenceParameters.add(parameter); + } + ) + | + ( + { + parameter = new Sequence.Parameter(Sequence.ParameterType.NOCACHE); + sequenceParameters.add(parameter); + } + | token= + { + parameter = new Sequence.Parameter(Sequence.ParameterType.CACHE); + parameter.setValue(Long.parseLong(token.image)); + sequenceParameters.add(parameter); + } + ) )* //zero or many times those productions { + sequence.setParameters(sequenceParameters); return createSequence; } } diff --git a/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java b/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java index 89cad82629..37d234198e 100644 --- a/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java @@ -1,15 +1,44 @@ package net.sf.jsqlparser.statement.create; import net.sf.jsqlparser.JSQLParserException; -import net.sf.jsqlparser.parser.CCJSqlParserUtil; -import net.sf.jsqlparser.statement.create.sequence.CreateSequence; import org.junit.Test; +import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; + public class CreateSequenceTest { @Test - public void testCreateSequence() throws JSQLParserException { - CreateSequence statement = (CreateSequence) CCJSqlParserUtil.parse("CREATE SEQUENCE foo CACHE 10 INCREMENT BY 5"); - System.out.println(statement); + public void testCreateSequence_noParams() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq"); } + + @Test + public void testCreateSequence_withIncrement() throws JSQLParserException{ + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq INCREMENT BY 1"); + } + + @Test + public void testCreateSequence_withStart() throws JSQLParserException{ + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq START WITH 10"); + } + + @Test + public void testCreateSequence_withCache() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq CACHE 10"); + } + + @Test + public void testCreateSequence_withNoCache() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOCACHE"); + } + + /** + * Verifies that we declare the parameter options in the order we found them + */ + @Test + public void testCreateSequence_preservesParamOrder() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_sec INCREMENT BY 2 START WITH 10"); + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_sec START WITH 2 INCREMENT BY 5 NOCACHE"); + } + } From 5016d3ce5c3b700ac97a388a727f78eb800e8340 Mon Sep 17 00:00:00 2001 From: AnEmortalKid Date: Thu, 23 Apr 2020 22:52:35 -0500 Subject: [PATCH 4/6] implement feature --- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 65 +- .../statement/create/CreateSequenceTest.java | 61 ++ .../statement/create/CreateTableTest.java | 820 +++++++++--------- .../statement/select/SpecialOracleTest.java | 323 +++---- 4 files changed, 697 insertions(+), 572 deletions(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 3f40845dcb..225acb19aa 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -163,6 +163,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -193,6 +194,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -221,14 +223,20 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | +| | | | | | | +| +| +| +| | | | @@ -264,6 +272,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -397,6 +406,9 @@ Statement SingleStatement() : LOOKAHEAD(CreateIndex()) stm = CreateIndex() | + LOOKAHEAD(CreateSequence()) + stm = CreateSequence() + | LOOKAHEAD(CreateTable()) stm = CreateTable() | @@ -416,9 +428,6 @@ Statement SingleStatement() : stm = Use() | stm = Commit() - | - LOOKAHEAD(CreateSequence()) - stm = CreateSequence() ) { return stm; } } catch (ParseException e) { @@ -3031,7 +3040,7 @@ CreateTable CreateTable(): [ { createTable.setUnlogged(true); } ] - /* [ [ (tk= | tk=) {createOptions.add(tk.image);} ] + /* [ [ (tk= | tk=) {createOptions.add(tk.image);} ] ( tk= | tk= ) {createOptions.add(tk.image);}] */ (parameter = CreateParameter() { createOptions.addAll(parameter); })* @@ -3717,18 +3726,60 @@ CreateSequence CreateSequence(): } ) | + ( + { + parameter = new Sequence.Parameter(Sequence.ParameterType.NOMAXVALUE); + sequenceParameters.add(parameter); + } + | token= + { + parameter = new Sequence.Parameter(Sequence.ParameterType.MAXVALUE); + parameter.setValue(Long.parseLong(token.image)); + sequenceParameters.add(parameter); + } + ) + | + ( + { + parameter = new Sequence.Parameter(Sequence.ParameterType.NOMINVALUE); + sequenceParameters.add(parameter); + } + | token= + { + parameter = new Sequence.Parameter(Sequence.ParameterType.MINVALUE); + parameter.setValue(Long.parseLong(token.image)); + sequenceParameters.add(parameter); + } + ) + | + ( { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOCYCLE)); } + | { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.CYCLE)); } + ) + | ( { parameter = new Sequence.Parameter(Sequence.ParameterType.NOCACHE); sequenceParameters.add(parameter); } - | token= + | token= { parameter = new Sequence.Parameter(Sequence.ParameterType.CACHE); - parameter.setValue(Long.parseLong(token.image)); - sequenceParameters.add(parameter); + parameter.setValue(Long.parseLong(token.image)); + sequenceParameters.add(parameter); } ) + | + ( { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.ORDER)); } + | { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOORDER)); } + ) + | + ( { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.KEEP)); } + | { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOKEEP)); } + ) + | + ( { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.SESSION)); } + | { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.GLOBAL)); } + ) )* //zero or many times those productions { sequence.setParameters(sequenceParameters); diff --git a/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java b/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java index 37d234198e..db085e8d09 100644 --- a/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java @@ -22,6 +22,36 @@ public void testCreateSequence_withStart() throws JSQLParserException{ assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq START WITH 10"); } + @Test + public void testCreateSequence_withMaxValue() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq MAXVALUE 5"); + } + + @Test + public void testCreateSequence_withNoMaxValue() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOMAXVALUE"); + } + + @Test + public void testCreateSequence_withMinValue() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq MINVALUE 5"); + } + + @Test + public void testCreateSequence_withNoMinValue() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOMINVALUE"); + } + + @Test + public void testCreateSequence_withCycle() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq CYCLE"); + } + + @Test + public void testCreateSequence_withNoCycle() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOCYCLE"); + } + @Test public void testCreateSequence_withCache() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq CACHE 10"); @@ -32,6 +62,36 @@ public void testCreateSequence_withNoCache() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOCACHE"); } + @Test + public void testCreateSequence_withOrder() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq ORDER"); + } + + @Test + public void testCreateSequence_withNoOrder() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOORDER"); + } + + @Test + public void testCreateSequence_withKeep() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq KEEP"); + } + + @Test + public void testCreateSequence_withNoKeep() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOKEEP"); + } + + @Test + public void testCreateSequence_withSession() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq SESSION"); + } + + @Test + public void testCreateSequence_withGlobal() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq GLOBAL"); + } + /** * Verifies that we declare the parameter options in the order we found them */ @@ -39,6 +99,7 @@ public void testCreateSequence_withNoCache() throws JSQLParserException { public void testCreateSequence_preservesParamOrder() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_sec INCREMENT BY 2 START WITH 10"); assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_sec START WITH 2 INCREMENT BY 5 NOCACHE"); + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_sec START WITH 2 INCREMENT BY 5 CACHE 200 CYCLE"); } } diff --git a/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java b/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java index ec815e96d5..bef1e9fc29 100644 --- a/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java @@ -1,410 +1,410 @@ -package net.sf.jsqlparser.statement.create; - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.StringTokenizer; - -import junit.framework.TestCase; -import net.sf.jsqlparser.JSQLParserException; -import net.sf.jsqlparser.parser.CCJSqlParserManager; -import net.sf.jsqlparser.statement.create.table.ColumnDefinition; -import net.sf.jsqlparser.statement.create.table.CreateTable; -import net.sf.jsqlparser.statement.create.table.Index; -import net.sf.jsqlparser.test.TestException; -import net.sf.jsqlparser.util.TablesNamesFinder; -import static net.sf.jsqlparser.test.TestUtils.*; - -public class CreateTableTest extends TestCase { - - private CCJSqlParserManager parserManager = new CCJSqlParserManager(); - - public CreateTableTest(String arg0) { - super(arg0); - } - - public void testCreateTable2() throws JSQLParserException { - String statement = "CREATE TABLE testtab (\"test\" varchar (255))"; - assertSqlCanBeParsedAndDeparsed(statement); - } - - public void testCreateTable3() throws JSQLParserException { - String statement = "CREATE TABLE testtab (\"test\" varchar (255), \"test2\" varchar (255))"; - assertSqlCanBeParsedAndDeparsed(statement); - } - - public void testCreateTableAsSelect() throws JSQLParserException, JSQLParserException, JSQLParserException, JSQLParserException { - String statement = "CREATE TABLE a AS SELECT col1, col2 FROM b"; - assertSqlCanBeParsedAndDeparsed(statement); - } - - public void testCreateTableAsSelect2() throws JSQLParserException { - String statement = "CREATE TABLE newtable AS WITH a AS (SELECT col1, col3 FROM testtable) SELECT col1, col2, col3 FROM b INNER JOIN a ON b.col1 = a.col1"; - assertSqlCanBeParsedAndDeparsed(statement); - } - - public void testCreateTable() throws JSQLParserException { - String statement = "CREATE TABLE mytab (mycol a (10, 20) c nm g, mycol2 mypar1 mypar2 (23,323,3) asdf ('23','123') dasd, " - + "PRIMARY KEY (mycol2, mycol)) type = myisam"; - CreateTable createTable = (CreateTable) parserManager.parse(new StringReader(statement)); - assertEquals(2, createTable.getColumnDefinitions().size()); - assertFalse(createTable.isUnlogged()); - assertEquals("mycol", ((ColumnDefinition) createTable.getColumnDefinitions().get(0)). - getColumnName()); - assertEquals("mycol2", ((ColumnDefinition) createTable.getColumnDefinitions().get(1)). - getColumnName()); - assertEquals("PRIMARY KEY", ((Index) createTable.getIndexes().get(0)).getType()); - assertEquals("mycol", ((Index) createTable.getIndexes().get(0)).getColumnsNames().get(1)); - assertEquals(statement, "" + createTable); - } - - public void testCreateTableUnlogged() throws JSQLParserException { - String statement = "CREATE UNLOGGED TABLE mytab (mycol a (10, 20) c nm g, mycol2 mypar1 mypar2 (23,323,3) asdf ('23','123') dasd, " - + "PRIMARY KEY (mycol2, mycol)) type = myisam"; - CreateTable createTable = (CreateTable) parserManager.parse(new StringReader(statement)); - assertEquals(2, createTable.getColumnDefinitions().size()); - assertTrue(createTable.isUnlogged()); - assertEquals("mycol", ((ColumnDefinition) createTable.getColumnDefinitions().get(0)). - getColumnName()); - assertEquals("mycol2", ((ColumnDefinition) createTable.getColumnDefinitions().get(1)). - getColumnName()); - assertEquals("PRIMARY KEY", ((Index) createTable.getIndexes().get(0)).getType()); - assertEquals("mycol", ((Index) createTable.getIndexes().get(0)).getColumnsNames().get(1)); - assertEquals(statement, "" + createTable); - } - - public void testCreateTableUnlogged2() throws JSQLParserException { - String statement = "CREATE UNLOGGED TABLE mytab (mycol a (10, 20) c nm g, mycol2 mypar1 mypar2 (23,323,3) asdf ('23','123') dasd, PRIMARY KEY (mycol2, mycol))"; - assertSqlCanBeParsedAndDeparsed(statement); - } - - public void testCreateTableForeignKey() throws JSQLParserException { - String statement = "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED, PRIMARY KEY (id), FOREIGN KEY (user_id) REFERENCES ra_user(id))"; - assertSqlCanBeParsedAndDeparsed(statement); - } - - public void testCreateTableForeignKey2() throws JSQLParserException { - String statement = "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED, PRIMARY KEY (id), CONSTRAINT fkIdx FOREIGN KEY (user_id) REFERENCES ra_user(id))"; - assertSqlCanBeParsedAndDeparsed(statement); - } - - public void testCreateTableForeignKey3() throws JSQLParserException { - String statement = "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED REFERENCES ra_user(id), PRIMARY KEY (id))"; - assertSqlCanBeParsedAndDeparsed(statement, true); - } - - public void testCreateTableForeignKey4() throws JSQLParserException { - String statement = "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED FOREIGN KEY REFERENCES ra_user(id), PRIMARY KEY (id))"; - assertSqlCanBeParsedAndDeparsed(statement, true); - } - - public void testCreateTablePrimaryKey() throws JSQLParserException { - String statement = "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED, CONSTRAINT pk_name PRIMARY KEY (id))"; - assertSqlCanBeParsedAndDeparsed(statement); - } - - public void testCreateTableParams() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TEMPORARY TABLE T1 (PROCESSID VARCHAR (32)) ON COMMIT PRESERVE ROWS"); - } - - public void testCreateTableUniqueConstraint() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE Activities (_id INTEGER PRIMARY KEY AUTOINCREMENT,uuid VARCHAR(255),user_id INTEGER,sound_id INTEGER,sound_type INTEGER,comment_id INTEGER,type String,tags VARCHAR(255),created_at INTEGER,content_id INTEGER,sharing_note_text VARCHAR(255),sharing_note_created_at INTEGER,UNIQUE (created_at, type, content_id, sound_id, user_id))", true); - } - - public void testCreateTableDefault() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE T1 (id integer default -1)"); - } - - public void testCreateTableDefault2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE T1 (id integer default 1)"); - } - - public void testCreateTableIfNotExists() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE IF NOT EXISTS animals (id INT NOT NULL)"); - } - - public void testCreateTableInlinePrimaryKey() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE animals (id INT PRIMARY KEY NOT NULL)"); - } - - public void testCreateTableWithRange() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE foo (name character varying (255), range character varying (255), start_range integer, end_range integer)"); - } - - public void testCreateTableWithKey() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE bar (key character varying (255) NOT NULL)"); - } - - public void testCreateTableWithUniqueKey() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE animals (id INT NOT NULL, name VARCHAR (100) UNIQUE KEY (id))"); - } - - public void testCreateTableVeryComplex() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_commentmeta` ( `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `comment_id` bigint(20) unsigned NOT NULL DEFAULT '0', `meta_key` varchar(255) DEFAULT NULL, `meta_value` longtext, PRIMARY KEY (`meta_id`), KEY `comment_id` (`comment_id`), KEY `meta_key` (`meta_key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8", true); - assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_comments` ( `comment_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `comment_post_ID` bigint(20) unsigned NOT NULL DEFAULT '0', `comment_author` tinytext NOT NULL, `comment_author_email` varchar(100) NOT NULL DEFAULT '', `comment_author_url` varchar(200) NOT NULL DEFAULT '', `comment_author_IP` varchar(100) NOT NULL DEFAULT '', `comment_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `comment_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `comment_content` text NOT NULL, `comment_karma` int(11) NOT NULL DEFAULT '0', `comment_approved` varchar(20) NOT NULL DEFAULT '1', `comment_agent` varchar(255) NOT NULL DEFAULT '', `comment_type` varchar(20) NOT NULL DEFAULT '', `comment_parent` bigint(20) unsigned NOT NULL DEFAULT '0', `user_id` bigint(20) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`comment_ID`), KEY `comment_post_ID` (`comment_post_ID`), KEY `comment_approved_date_gmt` (`comment_approved`,`comment_date_gmt`), KEY `comment_date_gmt` (`comment_date_gmt`), KEY `comment_parent` (`comment_parent`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8", true); - assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_links` ( `link_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `link_url` varchar(255) NOT NULL DEFAULT '', `link_name` varchar(255) NOT NULL DEFAULT '', `link_image` varchar(255) NOT NULL DEFAULT '', `link_target` varchar(25) NOT NULL DEFAULT '', `link_description` varchar(255) NOT NULL DEFAULT '', `link_visible` varchar(20) NOT NULL DEFAULT 'Y', `link_owner` bigint(20) unsigned NOT NULL DEFAULT '1', `link_rating` int(11) NOT NULL DEFAULT '0', `link_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `link_rel` varchar(255) NOT NULL DEFAULT '', `link_notes` mediumtext NOT NULL, `link_rss` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`link_id`), KEY `link_visible` (`link_visible`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8", true); - assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_options` ( `option_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `option_name` varchar(64) NOT NULL DEFAULT '', `option_value` longtext NOT NULL, `autoload` varchar(20) NOT NULL DEFAULT 'yes', PRIMARY KEY (`option_id`), UNIQUE KEY `option_name` (`option_name`) ) ENGINE=InnoDB AUTO_INCREMENT=402 DEFAULT CHARSET=utf8", true); - assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_postmeta` ( `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `post_id` bigint(20) unsigned NOT NULL DEFAULT '0', `meta_key` varchar(255) DEFAULT NULL, `meta_value` longtext, PRIMARY KEY (`meta_id`), KEY `post_id` (`post_id`), KEY `meta_key` (`meta_key`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8", true); - assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_posts` ( `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `post_author` bigint(20) unsigned NOT NULL DEFAULT '0', `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `post_content` longtext NOT NULL, `post_title` text NOT NULL, `post_excerpt` text NOT NULL, `post_status` varchar(20) NOT NULL DEFAULT 'publish', `comment_status` varchar(20) NOT NULL DEFAULT 'open', `ping_status` varchar(20) NOT NULL DEFAULT 'open', `post_password` varchar(20) NOT NULL DEFAULT '', `post_name` varchar(200) NOT NULL DEFAULT '', `to_ping` text NOT NULL, `pinged` text NOT NULL, `post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `post_content_filtered` longtext NOT NULL, `post_parent` bigint(20) unsigned NOT NULL DEFAULT '0', `guid` varchar(255) NOT NULL DEFAULT '', `menu_order` int(11) NOT NULL DEFAULT '0', `post_type` varchar(20) NOT NULL DEFAULT 'post', `post_mime_type` varchar(100) NOT NULL DEFAULT '', `comment_count` bigint(20) NOT NULL DEFAULT '0', PRIMARY KEY (`ID`), KEY `post_name` (`post_name`), KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`), KEY `post_parent` (`post_parent`), KEY `post_author` (`post_author`) ) ENGINE=InnoDB AUTO_INCREMENT=55004 DEFAULT CHARSET=utf8", true); - assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_term_relationships` ( `object_id` bigint(20) unsigned NOT NULL DEFAULT '0', `term_taxonomy_id` bigint(20) unsigned NOT NULL DEFAULT '0', `term_order` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`object_id`,`term_taxonomy_id`), KEY `term_taxonomy_id` (`term_taxonomy_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8", true); - assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_term_taxonomy` ( `term_taxonomy_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `term_id` bigint(20) unsigned NOT NULL DEFAULT '0', `taxonomy` varchar(32) NOT NULL DEFAULT '', `description` longtext NOT NULL, `parent` bigint(20) unsigned NOT NULL DEFAULT '0', `count` bigint(20) NOT NULL DEFAULT '0', PRIMARY KEY (`term_taxonomy_id`), UNIQUE KEY `term_id_taxonomy` (`term_id`,`taxonomy`), KEY `taxonomy` (`taxonomy`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8", true); - assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_terms` ( `term_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(200) NOT NULL DEFAULT '', `slug` varchar(200) NOT NULL DEFAULT '', `term_group` bigint(10) NOT NULL DEFAULT '0', PRIMARY KEY (`term_id`), UNIQUE KEY `slug` (`slug`), KEY `name` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8", true); - assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_usermeta` ( `umeta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `user_id` bigint(20) unsigned NOT NULL DEFAULT '0', `meta_key` varchar(255) DEFAULT NULL, `meta_value` longtext, PRIMARY KEY (`umeta_id`), KEY `user_id` (`user_id`), KEY `meta_key` (`meta_key`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8", true); - assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_users` ( `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `user_login` varchar(60) NOT NULL DEFAULT '', `user_pass` varchar(64) NOT NULL DEFAULT '', `user_nicename` varchar(50) NOT NULL DEFAULT '', `user_email` varchar(100) NOT NULL DEFAULT '', `user_url` varchar(100) NOT NULL DEFAULT '', `user_registered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `user_activation_key` varchar(60) NOT NULL DEFAULT '', `user_status` int(11) NOT NULL DEFAULT '0', `display_name` varchar(250) NOT NULL DEFAULT '', PRIMARY KEY (`ID`), KEY `user_login_key` (`user_login`), KEY `user_nicename` (`user_nicename`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8", true); - } - - public void testCreateTableArrays() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE sal_emp (name text, pay_by_quarter integer[], schedule text[][])"); - } - - public void testCreateTableArrays2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE sal_emp (name text, pay_by_quarter integer[5], schedule text[3][2])"); - } - - public void testCreateTableColumnValues() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE mytable1 (values INTEGER)"); - } - - public void testCreateTableColumnValue() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE mytable1 (value INTEGER)"); - } - - public void testCreateTableForeignKey5() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE IF NOT EXISTS table1 (id INTEGER PRIMARY KEY AUTO_INCREMENT, aid INTEGER REFERENCES accounts ON aid ON DELETE CASCADE, name STRING, lastname STRING)"); - } - - public void testCreateTableForeignKey6() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE test (id long, fkey long references another_table (id))"); - } - - public void testMySqlCreateTableOnUpdateCurrentTimestamp() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE test (applied timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)"); - } - - public void testMySqlCreateTableWithConstraintWithCascade() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE table1 (id INT (10) UNSIGNED NOT NULL AUTO_INCREMENT, t2_id INT (10) UNSIGNED DEFAULT NULL, t3_id INT (10) UNSIGNED DEFAULT NULL, t4_id INT (10) UNSIGNED NOT NULL, PRIMARY KEY (id), KEY fkc_table1_t4 (t4_id), KEY fkc_table1_t2 (t2_id), KEY fkc_table1_t3 (t3_id), CONSTRAINT fkc_table1_t2 FOREIGN KEY (t2_id) REFERENCES table_two(t2o_id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT fkc_table1_t3 FOREIGN KEY (t3_id) REFERENCES table_three(t3o_id) ON UPDATE CASCADE, CONSTRAINT fkc_table1_t4 FOREIGN KEY (t4_id) REFERENCES table_four(t4o_id) ON DELETE CASCADE) ENGINE = InnoDB AUTO_INCREMENT = 8761 DEFAULT CHARSET = utf8"); - } - - public void testMySqlCreateTableWithConstraintWithNoAction() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE table1 (id INT (10) UNSIGNED NOT NULL AUTO_INCREMENT, t2_id INT (10) UNSIGNED DEFAULT NULL, t3_id INT (10) UNSIGNED DEFAULT NULL, t4_id INT (10) UNSIGNED NOT NULL, PRIMARY KEY (id), KEY fkc_table1_t4 (t4_id), KEY fkc_table1_t2 (t2_id), KEY fkc_table1_t3 (t3_id), CONSTRAINT fkc_table1_t2 FOREIGN KEY (t2_id) REFERENCES table_two(t2o_id) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT fkc_table1_t3 FOREIGN KEY (t3_id) REFERENCES table_three(t3o_id) ON UPDATE NO ACTION, CONSTRAINT fkc_table1_t4 FOREIGN KEY (t4_id) REFERENCES table_four(t4o_id) ON DELETE NO ACTION) ENGINE = InnoDB AUTO_INCREMENT = 8761 DEFAULT CHARSET = utf8"); - } - - public void testMySqlCreateTableWithTextIndexes() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE table2 (id INT (10) UNSIGNED NOT NULL AUTO_INCREMENT, name TEXT, url TEXT, created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FULLTEXT KEY idx_table2_name (name)) ENGINE = InnoDB AUTO_INCREMENT = 7334 DEFAULT CHARSET = utf8"); - } - - public void testCreateTableWithCheck() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE table2 (id INT (10) NOT NULL, name TEXT, url TEXT, CONSTRAINT name_not_empty CHECK (name <> ''))"); - } - - public void testCreateTableIssue270() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE item (i_item_sk integer NOT NULL, i_item_id character (16) NOT NULL, i_rec_start_date date, i_rec_end_date date, i_item_desc character varying(200), i_current_price numeric(7,2), i_wholesale_cost numeric(7,2), i_brand_id integer, i_brand character(50), i_class_id integer, i_class character(50), i_category_id integer, i_category character(50), i_manufact_id integer, i_manufact character(50), i_size character(20), i_formulation character(20), i_color character(20), i_units character(10), i_container character(10), i_manager_id integer, i_product_name character(50) )", true); - } - - public void testCreateTableIssue270_1() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE item (i_item_sk integer NOT NULL, i_item_id character (16))"); - } - - public void testCreateTempTableIssue293() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE GLOBAL TEMPORARY TABLE T1 (PROCESSID VARCHAR (32))"); - } - - public void testCreateTableWithTablespaceIssue247() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE TABLE1 (COLUMN1 VARCHAR2 (15), COLUMN2 VARCHAR2 (15), CONSTRAINT P_PK PRIMARY KEY (COLUMN1) USING INDEX TABLESPACE \"T_INDEX\") TABLESPACE \"T_SPACE\""); - } - - public void testCreateTableWithTablespaceIssue247_1() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE TABLE1 (COLUMN1 VARCHAR2 (15), COLUMN2 VARCHAR2 (15), CONSTRAINT P_PK PRIMARY KEY (COLUMN1) USING INDEX TABLESPACE \"T_INDEX\")"); - } - - public void testOnDeleteSetNull() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE inventory (inventory_id INT PRIMARY KEY, product_id INT, CONSTRAINT fk_inv_product_id FOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE SET NULL)"); - } - - public void testColumnCheck() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE table1 (col1 INTEGER CHECK (col1 > 100))"); - } - - public void testTableReferenceWithSchema() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE table1 (col1 INTEGER REFERENCES schema1.table1)"); - } - - public void testNamedColumnConstraint() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE foo (col1 integer CONSTRAINT no_null NOT NULL)"); - } - - public void testColumnConstraintWith() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE foo (col1 integer) WITH (fillfactor=70)"); - } - - public void testExcludeWhereConstraint() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE foo (col1 integer, EXCLUDE WHERE (col1 > 100))"); - } - - public void testTimestampWithoutTimezone() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE abc.tabc (transaction_date TIMESTAMP WITHOUT TIME ZONE)"); - } - - public void testCreateUnitonIssue402() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE temp.abc AS SELECT sku FROM temp.a UNION SELECT sku FROM temp.b"); - } - - public void testCreateUnitonIssue402_2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE temp.abc AS (SELECT sku FROM temp.a UNION SELECT sku FROM temp.b)"); - } - - public void testTimestampWithTimezone() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE country_region (" + - "regionid BIGINT NOT NULL CONSTRAINT pk_auth_region PRIMARY KEY, " + - "region_name VARCHAR (100) NOT NULL, " + - "creation_date TIMESTAMP (0) WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP (0) NOT NULL, " + - "last_change_date TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP (0), " + - "CONSTRAINT region_name_unique UNIQUE (region_name))"); - } - - public void testCreateTableAsSelect3() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE public.sales1 AS (SELECT * FROM public.sales)"); - } - - public void testQuotedPKColumnsIssue491() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE `FOO` (`ID` INT64, `NAME` STRING (100)) PRIMARY KEY (`ID`)"); - } - - public void testQuotedPKColumnsIssue491_2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE TABLE `FOO` (`ID` INT64, `NAME` STRING (100), PRIMARY KEY (`ID`))"); - } - - public void testRUBiSCreateList() throws Exception { - BufferedReader in = new BufferedReader(new InputStreamReader(CreateTableTest.class. - getResourceAsStream("/RUBiS-create-requests.txt"))); - TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - - try { - int numSt = 1; - while (true) { - String line = getLine(in); - if (line == null) { - break; - } - - if (!"#begin".equals(line)) { - break; - } - line = getLine(in); - StringBuilder buf = new StringBuilder(line); - while (true) { - line = getLine(in); - if ("#end".equals(line)) { - break; - } - buf.append("\n"); - buf.append(line); - } - - String query = buf.toString(); - if (!getLine(in).equals("true")) { - continue; - } - - String tableName = getLine(in); - String cols = getLine(in); - try { - CreateTable createTable = (CreateTable) parserManager. - parse(new StringReader(query)); - String[] colsList = null; - if ("null".equals(cols)) { - colsList = new String[0]; - } else { - StringTokenizer tokenizer = new StringTokenizer(cols, " "); - - List colsListList = new ArrayList(); - while (tokenizer.hasMoreTokens()) { - colsListList.add(tokenizer.nextToken()); - } - - colsList = (String[]) colsListList.toArray(new String[colsListList.size()]); - - } - List colsFound = new ArrayList(); - if (createTable.getColumnDefinitions() != null) { - for (Iterator iter = createTable.getColumnDefinitions().iterator(); iter. - hasNext();) { - ColumnDefinition columnDefinition = (ColumnDefinition) iter.next(); - String colName = columnDefinition.getColumnName(); - boolean unique = false; - if (createTable.getIndexes() != null) { - for (Iterator iterator = createTable.getIndexes().iterator(); iterator. - hasNext();) { - Index index = (Index) iterator.next(); - if (index.getType().equals("PRIMARY KEY") && index. - getColumnsNames().size() == 1 - && index.getColumnsNames().get(0).equals(colName)) { - unique = true; - } - - } - } - - if (!unique) { - if (columnDefinition.getColumnSpecStrings() != null) { - for (Iterator iterator = columnDefinition.getColumnSpecStrings(). - iterator(); iterator - .hasNext();) { - String par = (String) iterator.next(); - if (par.equals("UNIQUE")) { - unique = true; - } else if (par.equals("PRIMARY") && iterator.hasNext() - && iterator.next().equals("KEY")) { - unique = true; - } - } - } - } - if (unique) { - colName += ".unique"; - } - colsFound.add(colName.toLowerCase()); - } - } - - assertEquals("stm:" + query, colsList.length, colsFound.size()); - - for (int i = 0; i < colsList.length; i++) { - assertEquals("stm:" + query, colsList[i], colsFound.get(i)); - - } - } catch (Exception e) { - throw new TestException("error at stm num: " + numSt + " " + query, e); - } - numSt++; - - } - } finally { - if (in != null) { - in.close(); - } - } - } - - private String getLine(BufferedReader in) throws Exception { - String line = null; - while (true) { - line = in.readLine(); - if (line != null) { - if ((line.length() != 0) - && ((line.length() < 2) || (line.length() >= 2) - && !(line.charAt(0) == '/' && line.charAt(1) == '/'))) { - break; - } - } else { - break; - } - - } - - return line; - } -} +package net.sf.jsqlparser.statement.create; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.StringTokenizer; + +import junit.framework.TestCase; +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.parser.CCJSqlParserManager; +import net.sf.jsqlparser.statement.create.table.ColumnDefinition; +import net.sf.jsqlparser.statement.create.table.CreateTable; +import net.sf.jsqlparser.statement.create.table.Index; +import net.sf.jsqlparser.test.TestException; +import net.sf.jsqlparser.util.TablesNamesFinder; +import static net.sf.jsqlparser.test.TestUtils.*; + +public class CreateTableTest extends TestCase { + + private CCJSqlParserManager parserManager = new CCJSqlParserManager(); + + public CreateTableTest(String arg0) { + super(arg0); + } + + public void testCreateTable2() throws JSQLParserException { + String statement = "CREATE TABLE testtab (\"test\" varchar (255))"; + assertSqlCanBeParsedAndDeparsed(statement); + } + + public void testCreateTable3() throws JSQLParserException { + String statement = "CREATE TABLE testtab (\"test\" varchar (255), \"test2\" varchar (255))"; + assertSqlCanBeParsedAndDeparsed(statement); + } + + public void testCreateTableAsSelect() throws JSQLParserException, JSQLParserException, JSQLParserException, JSQLParserException { + String statement = "CREATE TABLE a AS SELECT col1, col2 FROM b"; + assertSqlCanBeParsedAndDeparsed(statement); + } + + public void testCreateTableAsSelect2() throws JSQLParserException { + String statement = "CREATE TABLE newtable AS WITH a AS (SELECT col1, col3 FROM testtable) SELECT col1, col2, col3 FROM b INNER JOIN a ON b.col1 = a.col1"; + assertSqlCanBeParsedAndDeparsed(statement); + } + + public void testCreateTable() throws JSQLParserException { + String statement = "CREATE TABLE mytab (mycol a (10, 20) c nm g, mycol2 mypar1 mypar2 (23,323,3) asdf ('23','123') dasd, " + + "PRIMARY KEY (mycol2, mycol)) type = myisam"; + CreateTable createTable = (CreateTable) parserManager.parse(new StringReader(statement)); + assertEquals(2, createTable.getColumnDefinitions().size()); + assertFalse(createTable.isUnlogged()); + assertEquals("mycol", ((ColumnDefinition) createTable.getColumnDefinitions().get(0)). + getColumnName()); + assertEquals("mycol2", ((ColumnDefinition) createTable.getColumnDefinitions().get(1)). + getColumnName()); + assertEquals("PRIMARY KEY", ((Index) createTable.getIndexes().get(0)).getType()); + assertEquals("mycol", ((Index) createTable.getIndexes().get(0)).getColumnsNames().get(1)); + assertEquals(statement, "" + createTable); + } + + public void testCreateTableUnlogged() throws JSQLParserException { + String statement = "CREATE UNLOGGED TABLE mytab (mycol a (10, 20) c nm g, mycol2 mypar1 mypar2 (23,323,3) asdf ('23','123') dasd, " + + "PRIMARY KEY (mycol2, mycol)) type = myisam"; + CreateTable createTable = (CreateTable) parserManager.parse(new StringReader(statement)); + assertEquals(2, createTable.getColumnDefinitions().size()); + assertTrue(createTable.isUnlogged()); + assertEquals("mycol", ((ColumnDefinition) createTable.getColumnDefinitions().get(0)). + getColumnName()); + assertEquals("mycol2", ((ColumnDefinition) createTable.getColumnDefinitions().get(1)). + getColumnName()); + assertEquals("PRIMARY KEY", ((Index) createTable.getIndexes().get(0)).getType()); + assertEquals("mycol", ((Index) createTable.getIndexes().get(0)).getColumnsNames().get(1)); + assertEquals(statement, "" + createTable); + } + + public void testCreateTableUnlogged2() throws JSQLParserException { + String statement = "CREATE UNLOGGED TABLE mytab (mycol a (10, 20) c nm g, mycol2 mypar1 mypar2 (23,323,3) asdf ('23','123') dasd, PRIMARY KEY (mycol2, mycol))"; + assertSqlCanBeParsedAndDeparsed(statement); + } + + public void testCreateTableForeignKey() throws JSQLParserException { + String statement = "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED, PRIMARY KEY (id), FOREIGN KEY (user_id) REFERENCES ra_user(id))"; + assertSqlCanBeParsedAndDeparsed(statement); + } + + public void testCreateTableForeignKey2() throws JSQLParserException { + String statement = "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED, PRIMARY KEY (id), CONSTRAINT fkIdx FOREIGN KEY (user_id) REFERENCES ra_user(id))"; + assertSqlCanBeParsedAndDeparsed(statement); + } + + public void testCreateTableForeignKey3() throws JSQLParserException { + String statement = "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED REFERENCES ra_user(id), PRIMARY KEY (id))"; + assertSqlCanBeParsedAndDeparsed(statement, true); + } + + public void testCreateTableForeignKey4() throws JSQLParserException { + String statement = "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED FOREIGN KEY REFERENCES ra_user(id), PRIMARY KEY (id))"; + assertSqlCanBeParsedAndDeparsed(statement, true); + } + + public void testCreateTablePrimaryKey() throws JSQLParserException { + String statement = "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED, CONSTRAINT pk_name PRIMARY KEY (id))"; + assertSqlCanBeParsedAndDeparsed(statement); + } + + public void testCreateTableParams() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TEMPORARY TABLE T1 (PROCESSID VARCHAR (32)) ON COMMIT PRESERVE ROWS"); + } + + public void testCreateTableUniqueConstraint() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE Activities (_id INTEGER PRIMARY KEY AUTOINCREMENT,uuid VARCHAR(255),user_id INTEGER,sound_id INTEGER,sound_type INTEGER,comment_id INTEGER,type String,tags VARCHAR(255),created_at INTEGER,content_id INTEGER,sharing_note_text VARCHAR(255),sharing_note_created_at INTEGER,UNIQUE (created_at, type, content_id, sound_id, user_id))", true); + } + + public void testCreateTableDefault() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE T1 (id integer default -1)"); + } + + public void testCreateTableDefault2() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE T1 (id integer default 1)"); + } + + public void testCreateTableIfNotExists() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE IF NOT EXISTS animals (id INT NOT NULL)"); + } + + public void testCreateTableInlinePrimaryKey() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE animals (id INT PRIMARY KEY NOT NULL)"); + } + + public void testCreateTableWithRange() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE foo (name character varying (255), range character varying (255), start_range integer, end_range integer)"); + } + + public void testCreateTableWithKey() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE bar (key character varying (255) NOT NULL)"); + } + + public void testCreateTableWithUniqueKey() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE animals (id INT NOT NULL, name VARCHAR (100) UNIQUE KEY (id))"); + } + + public void testCreateTableVeryComplex() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_commentmeta` ( `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `comment_id` bigint(20) unsigned NOT NULL DEFAULT '0', `meta_key` varchar(255) DEFAULT NULL, `meta_value` longtext, PRIMARY KEY (`meta_id`), KEY `comment_id` (`comment_id`), KEY `meta_key` (`meta_key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8", true); + assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_comments` ( `comment_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `comment_post_ID` bigint(20) unsigned NOT NULL DEFAULT '0', `comment_author` tinytext NOT NULL, `comment_author_email` varchar(100) NOT NULL DEFAULT '', `comment_author_url` varchar(200) NOT NULL DEFAULT '', `comment_author_IP` varchar(100) NOT NULL DEFAULT '', `comment_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `comment_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `comment_content` text NOT NULL, `comment_karma` int(11) NOT NULL DEFAULT '0', `comment_approved` varchar(20) NOT NULL DEFAULT '1', `comment_agent` varchar(255) NOT NULL DEFAULT '', `comment_type` varchar(20) NOT NULL DEFAULT '', `comment_parent` bigint(20) unsigned NOT NULL DEFAULT '0', `user_id` bigint(20) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`comment_ID`), KEY `comment_post_ID` (`comment_post_ID`), KEY `comment_approved_date_gmt` (`comment_approved`,`comment_date_gmt`), KEY `comment_date_gmt` (`comment_date_gmt`), KEY `comment_parent` (`comment_parent`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8", true); + assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_links` ( `link_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `link_url` varchar(255) NOT NULL DEFAULT '', `link_name` varchar(255) NOT NULL DEFAULT '', `link_image` varchar(255) NOT NULL DEFAULT '', `link_target` varchar(25) NOT NULL DEFAULT '', `link_description` varchar(255) NOT NULL DEFAULT '', `link_visible` varchar(20) NOT NULL DEFAULT 'Y', `link_owner` bigint(20) unsigned NOT NULL DEFAULT '1', `link_rating` int(11) NOT NULL DEFAULT '0', `link_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `link_rel` varchar(255) NOT NULL DEFAULT '', `link_notes` mediumtext NOT NULL, `link_rss` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`link_id`), KEY `link_visible` (`link_visible`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8", true); + assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_options` ( `option_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `option_name` varchar(64) NOT NULL DEFAULT '', `option_value` longtext NOT NULL, `autoload` varchar(20) NOT NULL DEFAULT 'yes', PRIMARY KEY (`option_id`), UNIQUE KEY `option_name` (`option_name`) ) ENGINE=InnoDB AUTO_INCREMENT=402 DEFAULT CHARSET=utf8", true); + assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_postmeta` ( `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `post_id` bigint(20) unsigned NOT NULL DEFAULT '0', `meta_key` varchar(255) DEFAULT NULL, `meta_value` longtext, PRIMARY KEY (`meta_id`), KEY `post_id` (`post_id`), KEY `meta_key` (`meta_key`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8", true); + assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_posts` ( `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `post_author` bigint(20) unsigned NOT NULL DEFAULT '0', `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `post_content` longtext NOT NULL, `post_title` text NOT NULL, `post_excerpt` text NOT NULL, `post_status` varchar(20) NOT NULL DEFAULT 'publish', `comment_status` varchar(20) NOT NULL DEFAULT 'open', `ping_status` varchar(20) NOT NULL DEFAULT 'open', `post_password` varchar(20) NOT NULL DEFAULT '', `post_name` varchar(200) NOT NULL DEFAULT '', `to_ping` text NOT NULL, `pinged` text NOT NULL, `post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `post_content_filtered` longtext NOT NULL, `post_parent` bigint(20) unsigned NOT NULL DEFAULT '0', `guid` varchar(255) NOT NULL DEFAULT '', `menu_order` int(11) NOT NULL DEFAULT '0', `post_type` varchar(20) NOT NULL DEFAULT 'post', `post_mime_type` varchar(100) NOT NULL DEFAULT '', `comment_count` bigint(20) NOT NULL DEFAULT '0', PRIMARY KEY (`ID`), KEY `post_name` (`post_name`), KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`), KEY `post_parent` (`post_parent`), KEY `post_author` (`post_author`) ) ENGINE=InnoDB AUTO_INCREMENT=55004 DEFAULT CHARSET=utf8", true); + assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_term_relationships` ( `object_id` bigint(20) unsigned NOT NULL DEFAULT '0', `term_taxonomy_id` bigint(20) unsigned NOT NULL DEFAULT '0', `term_order` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`object_id`,`term_taxonomy_id`), KEY `term_taxonomy_id` (`term_taxonomy_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8", true); + assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_term_taxonomy` ( `term_taxonomy_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `term_id` bigint(20) unsigned NOT NULL DEFAULT '0', `taxonomy` varchar(32) NOT NULL DEFAULT '', `description` longtext NOT NULL, `parent` bigint(20) unsigned NOT NULL DEFAULT '0', `count` bigint(20) NOT NULL DEFAULT '0', PRIMARY KEY (`term_taxonomy_id`), UNIQUE KEY `term_id_taxonomy` (`term_id`,`taxonomy`), KEY `taxonomy` (`taxonomy`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8", true); + assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_terms` ( `term_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(200) NOT NULL DEFAULT '', `slug` varchar(200) NOT NULL DEFAULT '', `term_group` bigint(10) NOT NULL DEFAULT '0', PRIMARY KEY (`term_id`), UNIQUE KEY `slug` (`slug`), KEY `name` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8", true); + assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_usermeta` ( `umeta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `user_id` bigint(20) unsigned NOT NULL DEFAULT '0', `meta_key` varchar(255) DEFAULT NULL, `meta_value` longtext, PRIMARY KEY (`umeta_id`), KEY `user_id` (`user_id`), KEY `meta_key` (`meta_key`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8", true); + assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_users` ( `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `user_login` varchar(60) NOT NULL DEFAULT '', `user_pass` varchar(64) NOT NULL DEFAULT '', `user_nicename` varchar(50) NOT NULL DEFAULT '', `user_email` varchar(100) NOT NULL DEFAULT '', `user_url` varchar(100) NOT NULL DEFAULT '', `user_registered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `user_activation_key` varchar(60) NOT NULL DEFAULT '', `user_status` int(11) NOT NULL DEFAULT '0', `display_name` varchar(250) NOT NULL DEFAULT '', PRIMARY KEY (`ID`), KEY `user_login_key` (`user_login`), KEY `user_nicename` (`user_nicename`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8", true); + } + + public void testCreateTableArrays() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE sal_emp (name text, pay_by_quarter integer[], schedule text[][])"); + } + + public void testCreateTableArrays2() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE sal_emp (name text, pay_by_quarter integer[5], schedule text[3][2])"); + } + + public void testCreateTableColumnValues() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE mytable1 (values INTEGER)"); + } + + public void testCreateTableColumnValue() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE mytable1 (value INTEGER)"); + } + + public void testCreateTableForeignKey5() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE IF NOT EXISTS table1 (id INTEGER PRIMARY KEY AUTO_INCREMENT, aid INTEGER REFERENCES accounts ON aid ON DELETE CASCADE, name STRING, lastname STRING)"); + } + + public void testCreateTableForeignKey6() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE test (id long, fkey long references another_table (id))"); + } + + public void testMySqlCreateTableOnUpdateCurrentTimestamp() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE test (applied timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)"); + } + + public void testMySqlCreateTableWithConstraintWithCascade() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE table1 (id INT (10) UNSIGNED NOT NULL AUTO_INCREMENT, t2_id INT (10) UNSIGNED DEFAULT NULL, t3_id INT (10) UNSIGNED DEFAULT NULL, t4_id INT (10) UNSIGNED NOT NULL, PRIMARY KEY (id), KEY fkc_table1_t4 (t4_id), KEY fkc_table1_t2 (t2_id), KEY fkc_table1_t3 (t3_id), CONSTRAINT fkc_table1_t2 FOREIGN KEY (t2_id) REFERENCES table_two(t2o_id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT fkc_table1_t3 FOREIGN KEY (t3_id) REFERENCES table_three(t3o_id) ON UPDATE CASCADE, CONSTRAINT fkc_table1_t4 FOREIGN KEY (t4_id) REFERENCES table_four(t4o_id) ON DELETE CASCADE) ENGINE = InnoDB AUTO_INCREMENT = 8761 DEFAULT CHARSET = utf8"); + } + + public void testMySqlCreateTableWithConstraintWithNoAction() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE table1 (id INT (10) UNSIGNED NOT NULL AUTO_INCREMENT, t2_id INT (10) UNSIGNED DEFAULT NULL, t3_id INT (10) UNSIGNED DEFAULT NULL, t4_id INT (10) UNSIGNED NOT NULL, PRIMARY KEY (id), KEY fkc_table1_t4 (t4_id), KEY fkc_table1_t2 (t2_id), KEY fkc_table1_t3 (t3_id), CONSTRAINT fkc_table1_t2 FOREIGN KEY (t2_id) REFERENCES table_two(t2o_id) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT fkc_table1_t3 FOREIGN KEY (t3_id) REFERENCES table_three(t3o_id) ON UPDATE NO ACTION, CONSTRAINT fkc_table1_t4 FOREIGN KEY (t4_id) REFERENCES table_four(t4o_id) ON DELETE NO ACTION) ENGINE = InnoDB AUTO_INCREMENT = 8761 DEFAULT CHARSET = utf8"); + } + + public void testMySqlCreateTableWithTextIndexes() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE table2 (id INT (10) UNSIGNED NOT NULL AUTO_INCREMENT, name TEXT, url TEXT, created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FULLTEXT KEY idx_table2_name (name)) ENGINE = InnoDB AUTO_INCREMENT = 7334 DEFAULT CHARSET = utf8"); + } + + public void testCreateTableWithCheck() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE table2 (id INT (10) NOT NULL, name TEXT, url TEXT, CONSTRAINT name_not_empty CHECK (name <> ''))"); + } + + public void testCreateTableIssue270() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE item (i_item_sk integer NOT NULL, i_item_id character (16) NOT NULL, i_rec_start_date date, i_rec_end_date date, i_item_desc character varying(200), i_current_price numeric(7,2), i_wholesale_cost numeric(7,2), i_brand_id integer, i_brand character(50), i_class_id integer, i_class character(50), i_category_id integer, i_category character(50), i_manufact_id integer, i_manufact character(50), i_size character(20), i_formulation character(20), i_color character(20), i_units character(10), i_container character(10), i_manager_id integer, i_product_name character(50) )", true); + } + + public void testCreateTableIssue270_1() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE item (i_item_sk integer NOT NULL, i_item_id character (16))"); + } + + public void testCreateTempTableIssue293() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE GLOBAL TEMPORARY TABLE T1 (PROCESSID VARCHAR (32))"); + } + + public void testCreateTableWithTablespaceIssue247() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE TABLE1 (COLUMN1 VARCHAR2 (15), COLUMN2 VARCHAR2 (15), CONSTRAINT P_PK PRIMARY KEY (COLUMN1) USING INDEX TABLESPACE \"T_INDEX\") TABLESPACE \"T_SPACE\""); + } + + public void testCreateTableWithTablespaceIssue247_1() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE TABLE1 (COLUMN1 VARCHAR2 (15), COLUMN2 VARCHAR2 (15), CONSTRAINT P_PK PRIMARY KEY (COLUMN1) USING INDEX TABLESPACE \"T_INDEX\")"); + } + + public void testOnDeleteSetNull() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE inventory (inventory_id INT PRIMARY KEY, product_id INT, CONSTRAINT fk_inv_product_id FOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE SET NULL)"); + } + + public void testColumnCheck() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE table1 (col1 INTEGER CHECK (col1 > 100))"); + } + + public void testTableReferenceWithSchema() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE table1 (col1 INTEGER REFERENCES schema1.table1)"); + } + + public void testNamedColumnConstraint() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE foo (col1 integer CONSTRAINT no_null NOT NULL)"); + } + + public void testColumnConstraintWith() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE foo (col1 integer) WITH (fillfactor=70)"); + } + + public void testExcludeWhereConstraint() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE foo (col1 integer, EXCLUDE WHERE (col1 > 100))"); + } + + public void testTimestampWithoutTimezone() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE abc.tabc (transaction_date TIMESTAMP WITHOUT TIME ZONE)"); + } + + public void testCreateUnitonIssue402() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE temp.abc AS SELECT sku FROM temp.a UNION SELECT sku FROM temp.b"); + } + + public void testCreateUnitonIssue402_2() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE temp.abc AS (SELECT sku FROM temp.a UNION SELECT sku FROM temp.b)"); + } + + public void testTimestampWithTimezone() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE country_region (" + + "regionid BIGINT NOT NULL CONSTRAINT pk_auth_region PRIMARY KEY, " + + "region_name VARCHAR (100) NOT NULL, " + + "creation_date TIMESTAMP (0) WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP (0) NOT NULL, " + + "last_change_date TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP (0), " + + "CONSTRAINT region_name_unique UNIQUE (region_name))"); + } + + public void testCreateTableAsSelect3() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE public.sales1 AS (SELECT * FROM public.sales)"); + } + + public void testQuotedPKColumnsIssue491() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE `FOO` (`ID` INT64, `NAME` STRING (100)) PRIMARY KEY (`ID`)"); + } + + public void testQuotedPKColumnsIssue491_2() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE `FOO` (`ID` INT64, `NAME` STRING (100), PRIMARY KEY (`ID`))"); + } + + public void testRUBiSCreateList() throws Exception { + BufferedReader in = new BufferedReader(new InputStreamReader(CreateTableTest.class. + getResourceAsStream("/RUBiS-create-requests.txt"))); + TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); + + try { + int numSt = 1; + while (true) { + String line = getLine(in); + if (line == null) { + break; + } + + if (!"#begin".equals(line)) { + break; + } + line = getLine(in); + StringBuilder buf = new StringBuilder(line); + while (true) { + line = getLine(in); + if ("#end".equals(line)) { + break; + } + buf.append("\n"); + buf.append(line); + } + + String query = buf.toString(); + if (!getLine(in).equals("true")) { + continue; + } + + String tableName = getLine(in); + String cols = getLine(in); + try { + CreateTable createTable = (CreateTable) parserManager. + parse(new StringReader(query)); + String[] colsList = null; + if ("null".equals(cols)) { + colsList = new String[0]; + } else { + StringTokenizer tokenizer = new StringTokenizer(cols, " "); + + List colsListList = new ArrayList(); + while (tokenizer.hasMoreTokens()) { + colsListList.add(tokenizer.nextToken()); + } + + colsList = (String[]) colsListList.toArray(new String[colsListList.size()]); + + } + List colsFound = new ArrayList(); + if (createTable.getColumnDefinitions() != null) { + for (Iterator iter = createTable.getColumnDefinitions().iterator(); iter. + hasNext();) { + ColumnDefinition columnDefinition = (ColumnDefinition) iter.next(); + String colName = columnDefinition.getColumnName(); + boolean unique = false; + if (createTable.getIndexes() != null) { + for (Iterator iterator = createTable.getIndexes().iterator(); iterator. + hasNext();) { + Index index = (Index) iterator.next(); + if (index.getType().equals("PRIMARY KEY") && index. + getColumnsNames().size() == 1 + && index.getColumnsNames().get(0).equals(colName)) { + unique = true; + } + + } + } + + if (!unique) { + if (columnDefinition.getColumnSpecStrings() != null) { + for (Iterator iterator = columnDefinition.getColumnSpecStrings(). + iterator(); iterator + .hasNext();) { + String par = (String) iterator.next(); + if (par.equals("UNIQUE")) { + unique = true; + } else if (par.equals("PRIMARY") && iterator.hasNext() + && iterator.next().equals("KEY")) { + unique = true; + } + } + } + } + if (unique) { + colName += ".unique"; + } + colsFound.add(colName.toLowerCase()); + } + } + + assertEquals("stm:" + query, colsList.length, colsFound.size()); + + for (int i = 0; i < colsList.length; i++) { + assertEquals("stm:" + query, colsList[i], colsFound.get(i)); + + } + } catch (Exception e) { + throw new TestException("error at stm num: " + numSt + " " + query, e); + } + numSt++; + + } + } finally { + if (in != null) { + in.close(); + } + } + } + + private String getLine(BufferedReader in) throws Exception { + String line = null; + while (true) { + line = in.readLine(); + if (line != null) { + if ((line.length() != 0) + && ((line.length() < 2) || (line.length() >= 2) + && !(line.charAt(0) == '/' && line.charAt(1) == '/'))) { + break; + } + } else { + break; + } + + } + + return line; + } +} diff --git a/src/test/java/net/sf/jsqlparser/statement/select/SpecialOracleTest.java b/src/test/java/net/sf/jsqlparser/statement/select/SpecialOracleTest.java index b66969411c..ea4c1d48d0 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/SpecialOracleTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/SpecialOracleTest.java @@ -1,155 +1,168 @@ -/* - * Copyright (C) 2014 JSQLParser. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ -package net.sf.jsqlparser.statement.select; - -import net.sf.jsqlparser.JSQLParserException; -import net.sf.jsqlparser.parser.CCJSqlParserUtil; -import net.sf.jsqlparser.statement.Statement; -import org.apache.commons.io.FileUtils; -import org.junit.ComparisonFailure; -import org.junit.Test; - -import java.io.File; -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; -import static org.junit.Assert.assertTrue; - -/** - * Tries to parse and deparse all statments in net.sf.jsqlparser.test.oracle-tests. - * - * As a matter of fact there are a lot of files that can still not processed. Here a step by step - * improvement is the way to go. - * - * The test ensures, that the successfull parsed file count does not decrease. - * - * @author toben - */ -public class SpecialOracleTest { - - private static final File SQLS_DIR = new File("target/test-classes/net/sf/jsqlparser/statement/oracle-tests"); - private static final Logger LOG = Logger.getLogger(SpecialOracleTest.class.getName()); - - @Test - public void testAllSqlsParseDeparse() throws IOException { - int count = 0; - int success = 0; - File[] sqlTestFiles = SQLS_DIR.listFiles(); - - for (File file : sqlTestFiles) { - if (file.isFile()) { - count++; - LOG.log(Level.INFO, "testing {0}", file.getName()); - String sql = FileUtils.readFileToString(file); - try { - assertSqlCanBeParsedAndDeparsed(sql, true); - success++; - LOG.info(" -> SUCCESS"); - } catch (JSQLParserException ex) { - ex.printStackTrace(); - //LOG.log(Level.SEVERE, null, ex); - LOG.log(Level.INFO, " -> PROBLEM {0}", ex.toString()); - } catch (Exception ex) { - LOG.log(Level.INFO, " -> PROBLEM {0}", ex.toString()); - } catch (ComparisonFailure ex) { - LOG.log(Level.INFO, " -> PROBLEM {0}", ex.toString()); - } - } - } - - LOG. - log(Level.INFO, "tested {0} files. got {1} correct parse results", new Object[]{count, success}); - assertTrue(success >= 149); - } - - @Test - public void testAllSqlsOnlyParse() throws IOException { - File[] sqlTestFiles = new File(SQLS_DIR, "only-parse-test").listFiles(); - - for (File file : sqlTestFiles) { - LOG.log(Level.INFO, "testing {0}", file.getName()); - String sql = FileUtils.readFileToString(file); - try { - CCJSqlParserUtil.parse(sql); - - LOG.info(" -> SUCCESS"); - } catch (JSQLParserException ex) { - LOG.log(Level.SEVERE, null, ex); - } - } - } - - @Test - public void testOperatorsWithSpaces() throws Exception { - String sql; - Statement statement; - - // First, the regular way (normal for most databases). - sql = "SELECT\n" - + " Something\n" - + "FROM\n" - + " Sometable\n" - + "WHERE\n" - + " Somefield >= Somevalue\n" - + " AND Somefield <= Somevalue\n" - + " AND Somefield <> Somevalue\n" - + " AND Somefield != Somevalue\n"; - - statement = CCJSqlParserUtil.parse(sql); - - System.out.println(statement.toString()); - - assertSqlCanBeParsedAndDeparsed(sql, true); - - // Second, the special crap Oracle lets you get away with. - sql = "SELECT\n" - + " Something\n" - + "FROM\n" - + " Sometable\n" - + "WHERE\n" - + " Somefield > = Somevalue\n" - + " AND Somefield < = Somevalue\n" - + " AND Somefield < > Somevalue\n"; - - // Note, we do not (currently) test the "!=" with spaces in between -- Postgresql deals with this as two operators, "factorial" and "equals". - statement = CCJSqlParserUtil.parse(sql); - - System.out.println(statement.toString()); - - assertSqlCanBeParsedAndDeparsed(sql, true); - - // And then with multiple whitespace - sql = "SELECT\n" - + " Something\n" - + "FROM\n" - + " Sometable\n" - + "WHERE\n" - + " Somefield > \t = Somevalue\n" - + " AND Somefield < = Somevalue\n" - + " AND Somefield <\t\t> Somevalue\n"; - - statement = CCJSqlParserUtil.parse(sql); - - System.out.println(statement.toString()); - - assertSqlCanBeParsedAndDeparsed(sql, true); - } -} +/* + * Copyright (C) 2014 JSQLParser. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package net.sf.jsqlparser.statement.select; + +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.statement.Statement; +import org.apache.commons.io.FileUtils; +import org.junit.ComparisonFailure; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; +import java.util.Map; +import java.util.TreeMap; +import java.util.logging.Level; +import java.util.logging.Logger; + +import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; +import static org.junit.Assert.assertTrue; + +/** + * Tries to parse and deparse all statements in net.sf.jsqlparser.test.oracle-tests. + * + * As a matter of fact there are a lot of files that can still not processed. Here a step by step + * improvement is the way to go. + * + * The test ensures that the successful parsed file count does not decrease. + * + * @author toben + */ +public class SpecialOracleTest { + + private static final File SQLS_DIR = new File("target/test-classes/net/sf/jsqlparser/statement/oracle-tests"); + private static final Logger LOG = Logger.getLogger(SpecialOracleTest.class.getName()); + + @Test + public void testAllSqlsParseDeparse() throws IOException { + int count = 0; + int success = 0; + File[] sqlTestFiles = SQLS_DIR.listFiles(); + Map results = new TreeMap<>(); + + for (File file : sqlTestFiles) { + if (file.isFile()) { + count++; + LOG.log(Level.INFO, "testing {0}", file.getName()); + String sql = FileUtils.readFileToString(file); + try { + assertSqlCanBeParsedAndDeparsed(sql, true); + success++; + results.put(file.getName(), Boolean.TRUE); + LOG.info(" -> SUCCESS"); + } catch (JSQLParserException ex) { + ex.printStackTrace(); + //LOG.log(Level.SEVERE, null, ex); + LOG.log(Level.INFO, " -> PROBLEM {0}", ex.toString()); + results.put(file.getName(), Boolean.FALSE); + } catch (Exception | ComparisonFailure ex) { + LOG.log(Level.INFO, " -> PROBLEM {0}", ex.toString()); + results.put(file.getName(), Boolean.FALSE); + } + } + } + + LOG.log(Level.INFO, "tested {0} files. got {1} correct parse results", new Object[]{count, success}); + System.out.println("Results:\n" + formatResults(results)); + assertTrue(success >= 149); + } + + @Test + public void testAllSqlsOnlyParse() throws IOException { + File[] sqlTestFiles = new File(SQLS_DIR, "only-parse-test").listFiles(); + + for (File file : sqlTestFiles) { + LOG.log(Level.INFO, "testing {0}", file.getName()); + String sql = FileUtils.readFileToString(file); + try { + CCJSqlParserUtil.parse(sql); + + LOG.info(" -> SUCCESS"); + } catch (JSQLParserException ex) { + LOG.log(Level.SEVERE, null, ex); + } + } + } + + @Test + public void testOperatorsWithSpaces() throws Exception { + String sql; + Statement statement; + + // First, the regular way (normal for most databases). + sql = "SELECT\n" + + " Something\n" + + "FROM\n" + + " Sometable\n" + + "WHERE\n" + + " Somefield >= Somevalue\n" + + " AND Somefield <= Somevalue\n" + + " AND Somefield <> Somevalue\n" + + " AND Somefield != Somevalue\n"; + + statement = CCJSqlParserUtil.parse(sql); + + System.out.println(statement.toString()); + + assertSqlCanBeParsedAndDeparsed(sql, true); + + // Second, the special crap Oracle lets you get away with. + sql = "SELECT\n" + + " Something\n" + + "FROM\n" + + " Sometable\n" + + "WHERE\n" + + " Somefield > = Somevalue\n" + + " AND Somefield < = Somevalue\n" + + " AND Somefield < > Somevalue\n"; + + // Note, we do not (currently) test the "!=" with spaces in between -- Postgresql deals with this as two operators, "factorial" and "equals". + statement = CCJSqlParserUtil.parse(sql); + + System.out.println(statement.toString()); + + assertSqlCanBeParsedAndDeparsed(sql, true); + + // And then with multiple whitespace + sql = "SELECT\n" + + " Something\n" + + "FROM\n" + + " Sometable\n" + + "WHERE\n" + + " Somefield > \t = Somevalue\n" + + " AND Somefield < = Somevalue\n" + + " AND Somefield <\t\t> Somevalue\n"; + + statement = CCJSqlParserUtil.parse(sql); + + System.out.println(statement.toString()); + + assertSqlCanBeParsedAndDeparsed(sql, true); + } + + private static String formatResults(Map results) { + StringBuilder resultsString = new StringBuilder(); + for(Map.Entry result : results.entrySet()) { + resultsString.append(result); + resultsString.append(System.lineSeparator()); + } + return resultsString.toString(); + } +} From a81abd64ffab5645c87a9fd1a9b807416085e1c5 Mon Sep 17 00:00:00 2001 From: AnEmortalKid Date: Thu, 23 Apr 2020 23:03:08 -0500 Subject: [PATCH 5/6] delete issue tests --- src/test/java/issues/Issue482Test.java | 21 --------------------- src/test/java/issues/Issue483Test.java | 17 ----------------- 2 files changed, 38 deletions(-) delete mode 100644 src/test/java/issues/Issue482Test.java delete mode 100644 src/test/java/issues/Issue483Test.java diff --git a/src/test/java/issues/Issue482Test.java b/src/test/java/issues/Issue482Test.java deleted file mode 100644 index fa4d31f5e8..0000000000 --- a/src/test/java/issues/Issue482Test.java +++ /dev/null @@ -1,21 +0,0 @@ -package issues; - -import org.junit.Test; - -import net.sf.jsqlparser.parser.CCJSqlParserUtil; -import net.sf.jsqlparser.statement.Statements; -import net.sf.jsqlparser.statement.select.Select; - -public class Issue482Test { - - @Test - public void test() throws Exception { - String sql = "SELECT SUM(orderTotalValue) as value, MONTH(invoiceDate) as month, YEAR(invoiceDate) as year FROM invoice.Invoices WHERE projectID = 1 GROUP BY MONTH(invoiceDate), YEAR(invoiceDate) ORDER BY YEAR(invoiceDate) DESC, MONTH(invoiceDate) DESC"; - Select select = (Select) CCJSqlParserUtil.parse(sql); - System.out.println(select.toString()); - - Statements stmts = CCJSqlParserUtil.parseStatements(sql); - System.out.println(stmts.toString()); - } - -} diff --git a/src/test/java/issues/Issue483Test.java b/src/test/java/issues/Issue483Test.java deleted file mode 100644 index 4012d43428..0000000000 --- a/src/test/java/issues/Issue483Test.java +++ /dev/null @@ -1,17 +0,0 @@ -package issues; - -import org.junit.Test; - -import net.sf.jsqlparser.parser.CCJSqlParserUtil; -import net.sf.jsqlparser.statement.select.Select; - -public class Issue483Test { - - @Test - public void test() throws Exception{ - String sql = "select * from ((TABLE_A), (TABLE_b as b))"; - Select select = (Select) CCJSqlParserUtil.parse(sql); - System.out.println(select.toString()); - } - -} From b3d56a989c2db7429e7e84b6294564e16392652d Mon Sep 17 00:00:00 2001 From: AnEmortalKid Date: Fri, 24 Apr 2020 13:16:34 -0500 Subject: [PATCH 6/6] compile it --- .../net/sf/jsqlparser/schema/Sequence.java | 119 ++++++++++-------- .../statement/StatementVisitor.java | 1 + .../statement/StatementVisitorAdapter.java | 1 + .../create/sequence/CreateSequence.java | 14 +-- .../sf/jsqlparser/util/TablesNamesFinder.java | 1 + .../util/deparser/CreateSequenceDeParser.java | 14 +-- .../util/deparser/StatementDeParser.java | 1 + .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 14 +-- .../sf/jsqlparser/schema/SequenceTest.java | 56 +++++++++ .../statement/create/CreateSequenceTest.java | 9 ++ 10 files changed, 144 insertions(+), 86 deletions(-) create mode 100644 src/test/java/net/sf/jsqlparser/schema/SequenceTest.java diff --git a/src/main/java/net/sf/jsqlparser/schema/Sequence.java b/src/main/java/net/sf/jsqlparser/schema/Sequence.java index deb8a739fe..343174a542 100644 --- a/src/main/java/net/sf/jsqlparser/schema/Sequence.java +++ b/src/main/java/net/sf/jsqlparser/schema/Sequence.java @@ -1,28 +1,18 @@ /* - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2020 JSQLParser - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * . + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2020 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 * #L% */ package net.sf.jsqlparser.schema; import net.sf.jsqlparser.parser.ASTNodeAccessImpl; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -30,29 +20,20 @@ */ public class Sequence extends ASTNodeAccessImpl implements MultiPartName { - private String name; - private String schemaName; - private Database database; + private static final int NAME_IDX = 0; + private static final int SCHEMA_IDX = 1; + private static final int DATABASE_IDX = 2; + private static final int SERVER_IDX = 3; + private List partItems = new ArrayList<>(); private List parameters; public Sequence() { } - public Sequence(String name) { - this.name = name; - } - - public Sequence(String schemaName, String name) { - this.schemaName = schemaName; - this.schemaName = schemaName; - this.name = name; - } - - public Sequence(Database database, String schemaName, String name) { - this.database = database; - this.schemaName = schemaName; - this.name = name; + public Sequence(List partItems) { + this.partItems = new ArrayList<>(partItems); + Collections.reverse(this.partItems); } public void setParameters(List parameters) { @@ -63,35 +44,71 @@ public List getParameters() { return parameters; } - @Override - public String getFullyQualifiedName() { - String fqn = ""; + public Database getDatabase() { + return new Database(getIndex(DATABASE_IDX)); + } - if (database != null) { - fqn += database.getFullyQualifiedName(); - } - if (!fqn.isEmpty()) { - fqn += "."; + public void setDatabase(Database database) { + setIndex(DATABASE_IDX, database.getDatabaseName()); + if (database.getServer() != null) { + setIndex(SERVER_IDX, database.getServer().getFullyQualifiedName()); } + } + + public String getSchemaName() { + return getIndex(SCHEMA_IDX); + } + + public void setSchemaName(String string) { + setIndex(SCHEMA_IDX, string); + } - if (schemaName != null) { - fqn += schemaName; + public String getName() { + return getIndex(NAME_IDX); + } + + public void setName(String string) { + setIndex(NAME_IDX, string); + } + + private void setIndex(int idx, String value) { + int size = partItems.size(); + for (int i = 0; i < idx - size + 1; i++) { + partItems.add(null); } - if (!fqn.isEmpty()) { - fqn += "."; + partItems.set(idx, value); + } + + private String getIndex(int idx) { + if (idx < partItems.size()) { + return partItems.get(idx); + } else { + return null; } + } + + @Override + public String getFullyQualifiedName() { + StringBuilder fqn = new StringBuilder(); - if (name != null) { - fqn += name; + for (int i = partItems.size() - 1; i >= 0; i--) { + String part = partItems.get(i); + if (part == null) { + part = ""; + } + fqn.append(part); + if (i != 0) { + fqn.append("."); + } } - return fqn; + return fqn.toString(); } @Override public String toString() { StringBuilder sql = new StringBuilder(getFullyQualifiedName()); - if(parameters != null) { + if (parameters != null) { for (Sequence.Parameter parameter : parameters) { sql.append(" ").append(parameter.formatParameter()); } diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java index d24fb5c9e6..85fce2f79a 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java @@ -13,6 +13,7 @@ import net.sf.jsqlparser.statement.comment.Comment; import net.sf.jsqlparser.statement.create.index.CreateIndex; import net.sf.jsqlparser.statement.create.schema.CreateSchema; +import net.sf.jsqlparser.statement.create.sequence.CreateSequence; import net.sf.jsqlparser.statement.create.table.CreateTable; import net.sf.jsqlparser.statement.create.view.AlterView; import net.sf.jsqlparser.statement.create.view.CreateView; diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java index defbff49fe..50a34f7e87 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java @@ -13,6 +13,7 @@ import net.sf.jsqlparser.statement.comment.Comment; import net.sf.jsqlparser.statement.create.index.CreateIndex; import net.sf.jsqlparser.statement.create.schema.CreateSchema; +import net.sf.jsqlparser.statement.create.sequence.CreateSequence; import net.sf.jsqlparser.statement.create.table.CreateTable; import net.sf.jsqlparser.statement.create.view.AlterView; import net.sf.jsqlparser.statement.create.view.CreateView; diff --git a/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java b/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java index d46ea17478..5e8e506d7a 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java @@ -4,19 +4,7 @@ * %% * Copyright (C) 2004 - 2020 JSQLParser * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * . + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 * #L% */ package net.sf.jsqlparser.statement.create.sequence; diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java index cba4408273..1fde6a8cff 100644 --- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java +++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java @@ -72,6 +72,7 @@ import net.sf.jsqlparser.statement.comment.Comment; import net.sf.jsqlparser.statement.create.index.CreateIndex; import net.sf.jsqlparser.statement.create.schema.CreateSchema; +import net.sf.jsqlparser.statement.create.sequence.CreateSequence; import net.sf.jsqlparser.statement.create.table.CreateTable; import net.sf.jsqlparser.statement.create.view.AlterView; import net.sf.jsqlparser.statement.create.view.CreateView; diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/CreateSequenceDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/CreateSequenceDeParser.java index deca258e25..b2ed278cba 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/CreateSequenceDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/CreateSequenceDeParser.java @@ -4,19 +4,7 @@ * %% * Copyright (C) 2004 - 2020 JSQLParser * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * . + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 * #L% */ package net.sf.jsqlparser.util.deparser; diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java index 93d2ff437a..5d50f9b1d4 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java @@ -26,6 +26,7 @@ import net.sf.jsqlparser.statement.comment.Comment; import net.sf.jsqlparser.statement.create.index.CreateIndex; import net.sf.jsqlparser.statement.create.schema.CreateSchema; +import net.sf.jsqlparser.statement.create.sequence.CreateSequence; import net.sf.jsqlparser.statement.create.table.CreateTable; import net.sf.jsqlparser.statement.create.view.AlterView; import net.sf.jsqlparser.statement.create.view.CreateView; diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index c53cb057f4..92e31b4085 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -4657,19 +4657,15 @@ void readGrantTypes(ArrayList privileges): Sequence Sequence() #Sequence : { + List data = new ArrayList(); String serverName = null, databaseName = null, schemaName = null, sequenceName = null; } { - ( - LOOKAHEAD(7) serverName=RelObjectName() "." [databaseName=RelObjectName()] "." [sequenceName=RelObjectName()] "." sequenceName=RelObjectName() - | LOOKAHEAD(5) databaseName=RelObjectName() "." [schemaName=RelObjectName()] "." sequenceName=RelObjectName() - | LOOKAHEAD(3) schemaName=RelObjectName() "." sequenceName=RelObjectName() - | sequenceName=RelObjectName() - ) + data = RelObjectNameList() + { - final Server server = new Server(serverName); - final Database database = new Database(server, databaseName); - Sequence sequence = new Sequence(database, schemaName, sequenceName); + Sequence sequence = new Sequence(data); + linkAST(sequence,jjtThis); return sequence; } } diff --git a/src/test/java/net/sf/jsqlparser/schema/SequenceTest.java b/src/test/java/net/sf/jsqlparser/schema/SequenceTest.java new file mode 100644 index 0000000000..40b6497cc5 --- /dev/null +++ b/src/test/java/net/sf/jsqlparser/schema/SequenceTest.java @@ -0,0 +1,56 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2020 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.schema; + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class SequenceTest { + + @Test + public void testSetName() { + Sequence sequence = new Sequence(); + sequence.setName("foo"); + + assertThat(sequence.getName()).isEqualTo("foo"); + assertThat(sequence.getFullyQualifiedName()).isEqualTo("foo"); + } + + @Test + public void testSetSchemaName() { + Sequence sequence = new Sequence(); + sequence.setName("foo"); + sequence.setSchemaName("bar"); + + assertThat(sequence.getSchemaName()).isEqualTo("bar"); + assertThat(sequence.getFullyQualifiedName()).isEqualTo("bar.foo"); + } + + @Test + public void testSetDatabase() { + Sequence sequence = new Sequence(); + sequence.setName("foo"); + sequence.setSchemaName("bar"); + sequence.setDatabase(new Database("default")); + + assertThat(sequence.getDatabase().getDatabaseName()).isEqualTo("default"); + assertThat(sequence.getFullyQualifiedName()).isEqualTo("default.bar.foo"); + } + + @Test + public void testSetPartialName() { + Sequence sequence = new Sequence(); + sequence.setName("foo"); + sequence.setDatabase(new Database("default")); + + assertThat(sequence.getFullyQualifiedName()).isEqualTo("default..foo"); + } +} diff --git a/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java b/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java index db085e8d09..63de64350e 100644 --- a/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java @@ -1,3 +1,12 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2020 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ package net.sf.jsqlparser.statement.create; import net.sf.jsqlparser.JSQLParserException;