Skip to content

Commit da32442

Browse files
refactor: CREATE and ALTER productions
- avoid LOOKAHEADs - simplify the SimpleStatement() production - use UnsupportedStatements() for any RDBMS specific syntax - fixes #1515 - fixes #1453
1 parent 4fb1cfb commit da32442

4 files changed

Lines changed: 158 additions & 67 deletions

File tree

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 118 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,8 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
391391
| <K_SYSTEM:"SYSTEM">
392392
| <K_TABLE:"TABLE">
393393
| <K_TABLES:"TABLES">
394-
| <K_TABLESPACE : "TABLESPACE">
394+
| <K_TABLESPACE: "TABLESPACE">
395+
| <K_TRIGGER: "TRIGGER">
395396
| <K_THEN:"THEN">
396397
| <K_TEMP:"TEMP">
397398
| <K_TEMPORARY:"TEMPORARY">
@@ -635,38 +636,12 @@ Statement SingleStatement() :
635636
|
636637
LOOKAHEAD(3) stm = Upsert()
637638
|
638-
LOOKAHEAD(2)
639-
stm = AlterTable()
640-
|
641-
LOOKAHEAD(2)
642-
stm = AlterSession()
643-
|
644-
LOOKAHEAD(CreateFunctionStatement())
645-
stm = CreateFunctionStatement()
646-
|
647-
LOOKAHEAD(CreateIndex())
648-
stm = CreateIndex()
649-
|
650-
LOOKAHEAD(CreateSchema())
651-
stm = CreateSchema()
652-
|
653-
LOOKAHEAD(CreateSequence())
654-
stm = CreateSequence()
655-
|
656-
LOOKAHEAD(CreateSynonym())
657-
stm = CreateSynonym()
658-
|
659-
LOOKAHEAD(CreateTable())
660-
stm = CreateTable()
639+
LOOKAHEAD(2) stm = Alter()
661640
|
662-
LOOKAHEAD(CreateView())
663-
stm = CreateView()
664-
|
665-
LOOKAHEAD(AlterView())
666-
stm = AlterView()
641+
// @todo: merge this into the ALTER TABLE statement
642+
stm = RenameTableStatement()
667643
|
668-
LOOKAHEAD(AlterSequence())
669-
stm = AlterSequence()
644+
stm = Create()
670645
|
671646
stm = Drop()
672647
|
@@ -678,8 +653,6 @@ Statement SingleStatement() :
678653
|
679654
stm = Set()
680655
|
681-
stm = RenameTableStatement()
682-
|
683656
stm = Reset()
684657
|
685658
stm = Show()
@@ -703,8 +676,6 @@ Statement SingleStatement() :
703676
stm = Grant()
704677
|
705678
stm = PurgeStatement()
706-
|
707-
stm = AlterSystemStatement()
708679
)
709680
{ return stm; }
710681
} catch (ParseException e) {
@@ -1748,7 +1719,7 @@ String RelObjectNameWithoutValue() :
17481719
{ Token tk = null; }
17491720
{
17501721
( tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> | tk=<K_DATE_LITERAL> | tk=<K_DATETIMELITERAL> | tk=<K_STRING_FUNCTION_NAME> | tk=<K_ISOLATION> | tk=<K_TIME_KEY_EXPR>
1751-
| tk="ACTION" | tk="ACTIVE" | tk="ADD" | tk="ADVANCE" | tk="ADVISE" | tk="AGAINST" | tk="ALGORITHM" | tk="ALTER" | tk="ANALYZE" | tk="APPLY" | tk="ARCHIVE" | tk="ARRAY" | tk="ASC" | tk="AT" | tk="AUTHORIZATION" | tk="AUTO" | tk="BEGIN" | tk="BINARY" | tk="BIT" | tk="BUFFERS" | tk="BY" | tk="BYTE" | tk="BYTES" | tk="CACHE" | tk="CALL" | tk="CASCADE" | tk="CASE" | tk="CAST" | tk="CHANGE" | tk="CHANGES" | tk="CHAR" | tk="CHARACTER" | tk="CHECKPOINT" | tk="CLOSE" | tk="COLLATE" | tk="COLUMN" | tk="COLUMNS" | tk="COMMENT" | tk="COMMIT" | tk="CONFLICT" | tk="CONVERT" | tk="COSTS" | tk="CS" | tk="CYCLE" | tk="DATABASE" | tk="DDL" | tk="DECLARE" | tk="DEFAULT" | tk="DEFERRABLE" | tk="DELAYED" | tk="DELETE" | tk="DESC" | tk="DESCRIBE" | tk="DISABLE" | tk="DISCONNECT" | tk="DIV" | tk="DML" | tk="DO" | tk="DROP" | tk="DUMP" | tk="DUPLICATE" | tk="EMIT" | tk="ENABLE" | tk="END" | tk="ESCAPE" | tk="EXCLUDE" | tk="EXEC" | tk="EXECUTE" | tk="EXPLAIN" | tk="EXTENDED" | tk="EXTRACT" | tk="FALSE" | tk="FILTER" | tk="FIRST" | tk="FLUSH" | tk="FN" | tk="FOLLOWING" | tk="FORMAT" | tk="FULLTEXT" | tk="FUNCTION" | tk="GLOBAL" | tk="GRANT" | tk="GUARD" | tk="HISTORY" | tk="HOPPING" | tk="INCLUDE" | tk="INCREMENT" | tk="INDEX" | tk="INSERT" | tk="INTERLEAVE" | tk="ISNULL" | tk="JSON" | tk="KEEP" | tk="KEY" | tk="KEYS" | tk="LAST" | tk="LEADING" | tk="LINK" | tk="LOCAL" | tk="LOCKED" | tk="LOG" | tk="MATCH" | tk="MATCHED" | tk="MATERIALIZED" | tk="MAXVALUE" | tk="MEMBER" | tk="MERGE" | tk="MINVALUE" | tk="MODIFY" | tk="MOVEMENT" | tk="NEXT" | tk="NO" | tk="NOCACHE" | tk="NOKEEP" | tk="NOLOCK" | tk="NOMAXVALUE" | tk="NOMINVALUE" | tk="NOORDER" | tk="NOTHING" | tk="NOVALIDATE" | tk="NOWAIT" | tk="NULLS" | tk="OF" | tk="OFF" | tk="OPEN" | tk="OVER" | tk="OVERLAPS" | tk="PARALLEL" | tk="PARENT" | tk="PARTITION" | tk="PATH" | tk="PERCENT" | tk="PLACING" | tk="PRECEDING" | tk="PRECISION" | tk="PRIMARY" | tk="PRIOR" | tk="PURGE" | tk="QUERY" | tk="QUICK" | tk="QUIESCE" | tk="RANGE" | tk="READ" | tk="RECYCLEBIN" | tk="REFERENCES" | tk="REFRESH" | tk="REGISTER" | tk="RENAME" | tk="REPLACE" | tk="RESET" | tk="RESTART" | tk="RESTRICT" | tk="RESTRICTED" | tk="RESUMABLE" | tk="RESUME" | tk="RLIKE" | tk="ROLLBACK" | tk="ROW" | tk="ROWS" | tk="RR" | tk="RS" | tk="SAVEPOINT" | tk="SCHEMA" | tk="SEPARATOR" | tk="SEQUENCE" | tk="SESSION" | tk="SETS" | tk="SHOW" | tk="SHUTDOWN" | tk="SIBLINGS" | tk="SIGNED" | tk="SIMILAR" | tk="SIZE" | tk="SKIP" | tk="STORED" | tk="STRING" | tk="SUSPEND" | tk="SWITCH" | tk="SYNONYM" | tk="SYSTEM" | tk="TABLE" | tk="TABLESPACE" | tk="TEMP" | tk="TEMPORARY" | tk="THEN" | tk="TIMEOUT" | tk="TIMESTAMPTZ" | tk="TO" | tk="TRUE" | tk="TRUNCATE" | tk="TUMBLING" | tk="TYPE" | tk="UNLOGGED" | tk="UNQIESCE" | tk="UNSIGNED" | tk="UPDATE" | tk="UPSERT" | tk="UR" | tk="USER" | tk="VALIDATE" | tk="VERBOSE" | tk="VIEW" | tk="WAIT" | tk="WITHIN" | tk="WITHOUT" | tk="WORK" | tk="XML" | tk="XMLAGG" | tk="XMLTEXT" | tk="YAML" | tk="YES" | tk="ZONE" )
1722+
| tk="ACTION" | tk="ACTIVE" | tk="ADD" | tk="ADVANCE" | tk="ADVISE" | tk="AGAINST" | tk="ALGORITHM" | tk="ALTER" | tk="ANALYZE" | tk="APPLY" | tk="ARCHIVE" | tk="ARRAY" | tk="ASC" | tk="AT" | tk="AUTHORIZATION" | tk="AUTO" | tk="BEGIN" | tk="BINARY" | tk="BIT" | tk="BUFFERS" | tk="BY" | tk="BYTE" | tk="BYTES" | tk="CACHE" | tk="CALL" | tk="CASCADE" | tk="CASE" | tk="CAST" | tk="CHANGE" | tk="CHANGES" | tk="CHAR" | tk="CHARACTER" | tk="CHECKPOINT" | tk="CLOSE" | tk="COLLATE" | tk="COLUMN" | tk="COLUMNS" | tk="COMMENT" | tk="COMMIT" | tk="CONFLICT" | tk="CONVERT" | tk="COSTS" | tk="CS" | tk="CYCLE" | tk="DATABASE" | tk="DDL" | tk="DECLARE" | tk="DEFAULT" | tk="DEFERRABLE" | tk="DELAYED" | tk="DELETE" | tk="DESC" | tk="DESCRIBE" | tk="DISABLE" | tk="DISCONNECT" | tk="DIV" | tk="DML" | tk="DO" | tk="DROP" | tk="DUMP" | tk="DUPLICATE" | tk="EMIT" | tk="ENABLE" | tk="END" | tk="ESCAPE" | tk="EXCLUDE" | tk="EXEC" | tk="EXECUTE" | tk="EXPLAIN" | tk="EXTENDED" | tk="EXTRACT" | tk="FALSE" | tk="FILTER" | tk="FIRST" | tk="FLUSH" | tk="FN" | tk="FOLLOWING" | tk="FORMAT" | tk="FULLTEXT" | tk="FUNCTION" | tk="GLOBAL" | tk="GRANT" | tk="GUARD" | tk="HISTORY" | tk="HOPPING" | tk="INCLUDE" | tk="INCREMENT" | tk="INDEX" | tk="INSERT" | tk="INTERLEAVE" | tk="ISNULL" | tk="JSON" | tk="KEEP" | tk="KEY" | tk="KEYS" | tk="LAST" | tk="LEADING" | tk="LINK" | tk="LOCAL" | tk="LOCKED" | tk="LOG" | tk="MATCH" | tk="MATCHED" | tk="MATERIALIZED" | tk="MAXVALUE" | tk="MEMBER" | tk="MERGE" | tk="MINVALUE" | tk="MODIFY" | tk="MOVEMENT" | tk="NEXT" | tk="NO" | tk="NOCACHE" | tk="NOKEEP" | tk="NOLOCK" | tk="NOMAXVALUE" | tk="NOMINVALUE" | tk="NOORDER" | tk="NOTHING" | tk="NOVALIDATE" | tk="NOWAIT" | tk="NULLS" | tk="OF" | tk="OFF" | tk="OPEN" | tk="OVER" | tk="OVERLAPS" | tk="PARALLEL" | tk="PARENT" | tk="PARTITION" | tk="PATH" | tk="PERCENT" | tk="PLACING" | tk="PRECEDING" | tk="PRECISION" | tk="PRIMARY" | tk="PRIOR" | tk="PURGE" | tk="QUERY" | tk="QUICK" | tk="QUIESCE" | tk="RANGE" | tk="READ" | tk="RECYCLEBIN" | tk="REFERENCES" | tk="REFRESH" | tk="REGISTER" | tk="RENAME" | tk="REPLACE" | tk="RESET" | tk="RESTART" | tk="RESTRICT" | tk="RESTRICTED" | tk="RESUMABLE" | tk="RESUME" | tk="RLIKE" | tk="ROLLBACK" | tk="ROW" | tk="ROWS" | tk="RR" | tk="RS" | tk="SAVEPOINT" | tk="SCHEMA" | tk="SEPARATOR" | tk="SEQUENCE" | tk="SESSION" | tk="SETS" | tk="SHOW" | tk="SHUTDOWN" | tk="SIBLINGS" | tk="SIGNED" | tk="SIMILAR" | tk="SIZE" | tk="SKIP" | tk="STORED" | tk="STRING" | tk="SUSPEND" | tk="SWITCH" | tk="SYNONYM" | tk="SYSTEM" | tk="TABLE" | tk="TABLESPACE" | tk="TEMP" | tk="TEMPORARY" | tk="THEN" | tk="TIMEOUT" | tk="TIMESTAMPTZ" | tk="TO" | tk="TRIGGER" | tk="TRUE" | tk="TRUNCATE" | tk="TUMBLING" | tk="TYPE" | tk="UNLOGGED" | tk="UNQIESCE" | tk="UNSIGNED" | tk="UPDATE" | tk="UPSERT" | tk="UR" | tk="USER" | tk="VALIDATE" | tk="VERBOSE" | tk="VIEW" | tk="WAIT" | tk="WITHIN" | tk="WITHOUT" | tk="WORK" | tk="XML" | tk="XMLAGG" | tk="XMLTEXT" | tk="YAML" | tk="YES" | tk="ZONE" )
17521723
{ return tk.image; }
17531724
}
17541725

@@ -4908,7 +4879,6 @@ CreateIndex CreateIndex():
49084879
List<String> name;
49094880
}
49104881
{
4911-
<K_CREATE>
49124882
[ parameter=CreateParameter() ]
49134883

49144884
<K_INDEX> index = Index() { index.setType(parameter.isEmpty()?null:parameter.get(0)); }
@@ -4967,7 +4937,7 @@ CreateSchema CreateSchema():
49674937
List<Statement> statements = new ArrayList<Statement>();
49684938
}
49694939
{
4970-
<K_CREATE> <K_SCHEMA>
4940+
<K_SCHEMA>
49714941
[ ( tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) { schema.setSchemaName(tk.image); } ]
49724942
[ <K_AUTHORIZATION>
49734943
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) { schema.setAuthorization(tk.image); }
@@ -4976,13 +4946,14 @@ CreateSchema CreateSchema():
49764946
[schemaPath=PathSpecification() { schema.setSchemaPath(schemaPath); }]
49774947

49784948
(
4979-
LOOKAHEAD(3)
4980-
table = CreateTable()
4949+
<K_CREATE>
4950+
4951+
table = CreateTable(false)
49814952
{
49824953
table.getTable().setSchemaName(schema.getSchemaName());
49834954
schema.addStatement(table);
49844955
}
4985-
| view = CreateView()
4956+
| view = CreateView(false)
49864957
{
49874958
view.getView().setSchemaName(schema.getSchemaName());
49884959
schema.addStatement(view);
@@ -5007,7 +4978,7 @@ List<String> PathSpecification():
50074978
}
50084979
}
50094980

5010-
CreateTable CreateTable():
4981+
CreateTable CreateTable(boolean isUsingOrReplace):
50114982
{
50124983
CreateTable createTable = new CreateTable();
50134984
Table table = null;
@@ -5042,8 +5013,7 @@ CreateTable CreateTable():
50425013
List<String> columns = new ArrayList<String>();
50435014
}
50445015
{
5045-
<K_CREATE>
5046-
[ <K_OR> <K_REPLACE> { createTable.setOrReplace(true);} ]
5016+
{ createTable.setOrReplace(isUsingOrReplace);}
50475017
[ <K_UNLOGGED> { createTable.setUnlogged(true); } ]
50485018

50495019
// table options, not required but 1 or none
@@ -5302,7 +5272,7 @@ Analyze Analyze():
53025272
}
53035273
}
53045274

5305-
CreateView CreateView():
5275+
CreateView CreateView(boolean isUsingOrReplace):
53065276
{
53075277
CreateView createView = new CreateView();
53085278
Table view = null;
@@ -5311,8 +5281,7 @@ CreateView CreateView():
53115281
Token tk = null;
53125282
}
53135283
{
5314-
<K_CREATE>
5315-
[ <K_OR> <K_REPLACE> { createView.setOrReplace(true);} ]
5284+
{ createView.setOrReplace(isUsingOrReplace);}
53165285
[
53175286
<K_NO> <K_FORCE> { createView.setForce(ForceOption.NO_FORCE); }
53185287
| <K_FORCE> { createView.setForce(ForceOption.FORCE); }
@@ -5352,16 +5321,15 @@ ReferentialAction.Action Action():
53525321
{ return action; }
53535322
}
53545323

5355-
AlterView AlterView():
5324+
AlterView AlterView(boolean useReplace):
53565325
{
53575326
AlterView alterView = new AlterView();
53585327
Table view = null;
53595328
Select select = null;
53605329
List<String> columnNames = null;
53615330
}
53625331
{
5363-
( (<K_ALTER> ) | (<K_REPLACE> {alterView.setUseReplace(true);}) )
5364-
<K_VIEW> view=Table() { alterView.setView(view); }
5332+
<K_VIEW> view=Table() { alterView.setView(view); alterView.setUseReplace(useReplace); }
53655333
[ columnNames = ColumnsNamesList() { alterView.setColumnNames(columnNames); } ]
53665334
<K_AS>
53675335
select=Select() { alterView.setSelect(select); }
@@ -6022,6 +5990,49 @@ AlterExpression AlterExpression():
60225990
}
60235991
}
60245992

5993+
Statement Alter():
5994+
{
5995+
Statement statement;
5996+
List<String> captureRest;
5997+
}
5998+
{
5999+
(
6000+
(
6001+
<K_ALTER>
6002+
(
6003+
statement = AlterTable()
6004+
|
6005+
statement = AlterSession()
6006+
|
6007+
statement = AlterView(false)
6008+
|
6009+
statement = AlterSystemStatement()
6010+
|
6011+
statement = AlterSequence()
6012+
|
6013+
captureRest = captureRest()
6014+
{
6015+
statement = new UnsupportedStatement("ALTER", captureRest);
6016+
}
6017+
)
6018+
)
6019+
|
6020+
(
6021+
<K_REPLACE>
6022+
(
6023+
statement = AlterView(true)
6024+
|
6025+
captureRest = captureRest()
6026+
{
6027+
statement = new UnsupportedStatement("REPLACE", captureRest);
6028+
}
6029+
)
6030+
)
6031+
)
6032+
{
6033+
return statement;
6034+
}
6035+
}
60256036

60266037
Alter AlterTable():
60276038
{
@@ -6031,7 +6042,7 @@ Alter AlterTable():
60316042
boolean usingIfExists = false;
60326043
}
60336044
{
6034-
<K_ALTER> <K_TABLE>
6045+
<K_TABLE>
60356046
[ <K_ONLY> { alter.setUseOnly(true); } ]
60366047
[ LOOKAHEAD(2) <K_IF> <K_EXISTS> { usingIfExists = true; } ]
60376048

@@ -6056,7 +6067,7 @@ AlterSession AlterSession():
60566067
Token token;
60576068
}
60586069
{
6059-
<K_ALTER> <K_SESSION> (
6070+
<K_SESSION> (
60606071
(
60616072
<K_ADVISE> ( <K_COMMIT> { operation = AlterSessionOperation.ADVISE_COMMIT; }
60626073
| <K_ROLLBACK> { operation = AlterSessionOperation.ADVISE_ROLLBACK; }
@@ -6122,7 +6133,7 @@ AlterSystemStatement AlterSystemStatement():
61226133
List<String> parameters = new LinkedList<String>();
61236134
}
61246135
{
6125-
<K_ALTER> <K_SYSTEM> (
6136+
<K_SYSTEM> (
61266137
(
61276138
"ARCHIVE" "LOG" { operation = AlterSystemOperation.ARCHIVE_LOG; }
61286139
)
@@ -6468,7 +6479,6 @@ CreateSequence CreateSequence():
64686479
List<Sequence.Parameter> sequenceParameters;
64696480
}
64706481
{
6471-
<K_CREATE>
64726482
<K_SEQUENCE> sequence=Sequence() { createSequence.setSequence(sequence); }
64736483
sequenceParameters = SequenceParameters() { sequence.setParameters(sequenceParameters); }
64746484
{
@@ -6483,23 +6493,63 @@ AlterSequence AlterSequence():
64836493
List<Sequence.Parameter> sequenceParameters;
64846494
}
64856495
{
6486-
<K_ALTER>
64876496
<K_SEQUENCE> sequence=Sequence() { alterSequence.setSequence(sequence); }
64886497
sequenceParameters = SequenceParameters() { sequence.setParameters(sequenceParameters); }
64896498
{
64906499
return alterSequence;
64916500
}
64926501
}
64936502

6494-
CreateFunctionalStatement CreateFunctionStatement():
6503+
Statement Create():
6504+
{
6505+
boolean isUsingOrReplace=false;
6506+
Statement statement;
6507+
List<String> captureRest;
6508+
}
6509+
{
6510+
<K_CREATE> [ <K_OR> <K_REPLACE> { isUsingOrReplace = true; } ]
6511+
(
6512+
statement = CreateFunctionStatement(isUsingOrReplace)
6513+
|
6514+
statement = CreateSchema()
6515+
|
6516+
statement = CreateSequence()
6517+
|
6518+
statement = CreateSynonym(isUsingOrReplace)
6519+
|
6520+
LOOKAHEAD(3) statement = CreateTable(isUsingOrReplace)
6521+
|
6522+
LOOKAHEAD(2) statement = CreateView(isUsingOrReplace)
6523+
|
6524+
// @fixme: must appear with TRIGGER before INDEX or it will collide with INDEX's CreateParameter() production
6525+
<K_TRIGGER> captureRest = captureRest()
6526+
{
6527+
statement = new UnsupportedStatement("CREATE TRIGGER", captureRest);
6528+
}
6529+
|
6530+
/* @fixme
6531+
* Create Index uses CreateParameter() which allows all kind of tokens
6532+
* it can conflict with other statements and must be at the end right now
6533+
*/
6534+
statement = CreateIndex()
6535+
|
6536+
captureRest = captureRest()
6537+
{
6538+
statement = new UnsupportedStatement("CREATE", captureRest);
6539+
}
6540+
)
6541+
{
6542+
return statement;
6543+
}
6544+
}
6545+
6546+
CreateFunctionalStatement CreateFunctionStatement(boolean isUsingOrReplace):
64956547
{
64966548
CreateFunctionalStatement type = null;
64976549
List<String> tokens = new LinkedList<String>();
64986550
String statementType = null;
6499-
boolean orReplace = false;
65006551
}
65016552
{
6502-
<K_CREATE> [<K_OR> <K_REPLACE> { orReplace = true; } ]
65036553
(
65046554
<K_FUNCTION> { statementType = "FUNCTION"; }
65056555
|
@@ -6508,32 +6558,29 @@ CreateFunctionalStatement CreateFunctionStatement():
65086558
tokens=captureRest()
65096559
{
65106560
if(statementType.equals("FUNCTION")) {
6511-
type = new CreateFunction(orReplace, tokens);
6561+
type = new CreateFunction(isUsingOrReplace, tokens);
65126562
}
65136563
if(statementType.equals("PROCEDURE")) {
6514-
type = new CreateProcedure(orReplace, tokens);
6564+
type = new CreateProcedure(isUsingOrReplace, tokens);
65156565
}
65166566

65176567
return type;
65186568
}
65196569
}
65206570

6521-
CreateSynonym CreateSynonym():
6571+
CreateSynonym CreateSynonym(boolean isUsingOrReplace):
65226572
{
65236573
CreateSynonym createSynonym = new CreateSynonym();
65246574
Synonym synonym;
6525-
boolean orReplace = false;
65266575
boolean publicSynonym = false;
65276576
List<String> data = new ArrayList<String>();
65286577
}
65296578
{
6530-
<K_CREATE>
6531-
[<K_OR> <K_REPLACE> { orReplace = true; } ]
65326579
[<K_PUBLIC> { publicSynonym = true; } ]
65336580
<K_SYNONYM> synonym=Synonym() { createSynonym.setSynonym(synonym); }
65346581
<K_FOR> data = RelObjectNameList()
65356582
{
6536-
createSynonym.setOrReplace(orReplace);
6583+
createSynonym.setOrReplace(isUsingOrReplace);
65376584
createSynonym.setPublicSynonym(publicSynonym);
65386585
createSynonym.setForList(data);
65396586
return createSynonym;
@@ -6571,10 +6618,14 @@ List<String> captureRest() {
65716618
Token tok;
65726619
while(true) {
65736620
tok = getToken(1);
6574-
if(tok.kind == EOF) {
6621+
int l = tokens.size();
6622+
if( tok.kind == EOF ) {
65756623
break;
6624+
} else if ( l>0 && ( tok.image.equals(".") || tokens.get(l-1).endsWith(".")) ) {
6625+
tokens.set(l-1, tokens.get(l-1) + tok.image);
6626+
} else {
6627+
tokens.add(tok.image);
65766628
}
6577-
tokens.add(tok.image);
65786629
tok = getNextToken();
65796630
}
65806631
return tokens;

src/test/java/net/sf/jsqlparser/statement/ShowStatementTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
package net.sf.jsqlparser.statement;
1111

1212
import net.sf.jsqlparser.JSQLParserException;
13+
import org.junit.jupiter.api.Assertions;
1314
import org.junit.jupiter.api.Test;
1415

1516
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
@@ -36,4 +37,12 @@ void testShowIndexesFromTable() throws JSQLParserException {
3637
"show indexes from my_table";
3738
assertSqlCanBeParsedAndDeparsed(sqlStr, true);
3839
}
40+
41+
@Test
42+
void testShowCreateTable() throws JSQLParserException {
43+
String sqlStr =
44+
"show create table my_table";
45+
Statement statement = assertSqlCanBeParsedAndDeparsed(sqlStr, true);
46+
Assertions.assertTrue( statement instanceof UnsupportedStatement);
47+
}
3948
}

0 commit comments

Comments
 (0)