From 3e18bd0a11c385fa630a63f5131cb518d07fceb0 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Mon, 3 Feb 2025 14:55:40 +0100 Subject: [PATCH 01/27] feat: Implement IMPORT statement grammar For reference see https://docs.exasol.com/db/latest/sql/import.htm --- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 630 ++++++++++++++++++ 1 file changed, 630 insertions(+) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index f0d1f0782..6d260a9b1 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -159,6 +159,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -174,12 +175,14 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | | | | +| | | | @@ -193,6 +196,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | /* H2 casewhen function */ | +| | | | @@ -200,12 +204,14 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | | | | +| | | | @@ -216,6 +222,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -225,9 +232,11 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | +| | | | @@ -238,6 +247,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -245,14 +255,18 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | | +| | +| | | | /* Salesforce SOQL */ +| | | | @@ -260,8 +274,10 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | +| | | | @@ -288,17 +304,22 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| +| | | | | +| | | | /* Salesforce SOQL */ | +| | | | +| | | | @@ -310,6 +331,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -335,6 +357,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -362,6 +385,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -377,6 +401,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | "> | | @@ -387,6 +412,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -415,6 +441,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -437,10 +464,12 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | | +| | | | @@ -497,6 +526,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -515,6 +545,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -1011,6 +1042,605 @@ List error_skipto(int kind) { return tokenImages; } +LikeClause LikeClause(): { + LikeClause likeClause = new LikeClause(); + Table table; + List> columnsList; +} { + + table = Table() { likeClause.setTable(table); } + [columnsList = ColumnSelectItemsList() { likeClause.setColumnsList(columnsList); }] + + [ + ( + { likeClause.setIncludingDefaults(true); } + | { likeClause.setExcludingDefaults(true); } + ) + + ] + + [ + ( + { likeClause.setIncludingIdentity(true); } + | { likeClause.setExcludingIdentity(true); } + ) + + ] + + [ + ( + { likeClause.setIncludingComments(true); } + | { likeClause.setExcludingComments(true); } + ) + + ] + + { + return likeClause; + } +} + +Import Import(): { + Import impt = new Import(); + Table table; + Column tableColumn; + ExpressionList columns; + ImportColumn importColumn; + List importColumns; + ImportFromItem fromItem; + ColumnDefinition columnDefinition; + LikeClause likeClause; +} { + + [ + + ( + table = Table() { impt.setTable(table); } + columns = ParenthesedColumnList() { impt.setColumns(columns); } + | "(" + ( + columnDefinition = ColumnDefinition() { importColumn = new ImportColumn(columnDefinition); } + | likeClause = LikeClause() { importColumn = new ImportColumn(likeClause); } + ) + { + importColumns = new ArrayList(); + impt.setImportColumns(importColumns); + importColumns.add(importColumn); + } + ( + "," + ( + columnDefinition = ColumnDefinition() { importColumn = new ImportColumn(columnDefinition); } + | likeClause = LikeClause() { importColumn = new ImportColumn(likeClause); } + ) + { + importColumns.add(importColumn); + } + )* + ")" + ) + ] + + + fromItem = ImportFromItem() { impt.setFromItem(fromItem); } + + { + return impt; + } +} + +ImportFromItem ImportFromItem(): { + ImportFromItem importFromItem; + ErrorClause errorClause; +} { + ( + ( + importFromItem = DBMSSource() + | importFromItem = FileSource() + ) + [errorClause = ErrorClause() { importFromItem.setErrorClause(errorClause); }] + | importFromItem = ScriptSource() + ) + { + return importFromItem; + } +} + +DBMSSource DBMSSource() #DBMSSource: { + DBMSSource dbmsSource = new DBMSSource(); + ConnectionDefinition connectionDefinition; + Table table; + ExpressionList columns; + List statements; + Token token; +} { + ( + { dbmsSource.setDataSource(DataSource.EXA); } + | { dbmsSource.setDataSource(DataSource.ORA); } + | ( + { dbmsSource.setDataSource(DataSource.JDBC); } + [ "=" token = { dbmsSource.setJdbcDriverDefinition(new StringValue(token.image)); }] + ) + ) + + connectionDefinition = ConnectionDefinition() { dbmsSource.setConnectionDefinition(connectionDefinition); } + + ( + table = Table() { dbmsSource.setTable(table); } + [ columns = ParenthesedColumnList() { dbmsSource.setColumns(columns); } ] + | token = + { + statements = new ArrayList(); + dbmsSource.setStatements(statements); + StringValue stringValue = new StringValue(token.image); + linkAST(stringValue, jjtThis); + statements.add(stringValue); + } + ( + token = + { + StringValue stringValue = new StringValue(token.image); + linkAST(stringValue, jjtThis); + statements.add(stringValue); + } + )* + ) + { + return dbmsSource; + } +} + +FileSource FileSource() #FileSource: { + FileSource fileSource = new FileSource(); + ConnectionDefinition connectionDefinition; + List fileDefinitions; + List csvColumns; + List fbvColumns; + List fileOptions; + CertificateVerification certificateVerification; + + Token token = null; + Token token2 = null; + Token token3 = null; +} { + ( + ( + ( + { fileSource.setDataSource(DataSource.CSV); } + | { fileSource.setDataSource(DataSource.FBV); } + ) + + ( + ( + connectionDefinition = ConnectionDefinition() + | connectionDefinition = CloudConnectionDefinition() + ) + token = + { + fileDefinitions = new ArrayList(); + StringValue stringVal = new StringValue(token.image); + linkAST(stringVal, jjtThis); + fileDefinitions.add(stringVal); + } + ( + token = + { + StringValue stringVal = new StringValue(token.image); + linkAST(stringVal, jjtThis); + fileDefinitions.add(stringVal); + } + )* + ) + { + connectionFileDefinitions = new ArrayList(); + connectionFileDefinitions.add(new ConnectionFileDefinition(connectionDefinition, fileDefinitions)); + } + + ( + ( + ( + connectionDefinition = ConnectionDefinition() + | connectionDefinition = CloudConnectionDefinition() + ) + token = + { + fileDefinitions = new ArrayList(); + StringValue stringVal = new StringValue(token.image); + linkAST(stringVal, jjtThis); + fileDefinitions.add(stringVal); + } + ( + token = + { + stringVal = new StringValue(token.image); + linkAST(stringVal, jjtThis); + fileDefinitions.add(stringVal); + } + )* + ) + { connectionFileDefinitions.add(new ConnectionFileDefinition(connectionDefinition, fileDefinitions)); } + )* + ) + | ( + { fileSource.setLocal(true); } + [ { fileSource.setSecure(true); }] + + ( + { fileSource.setDataSource(DataSource.CSV); } + | { fileSource.setDataSource(DataSource.FBV); } + ) + + ( + token = + { + fileDefinitions = new ArrayList(); + StringValue stringVal = new StringValue(token.image); + linkAST(stringVal, jjtThis); + fileDefinitions.add(stringVal); + } + ( + token = + { + stringVal = new StringValue(token.image); + linkAST(stringVal, jjtThis); + fileDefinitions.add(stringVal); + } + )* + ) + { connectionFileDefinitions.add(new ConnectionFileDefinition(fileDefinitions)); } + ) + ) + { fileSource.setConnectionFileDefinitions(connectionFileDefinitions); } + + [ + "(" + ( + ( + ( + token= + ".." + token2= + { CSVColumns csvColumns = new CSVColumns(Long.parseLong(token.image), Long.parseLong(token2.image)); } + | token= { CSVColumns csvColumns = new CSVColumns(Long.parseLong(token.image)); } + [ "=" token = { csvColumns.setFormat(new StringValue(token.image)); }] + ) + { + List csvColumnsList = new ArrayList(); + fileSource.setCSVColumnsList(csvColumnsList); + csvColumnsList.add(csvColumns); + } + ( + "," + ( + token= + ".." + token2= + { csvColumns = new CSVColumns(Long.parseLong(token.image), Long.parseLong(token2.image)); } + | token= { csvColumns = new CSVColumns(Long.parseLong(token.image)); } + [ "=" token = { csvColumns.setFormat(new StringValue(token.image)); }] + ) + { + csvColumnsList.add(csvColumns); + } + )* + ) + | ( + ( + ( + token= + | token= + ) "=" token2= + { FBVColumns fbvColumns = new FBVColumns(token.image, new LongValue(token2.image)); } + | ( + token= + | token= + ) "=" token2= + { FBVColumns fbvColumns = new FBVColumns(token.image, new StringValue(token2.image)); } + | + token= "=" + ( + token2= + | token2= + ) + { FBVColumns fbvColumns = new FBVColumns(token.image, new StringValue(token2.image)); } + ) + { + List fbvColumnsList = new ArrayList(); + fileSource.setFBVColumnsList(fbvColumnsList); + fbvColumnsList.add(fbvColumns); + } + ) + ( + { boolean precedesComma = false; } + ["," { precedesComma = true; }] + ( + ( + token= + | token= + ) "=" token2= + { fbvColumns = new FBVColumns(token.image, new LongValue(token2.image)); } + | ( + token= + | token= + ) "=" token2= + { fbvColumns = new FBVColumns(token.image, new StringValue(token2.image)); } + | + token= "=" + ( + token2= + | token2= + ) + { fbvColumns = new FBVColumns(token.image, new StringValue(token2.image)); } + ) + { + fbvColumns.setPrecedesComma(precedesComma); + fbvColumnsList.add(fbvColumns); + } + )* + ) + ")" + ] + + [ + { + List fileOptions = new ArrayList(); + fileSource.setFileOptions(fileOptions); + } + ( + ( + ( + token= + | token= + | token= + ) + { FileOption fileOption = new FileOption(token.image); } + | ( + ( + token= + | token= + ) "=" token2= + { FileOption fileOption = new FileOption(token.image, new StringValue(token2.image)); } + | token= "=" token2= + { FileOption fileOption = new FileOption(token.image, new LongValue(token2.image)); } + ) + | ( + token= token2= "=" token3= + | token= + ( + token2= + | token2= + ) "=" token3= + ) + { FileOption fileOption = new FileOption(token.image + " " + token2.image, new StringValue(token3.image)); } + | token= token2= "=" token3= + { FileOption fileOption = new FileOption(token.image + " " + token2.image, new LongValue(token3.image)); } + ) + { fileOptions.add(fileOption); } + )+ + ] + + [ certificateVerification = CertificateVerification() { fileSource.setCertificateVerification(certificateVerification); } ] + + { + return fileSource; + } +} + +CertificateVerification CertificateVerification(): { + CertificateVerification certificateVerification = new CertificateVerification(); + Token token; +} { + ( + { certificateVerification.setIgnoreCertificate(true); } + | { certificateVerification.setVerifyCertificate(true); } + ) + + [ + + token = { certificateVerification.setPublicKey(new StringValue(token.image)); } + ] + | + token = { certificateVerification.setPublicKey(new StringValue(token.image)); } + + { + return certificateVerification; + } +} + +ScriptSource ScriptSource(): { + ScriptSource scriptSource = new ScriptSource(); + ConnectionDefinition connectionDefinition; + String property; + StringValue value; + + Token token; +} { + + script = Table() { scriptSource.setScript(script); } + + [ connectionDefinition = ConnectionDefinition() { scriptSource.setConnectionDefinition(connectionDefinition); } ] + + [ + { + List properties = new ArrayList(); + List values = new ArrayList(); + scriptSource.setProperties(properties); + scriptSource.setValues(values); + } + + + ( + ( + property = RelObjectNameWithoutValue() + "=" + token = { value = new StringValue(token.image); } + ) + { + properties.add(property); + values.add(value); + } + )+ + ] + + { + return scriptSource; + } +} + +UserIdentification UserIdentification(): { + UserIdentification userIdentification = new UserIdentification(); + Token token; +} { + + token= { userIdentification.setUserName(new StringValue(token.image)); } + + token= { userIdentification.setPassword(new StringValue(token.image)); } + + { + return userIdentification; + } +} + +ConnectionDefinition ConnectionDefinition(): { + ConnectionDefinition connectionDefinition = new ConnectionDefinition(); + String connectionIdentifier; + CertificateVerification certificateVerification; + + Token token; +} { + + ( + connectionIdentifier=RelObjectNameWithoutValue() { connectionDefinition.setConnection(new Connection(connectionIdentifier)); } + | token= { connectionDefinition.setConnection(new StringValue(token.image)); } + ) + + [ userIdentification = UserIdentification() { connectionDefinition.setUserIdentification(userIdentification); } ] + + [ certificateVerification = CertificateVerification() { connectionDefinition.setCertificateVerification(certificateVerification); } ] + + { + return connectionDefinition; + } +} + +ConnectionDefinition CloudConnectionDefinition(): { + ConnectionDefinition connectionDefinition = new CloudConnectionDefinition(); + String connectionIdentifier; + CertificateVerification certificateVerification; + + Token token; + Token token2; +} { + + ( + token = { connectionDefinition.setStorage(token.image); } + | { connectionDefinition.setStorage(token.image + " " + token2.image); } + ) + + ( + connectionIdentifier=RelObjectNameWithoutValue() { connectionDefinition.setConnection(new Connection(connectionIdentifier)); } + | token= { connectionDefinition.setConnection(new StringValue(token.image)); } + ) + + [ userIdentification = UserIdentification() { connectionDefinition.setUserIdentification(userIdentification); } ] + + { + return connectionDefinition; + } +} + +ErrorClause ErrorClause(): { + ErrorClause errorClause = new ErrorClause(); + ErrorDestination errorDestination; + Expression expression; + RejectLimit rejectLimit; + + Token token; +} { + + errorDestination = ErrorDestination() { errorClause.setErrorDestination(errorDestination); } + [ + "(" + expression = Expression() { errorClause.setExpression(expression); } + ")" + ] + [ + { errorClause.setReplace(true); } + | { errorClause.setTruncate(true); } + ] + [ rejectLimit = RejectLimit() { errorClause.setRejectLimit(rejectLimit); } ] + | rejectLimit = RejectLimit() { errorClause.setRejectLimit(rejectLimit); } + + { + return errorClause; + } +} + +RejectLimit RejectLimit(): { + RejectLimit rejectLimit = new RejectLimit(); +} { + + ( + token= { rejectLimit.setLimit(new LongValue(token.image)); } + | + ) + + [ { rejectLimit.setErrors(true); } ] + + { + return rejectLimit; + } +} + +ErrorDestination ErrorDestination(): { + ErrorDestination errorDestination; +} { + ( + errorDestination = CSVFileDestination() + | errorDestination = LocalCSVFileDestination() + | errorDestination = Table() + ) + + { + return errorDestination; + } +} + +CSVFileDestination CSVFileDestination(): { + CSVFileDestination csvFileDestination = new CSVFileDestination(); + ConnectionDefinition connectionDefinition; + Token token; +} { + + ( + connectionDefinition = ConnectionDefinition() + | connectionDefinition = CloudConnectionDefinition() + ) + { csvFileDestination.setConnectionDefinition(connectionDefinition); } + + + token = { csvFileDestination.setFile(new StringValue(token.image)); } + + { + return csvFileDestination; + } +} + + +LocalCSVFileDestination LocalCSVFileDestination(): { + LocalCSVFileDestination localCSVFileDestination = new LocalCSVFileDestination(); + Token token; +} { + + [ { localCSVFileDestination.setSecure(true); } ] + + token = { localCSVFileDestination.setFile(new StringValue(token.image)); } + + { + return localCSVFileDestination; + } +} + DeclareStatement Declare(): { UserVariable userVariable; ColDataType colDataType; From 482a9933e641dea2aafd752b11ad60ad9e6ad887 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Mon, 3 Feb 2025 16:11:32 +0100 Subject: [PATCH 02/27] feat: Classify new keywords in ParserKeywordsUtils --- .../net/sf/jsqlparser/parser/ParserKeywordsUtils.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/net/sf/jsqlparser/parser/ParserKeywordsUtils.java b/src/main/java/net/sf/jsqlparser/parser/ParserKeywordsUtils.java index d93fa0471..3da975b20 100644 --- a/src/main/java/net/sf/jsqlparser/parser/ParserKeywordsUtils.java +++ b/src/main/java/net/sf/jsqlparser/parser/ParserKeywordsUtils.java @@ -56,6 +56,7 @@ public class ParserKeywordsUtils { {"CHECK", RESTRICTED_SQL2016}, {"CONNECT", RESTRICTED_ALIAS}, {"CONNECT_BY_ROOT", RESTRICTED_JSQLPARSER}, + {"CSV", RESTRICTED_JSQLPARSER}, {"PRIOR", RESTRICTED_JSQLPARSER}, {"CONSTRAINT", RESTRICTED_SQL2016}, {"CREATE", RESTRICTED_ALIAS}, @@ -65,11 +66,14 @@ public class ParserKeywordsUtils { {"DISTINCT", RESTRICTED_SQL2016}, {"DOUBLE", RESTRICTED_ALIAS}, {"ELSE", RESTRICTED_JSQLPARSER}, + {"ERRORS", RESTRICTED_JSQLPARSER}, {"EXCEPT", RESTRICTED_SQL2016}, {"EXCLUDES", RESTRICTED_JSQLPARSER}, {"EXISTS", RESTRICTED_SQL2016}, {"FALSE", RESTRICTED_SQL2016}, + {"FBV", RESTRICTED_JSQLPARSER}, {"FETCH", RESTRICTED_SQL2016}, + {"FILE", RESTRICTED_JSQLPARSER}, {"FINAL", RESTRICTED_JSQLPARSER}, {"FOR", RESTRICTED_SQL2016}, {"FORCE", RESTRICTED_SQL2016}, @@ -81,10 +85,12 @@ public class ParserKeywordsUtils { {"GROUPING", RESTRICTED_ALIAS}, {"QUALIFY", RESTRICTED_ALIAS}, {"HAVING", RESTRICTED_SQL2016}, + {"IDENTITY", RESTRICTED_JSQLPARSER}, {"IF", RESTRICTED_SQL2016}, {"IIF", RESTRICTED_ALIAS}, {"IGNORE", RESTRICTED_ALIAS}, {"ILIKE", RESTRICTED_SQL2016}, + {"IMPORT", RESTRICTED_JSQLPARSER}, {"IN", RESTRICTED_SQL2016}, {"INCLUDES", RESTRICTED_JSQLPARSER}, {"INNER", RESTRICTED_SQL2016}, @@ -100,6 +106,7 @@ public class ParserKeywordsUtils { {"MINUS", RESTRICTED_SQL2016}, {"NATURAL", RESTRICTED_SQL2016}, {"NOCYCLE", RESTRICTED_JSQLPARSER}, + {"NONE", RESTRICTED_JSQLPARSER}, {"NOT", RESTRICTED_SQL2016}, {"NULL", RESTRICTED_SQL2016}, {"OFFSET", RESTRICTED_SQL2016}, @@ -120,12 +127,14 @@ public class ParserKeywordsUtils { {"RETURNING", RESTRICTED_JSQLPARSER}, {"RIGHT", RESTRICTED_SQL2016}, {"SAMPLE", RESTRICTED_ALIAS}, + {"SCRIPT", RESTRICTED_JSQLPARSER}, {"SEL", RESTRICTED_ALIAS}, {"SELECT", RESTRICTED_ALIAS}, {"SEMI", RESTRICTED_JSQLPARSER}, {"SET", RESTRICTED_JSQLPARSER}, {"SOME", RESTRICTED_JSQLPARSER}, {"START", RESTRICTED_JSQLPARSER}, + {"STATEMENT", RESTRICTED_JSQLPARSER}, {"TABLES", RESTRICTED_ALIAS}, {"TOP", RESTRICTED_SQL2016}, {"TRAILING", RESTRICTED_SQL2016}, @@ -145,6 +154,7 @@ public class ParserKeywordsUtils { {"VALUE", RESTRICTED_JSQLPARSER}, {"VALUES", RESTRICTED_SQL2016}, {"VARYING", RESTRICTED_JSQLPARSER}, + {"VERIFY", RESTRICTED_JSQLPARSER}, {"WHEN", RESTRICTED_SQL2016}, {"WHERE", RESTRICTED_SQL2016}, {"WINDOW", RESTRICTED_SQL2016}, From dcea88fb9a6b4ff1449ee58f8a1ce01f2ec31dc0 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Tue, 4 Feb 2025 14:20:02 +0100 Subject: [PATCH 03/27] feat: Implement java classes for IMPORT statement --- .../java/net/sf/jsqlparser/schema/Table.java | 3 +- .../sf/jsqlparser/statement/CSVColumn.java | 75 ++++++++++ .../statement/CSVFileDestination.java | 75 ++++++++++ .../statement/CertificateVerification.java | 56 ++++++++ .../statement/CloudConnectionDefinition.java | 36 +++++ .../statement/ConnectionDefinition.java | 89 ++++++++++++ .../statement/ConnectionFileDefinition.java | 53 +++++++ .../sf/jsqlparser/statement/ErrorClause.java | 88 ++++++++++++ .../statement/ErrorDestination.java | 13 ++ .../sf/jsqlparser/statement/FBVColumn.java | 76 ++++++++++ .../sf/jsqlparser/statement/FileOption.java | 69 +++++++++ .../sf/jsqlparser/statement/LikeClause.java | 114 +++++++++++++++ .../sf/jsqlparser/statement/RejectClause.java | 49 +++++++ .../statement/StatementVisitor.java | 6 + .../statement/UserIdentification.java | 46 ++++++ .../create/table/ColumnDefinition.java | 3 +- .../statement/imprt/DBMSSource.java | 103 ++++++++++++++ .../statement/imprt/DataSource.java | 19 +++ .../statement/imprt/FileSource.java | 63 +++++++++ .../sf/jsqlparser/statement/imprt/Import.java | 51 +++++++ .../statement/imprt/ImportColumn.java | 13 ++ .../statement/imprt/ImportFromItem.java | 13 ++ .../statement/imprt/ScriptSource.java | 83 +++++++++++ .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 133 ++++++++---------- 24 files changed, 1254 insertions(+), 75 deletions(-) create mode 100644 src/main/java/net/sf/jsqlparser/statement/CSVColumn.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/CSVFileDestination.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/CloudConnectionDefinition.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/ConnectionDefinition.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/ErrorClause.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/ErrorDestination.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/FBVColumn.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/FileOption.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/LikeClause.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/RejectClause.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/UserIdentification.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/imprt/DataSource.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/imprt/Import.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/imprt/ImportColumn.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/imprt/ScriptSource.java diff --git a/src/main/java/net/sf/jsqlparser/schema/Table.java b/src/main/java/net/sf/jsqlparser/schema/Table.java index 62580a642..5755bec3c 100644 --- a/src/main/java/net/sf/jsqlparser/schema/Table.java +++ b/src/main/java/net/sf/jsqlparser/schema/Table.java @@ -17,6 +17,7 @@ import net.sf.jsqlparser.expression.MySQLIndexHint; import net.sf.jsqlparser.expression.SQLServerHints; import net.sf.jsqlparser.parser.ASTNodeAccessImpl; +import net.sf.jsqlparser.statement.ErrorDestination; import net.sf.jsqlparser.statement.select.FromItem; import net.sf.jsqlparser.statement.select.FromItemVisitor; import net.sf.jsqlparser.statement.select.IntoTableVisitor; @@ -27,7 +28,7 @@ /** * A table. It can have an alias and the schema name it belongs to. */ -public class Table extends ASTNodeAccessImpl implements FromItem, MultiPartName { +public class Table extends ASTNodeAccessImpl implements ErrorDestination, FromItem, MultiPartName { // private Database database; // private String schemaName; diff --git a/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java b/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java new file mode 100644 index 000000000..f41739dd3 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java @@ -0,0 +1,75 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.StringValue; + +public class CSVColumn { + private Long startIndex; + private Long endIndex; + private StringValue format; + + public CSVColumn(Long startIndex, Long endIndex) { + this.startIndex = startIndex; + this.endIndex = endIndex; + } + + public CSVColumn(Long index) { + this(index, null); + } + + public Long getStartIndex() { + return startIndex; + } + + public void setStartIndex(Long startIndex) { + this.startIndex = startIndex; + } + + public Long getIndex() { + return getStartIndex(); + } + + public void setIndex(Long index) { + setStartIndex(index); + } + + public Long getEndIndex() { + return endIndex; + } + + public void setEndIndex(Long endIndex) { + this.endIndex = endIndex; + } + + public StringValue getFormat() { + return format; + } + + public void setFormat(StringValue format) { + this.format = format; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append(startIndex); + if (endIndex != null) { + sql.append(" .. "); + sql.append(endIndex); + } else if (format != null) { + sql.append(" FORMAT = "); + sql.append(format); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/CSVFileDestination.java b/src/main/java/net/sf/jsqlparser/statement/CSVFileDestination.java new file mode 100644 index 000000000..2e0e97be7 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/CSVFileDestination.java @@ -0,0 +1,75 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.StringValue; + +public class CSVFileDestination implements ErrorDestination { + private ConnectionDefinition connectionDefinition; + private boolean local; + private boolean secure; + private StringValue filePath; + + public ConnectionDefinition getConnectionDefinition() { + return connectionDefinition; + } + + public void setConnectionDefinition(ConnectionDefinition connectionDefinition) { + this.connectionDefinition = connectionDefinition; + } + + public boolean isLocal() { + return local; + } + + public void setLocal(boolean local) { + this.local = local; + } + + public boolean isSecure() { + return secure; + } + + public void setSecure(boolean secure) { + this.secure = secure; + } + + public StringValue getFilePath() { + return filePath; + } + + public void setFilePath(StringValue filePath) { + this.filePath = filePath; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + if (local) { + sql.append("LOCAL "); + if (secure) { + sql.append("SECURE "); + } + } + + sql.append("CSV"); + + if (connectionDefinition != null) { + sql.append(" "); + sql.append(connectionDefinition); + } + + sql.append(" FILE "); + sql.append(filePath); + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java b/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java new file mode 100644 index 000000000..79c8131ae --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java @@ -0,0 +1,56 @@ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.StringValue; + +public class CertificateVerification { + private Boolean ignoreCertificate; + private StringValue publicKey; + + public StringValue getPublicKey() { + return publicKey; + } + + public void setPublicKey(StringValue publicKey) { + this.publicKey = publicKey; + } + + public Boolean getIgnoreCertificate() { + return ignoreCertificate; + } + + public void setIgnoreCertificate(Boolean ignoreCertificate) { + this.ignoreCertificate = ignoreCertificate; + } + + public Boolean getVerifyCertificate() { + return !ignoreCertificate; + } + + public void setVerifyCertificate(Boolean verifyCertificate) { + this.ignoreCertificate = !verifyCertificate; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + if (ignoreCertificate != null) { + if (ignoreCertificate) { + sql.append("IGNORE "); + } else { + sql.append("VERIFY "); + } + sql.append("CERTIFICATE"); + } + + if (publicKey != null) { + if (ignoreCertificate != null) { + sql.append(" "); + } + sql.append("PUBLIC KEY "); + sql.append(publicKey); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/CloudConnectionDefinition.java b/src/main/java/net/sf/jsqlparser/statement/CloudConnectionDefinition.java new file mode 100644 index 000000000..93d17186b --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/CloudConnectionDefinition.java @@ -0,0 +1,36 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +public class CloudConnectionDefinition extends ConnectionDefinition { + private String storage; + + public String getStorage() { + return storage; + } + + public void setStorage(String storage) { + this.storage = storage; + } + + @Override + public void setCertificateVerification(CertificateVerification certificateVerification) {} + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append("AT CLOUD "); + sql.append(storage); + appendConnectionDefinition(sql); + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/ConnectionDefinition.java b/src/main/java/net/sf/jsqlparser/statement/ConnectionDefinition.java new file mode 100644 index 000000000..eb5377e0a --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/ConnectionDefinition.java @@ -0,0 +1,89 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.StringValue; + +public class ConnectionDefinition { + private String connectionObjectName; + private StringValue connectionDefinition; + private UserIdentification userIdentification; + private CertificateVerification certificateVerification; + + public String getConnectionObjectName() { + return connectionObjectName; + } + + public void setConnectionObjectName(String connectionObjectName) { + this.connectionObjectName = connectionObjectName; + } + + public StringValue getConnectionDefinition() { + return connectionDefinition; + } + + public void setConnectionDefinition(StringValue connectionDefinition) { + this.connectionDefinition = connectionDefinition; + } + + public void setConnection(String connectionObjectName) { + this.connectionObjectName = connectionObjectName; + } + + public void setConnection(StringValue connectionDefinition) { + this.connectionDefinition = connectionDefinition; + } + + public UserIdentification getUserIdentification() { + return userIdentification; + } + + public void setUserIdentification(UserIdentification userIdentification) { + this.userIdentification = userIdentification; + } + + public CertificateVerification getCertificateVerification() { + return certificateVerification; + } + + public void setCertificateVerification(CertificateVerification certificateVerification) { + this.certificateVerification = certificateVerification; + } + + protected StringBuilder appendConnectionDefinition(StringBuilder sql) { + if (connectionObjectName != null) { + sql.append(connectionObjectName); + } else if (connectionDefinition != null) { + sql.append(connectionDefinition); + } + + if (userIdentification != null) { + sql.append(" "); + sql.append(userIdentification); + } + + if (certificateVerification != null) { + sql.append(" "); + sql.append(certificateVerification); + } + + return sql; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append("AT "); + appendConnectionDefinition(sql); + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java b/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java new file mode 100644 index 000000000..80ce50cb0 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java @@ -0,0 +1,53 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.StringValue; +import net.sf.jsqlparser.statement.select.PlainSelect; + +import java.util.List; + +public class ConnectionFileDefinition { + private ConnectionDefinition connectionDefinition; + private List filePaths; + + public ConnectionFileDefinition(ConnectionDefinition connectionDefinition, List filePaths) { + this.connectionDefinition = connectionDefinition; + this.filePaths = filePaths; + } + + public ConnectionDefinition getConnectionDefinition() { + return connectionDefinition; + } + + public void setConnectionDefinition(ConnectionDefinition connectionDefinition) { + this.connectionDefinition = connectionDefinition; + } + + public List getFilePaths() { + return filePaths; + } + + public void setFilePaths(List filePaths) { + this.filePaths = filePaths; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append(connectionDefinition); + for (StringValue filePath : filePaths) { + sql.append(" FILE ").append(filePath); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/ErrorClause.java b/src/main/java/net/sf/jsqlparser/statement/ErrorClause.java new file mode 100644 index 000000000..f574da4bc --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/ErrorClause.java @@ -0,0 +1,88 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.Expression; + +public class ErrorClause { + private ErrorDestination errorDestination; + private Expression expression; + private RejectClause rejectClause; + private boolean replace; + private boolean truncate; + + public ErrorDestination getErrorDestination() { + return errorDestination; + } + + public void setErrorDestination(ErrorDestination errorDestination) { + this.errorDestination = errorDestination; + } + + public Expression getExpression() { + return expression; + } + + public void setExpression(Expression expression) { + this.expression = expression; + } + + public RejectClause getRejectClause() { + return rejectClause; + } + + public void setRejectClause(RejectClause rejectClause) { + this.rejectClause = rejectClause; + } + + public boolean isReplace() { + return replace; + } + + public void setReplace(boolean replace) { + this.replace = replace; + } + + public boolean isTruncate() { + return truncate; + } + + public void setTruncate(boolean truncate) { + this.truncate = truncate; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + if (errorDestination != null) { + sql.append("ERRORS INTO "); + sql.append(errorDestination); + if (expression != null) { + sql.append(" ("); + sql.append(expression); + sql.append(")"); + } + + if (replace) { + sql.append(" REPLACE"); + } else if (truncate) { + sql.append(" TRUNCATE"); + } + } + + if (rejectClause != null) { + sql.append(" "); + sql.append(rejectClause); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/ErrorDestination.java b/src/main/java/net/sf/jsqlparser/statement/ErrorDestination.java new file mode 100644 index 000000000..1ad02661f --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/ErrorDestination.java @@ -0,0 +1,13 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +public interface ErrorDestination { +} diff --git a/src/main/java/net/sf/jsqlparser/statement/FBVColumn.java b/src/main/java/net/sf/jsqlparser/statement/FBVColumn.java new file mode 100644 index 000000000..d0d1df320 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/FBVColumn.java @@ -0,0 +1,76 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.StringValue; + +public class FBVColumn { + private boolean precedesComma; + private String key; + private Expression value; + + private FBVColumn(String key, Expression value) { + this.key = key; + this.value = value; + } + + public FBVColumn(String key, StringValue value) { + this(key, (Expression) value); + } + + public FBVColumn(String key, LongValue value) { + this(key, (Expression) value); + } + + public boolean precedesComma() { + return precedesComma; + } + + public void setPrecedesComma(boolean precedesComma) { + this.precedesComma = precedesComma; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public Expression getValue() { + return value; + } + + public void setValue(StringValue value) { + this.value = value; + } + + public void setValue(LongValue value) { + this.value = value; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + if (precedesComma) { + sql.append(", "); + } + + sql.append(key); + sql.append(" = "); + sql.append(value); + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/FileOption.java b/src/main/java/net/sf/jsqlparser/statement/FileOption.java new file mode 100644 index 000000000..f26c31690 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/FileOption.java @@ -0,0 +1,69 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.StringValue; + +public class FileOption { + private String key; + private Expression value; + + private FileOption(String key, Expression value) { + this.key = key; + this.value = value; + } + + public FileOption(String key) { + this(key, (Expression) null); + } + + public FileOption(String key, StringValue value) { + this(key, (Expression) value); + } + + public FileOption(String key, LongValue value) { + this(key, (Expression) value); + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public Expression getValue() { + return value; + } + + public void setValue(StringValue value) { + this.value = value; + } + + public void setValue(LongValue value) { + this.value = value; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append(key); + if (value != null) { + sql.append(" = "); + sql.append(value); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/LikeClause.java b/src/main/java/net/sf/jsqlparser/statement/LikeClause.java new file mode 100644 index 000000000..d55df471a --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/LikeClause.java @@ -0,0 +1,114 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.imprt.ImportColumn; +import net.sf.jsqlparser.statement.select.PlainSelect; +import net.sf.jsqlparser.statement.select.SelectItem; + +import java.io.Serializable; +import java.util.List; + +/** + * Exasol Like Clause + * + * @see Like Clause in CREATE TABLE + * @see Like Clause in IMPORT + */ +public class LikeClause implements ImportColumn, Serializable { + private Table table; + private List> columnsList; + + private Boolean includingDefaults; + private Boolean includingIdentity; + private Boolean includingComments; + + public Table getTable() { + return table; + } + + public void setTable(Table table) { + this.table = table; + } + + public List> getColumnsList() { + return columnsList; + } + + public void setColumnsList(List> columnsList) { + this.columnsList = columnsList; + } + + public Boolean isIncludingDefaults() { + return includingDefaults; + } + + public void setIncludingDefaults(Boolean includingDefaults) { + this.includingDefaults = includingDefaults; + } + + public Boolean isIncludingIdentity() { + return includingIdentity; + } + + public void setIncludingIdentity(Boolean includingIdentity) { + this.includingIdentity = includingIdentity; + } + + public Boolean isIncludingComments() { + return includingComments; + } + + public void setIncludingComments(Boolean includingComments) { + this.includingComments = includingComments; + } + + public StringBuilder appendTo(StringBuilder builder) { + builder.append(" LIKE "); + builder.append(table); + PlainSelect.appendStringListTo(builder, columnsList, true, false); + + if (includingDefaults != null) { + if (includingDefaults) { + builder.append(" INCLUDING "); + } else { + builder.append(" EXCLUDING "); + } + builder.append(" DEFAULTS "); + } + + if (includingIdentity != null) { + if (includingIdentity) { + builder.append(" INCLUDING "); + } else { + builder.append(" EXCLUDING "); + } + builder.append(" IDENTITY "); + } + + if (includingComments != null) { + if (includingComments) { + builder.append(" INCLUDING "); + } else { + builder.append(" EXCLUDING "); + } + builder.append(" COMMENTS "); + } + + return builder; + } + + @Override + public String toString() { + return appendTo(new StringBuilder()).toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/RejectClause.java b/src/main/java/net/sf/jsqlparser/statement/RejectClause.java new file mode 100644 index 000000000..455f8949b --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/RejectClause.java @@ -0,0 +1,49 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +public class RejectClause { + private Long limit; + private boolean errors; + + public Long getLimit() { + return limit; + } + + public void setLimit(Long limit) { + this.limit = limit; + } + + public boolean isErrors() { + return errors; + } + + public void setErrors(boolean errors) { + this.errors = errors; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append("REJECT LIMIT "); + if (limit != null) { + sql.append(limit); + } else { + sql.append("UNLIMITED"); + } + + if (errors) { + sql.append(" ERRORS"); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java index efd7ee099..e2a84fa1f 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java @@ -28,6 +28,7 @@ import net.sf.jsqlparser.statement.drop.Drop; import net.sf.jsqlparser.statement.execute.Execute; import net.sf.jsqlparser.statement.grant.Grant; +import net.sf.jsqlparser.statement.imprt.Import; import net.sf.jsqlparser.statement.insert.Insert; import net.sf.jsqlparser.statement.insert.ParenthesedInsert; import net.sf.jsqlparser.statement.merge.Merge; @@ -324,4 +325,9 @@ default void visit(ParenthesedDelete parenthesedDelete) { this.visit(parenthesedDelete, null); } + T visit(Import imprt, S context); + + default void visit(Import imprt) { + this.visit(imprt, null); + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/UserIdentification.java b/src/main/java/net/sf/jsqlparser/statement/UserIdentification.java new file mode 100644 index 000000000..43a8d3f4b --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/UserIdentification.java @@ -0,0 +1,46 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.StringValue; + +public class UserIdentification { + private StringValue user; + private StringValue password; + + public StringValue getUser() { + return user; + } + + public void setUser(StringValue user) { + this.user = user; + } + + public StringValue getPassword() { + return password; + } + + public void setPassword(StringValue password) { + this.password = password; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append("USER "); + sql.append(user); + + sql.append(" IDENTIFIED BY "); + sql.append(password); + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/create/table/ColumnDefinition.java b/src/main/java/net/sf/jsqlparser/statement/create/table/ColumnDefinition.java index 90a0e0e40..a7f47104c 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/table/ColumnDefinition.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/table/ColumnDefinition.java @@ -9,6 +9,7 @@ */ package net.sf.jsqlparser.statement.create.table; +import net.sf.jsqlparser.statement.imprt.ImportColumn; import net.sf.jsqlparser.statement.select.PlainSelect; import java.io.Serializable; @@ -21,7 +22,7 @@ /** * Globally used definition class for columns. */ -public class ColumnDefinition implements Serializable { +public class ColumnDefinition implements ImportColumn, Serializable { private String columnName; private ColDataType colDataType; diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java b/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java new file mode 100644 index 000000000..85631d8a4 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java @@ -0,0 +1,103 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.imprt; + +import net.sf.jsqlparser.expression.StringValue; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.ConnectionDefinition; +import net.sf.jsqlparser.statement.select.PlainSelect; + +import javax.sql.DataSource; +import java.io.Serializable; +import java.util.List; + +public class DBMSSource implements ImportFromItem, Serializable { + private DataSource dataSource; + private StringValue jdbcDriverDefinition; + private ConnectionDefinition connectionDefinition; + private Table table; + private ExpressionList columns; + private List statements; + + public DataSource getDataSource() { + return dataSource; + } + + public void setDataSource(DataSource dataSource) { + this.dataSource = dataSource; + } + + public StringValue getJdbcDriverDefinition() { + return jdbcDriverDefinition; + } + + public void setJdbcDriverDefinition(StringValue jdbcDriverDefinition) { + this.jdbcDriverDefinition = jdbcDriverDefinition; + } + + public ConnectionDefinition getConnectionDefinition() { + return connectionDefinition; + } + + public void setConnectionDefinition(ConnectionDefinition connectionDefinition) { + this.connectionDefinition = connectionDefinition; + } + + public Table getTable() { + return table; + } + + public void setTable(Table table) { + this.table = table; + } + + public ExpressionList getColumns() { + return columns; + } + + public void setColumns(ExpressionList columns) { + this.columns = columns; + } + + public List getStatements() { + return statements; + } + + public void setStatements(List statements) { + this.statements = statements; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append(dataSource); + + if(jdbcDriverDefinition != null) { + sql.append(" DRIVER = ").append(jdbcDriverDefinition); + } + + sql.append(" "); + sql.append(connectionDefinition); + + if(table != null) { + sql.append(" TABLE ").append(table); + PlainSelect.appendStringListTo(sql, columns, true, true); + } else if (statements != null) { + for(StringValue statement : statements) { + sql.append(" STATEMENT ").append(statement); + } + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/DataSource.java b/src/main/java/net/sf/jsqlparser/statement/imprt/DataSource.java new file mode 100644 index 000000000..5ee393e84 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/DataSource.java @@ -0,0 +1,19 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.imprt; + +public enum DataSource { + EXA, + ORA, + JDBC, + CSV, + FBV, + SCRIPT +} diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java b/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java new file mode 100644 index 000000000..3a2a5e563 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java @@ -0,0 +1,63 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.imprt; + +import net.sf.jsqlparser.expression.StringValue; +import net.sf.jsqlparser.statement.*; +import net.sf.jsqlparser.statement.select.PlainSelect; + +import java.io.Serializable; +import java.util.List; + +public class FileSource implements ImportFromItem, Serializable { + private DataSource dataSource; + private ConnectionDefinition connectionDefinition; + private List connectionFileDefinitions; + private Boolean local; + private Boolean secure; + private List csvColumns; + private List fbvColumns; + private List fileOptions; + private CertificateVerification certificateVerification; + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + if (local != null) { + if (local) { + sql.append("LOCAL "); + } + + if (secure) { + sql.append("SECURE "); + } + } + + sql.append(dataSource); + PlainSelect.appendStringListTo(sql, connectionFileDefinitions, false, false); + + if (csvColumns != null) { + PlainSelect.appendStringListTo(sql, csvColumns, true, true); + } else if (fbvColumns != null) { + PlainSelect.appendStringListTo(sql, fbvColumns, false, true); + } + + if (fileOptions != null) { + PlainSelect.appendStringListTo(sql, fileOptions, false, false); + } + + if(certificateVerification != null) { + sql.append(certificateVerification); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java b/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java new file mode 100644 index 000000000..73385144d --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java @@ -0,0 +1,51 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.imprt; + +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.StatementVisitor; +import net.sf.jsqlparser.statement.select.PlainSelect; + +import java.util.List; + +public class Import implements Statement { + private Table intoTable; + private ExpressionList columnList; + private List importColumns; + private ImportFromItem fromItem; + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + sql.append("IMPORT "); + if (intoTable != null || importColumns != null) { + sql.append("INTO "); + if (intoTable != null) { + sql.append(intoTable); + PlainSelect.appendStringListTo(sql, columnList, true, true); + } else { + PlainSelect.appendStringListTo(sql, importColumns, true, true); + } + } + + sql.append(" FROM "); + sql.append(fromItem); + + return sql.toString(); + } + + @Override + public T accept(StatementVisitor statementVisitor, S context) { + return statementVisitor.visit(this, context); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/ImportColumn.java b/src/main/java/net/sf/jsqlparser/statement/imprt/ImportColumn.java new file mode 100644 index 000000000..2a7698d6a --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/ImportColumn.java @@ -0,0 +1,13 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.imprt; + +public interface ImportColumn { +} diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java b/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java new file mode 100644 index 000000000..7680158f9 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java @@ -0,0 +1,13 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.imprt; + +public interface ImportFromItem { +} diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/ScriptSource.java b/src/main/java/net/sf/jsqlparser/statement/imprt/ScriptSource.java new file mode 100644 index 000000000..18f016066 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/ScriptSource.java @@ -0,0 +1,83 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.imprt; + +import net.sf.jsqlparser.expression.StringValue; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.ConnectionDefinition; + +import java.io.Serializable; +import java.util.List; + +public class ScriptSource implements ImportFromItem, Serializable { + private Table script; + private ConnectionDefinition connectionDefinition; + private List properties; + private List values; + + public Table getScript() { + return script; + } + + public void setScript(Table script) { + this.script = script; + } + + public ConnectionDefinition getConnectionDefinition() { + return connectionDefinition; + } + + public void setConnectionDefinition(ConnectionDefinition connectionDefinition) { + this.connectionDefinition = connectionDefinition; + } + + public List getProperties() { + return properties; + } + + public void setProperties(List properties) { + this.properties = properties; + } + + public List getValues() { + return values; + } + + public void setValues(List values) { + this.values = values; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append("SCRIPT "); + sql.append(script); + + if (connectionDefinition != null) { + sql.append(" "); + sql.append(connectionDefinition); + } + + if (properties != null && values != null) { + sql.append(" WITH"); + + int max = Math.min(properties.size(), values.size()); + for (int i = 0; i < max; i++) { + sql.append(" "); + sql.append(properties.get(i)); + sql.append(" = "); + sql.append(values.get(i)); + } + } + + return sql.toString(); + } +} diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 6d260a9b1..8bcb74124 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -866,6 +866,8 @@ Statement SingleStatement() : stm = Grant() | stm = PurgeStatement() + | + stm = Import() ) { return stm; } } @@ -1096,11 +1098,11 @@ Import Import(): { ( table = Table() { impt.setTable(table); } - columns = ParenthesedColumnList() { impt.setColumns(columns); } + [ columns = ParenthesedColumnList() { impt.setColumns(columns); } ] | "(" ( - columnDefinition = ColumnDefinition() { importColumn = new ImportColumn(columnDefinition); } - | likeClause = LikeClause() { importColumn = new ImportColumn(likeClause); } + importColumn = ColumnDefinition() + | importColumn = LikeClause() ) { importColumns = new ArrayList(); @@ -1110,12 +1112,10 @@ Import Import(): { ( "," ( - columnDefinition = ColumnDefinition() { importColumn = new ImportColumn(columnDefinition); } - | likeClause = LikeClause() { importColumn = new ImportColumn(likeClause); } + importColumn = ColumnDefinition() + | importColumn = LikeClause() ) - { - importColumns.add(importColumn); - } + { importColumns.add(importColumn); } )* ")" ) @@ -1193,9 +1193,7 @@ DBMSSource DBMSSource() #DBMSSource: { FileSource FileSource() #FileSource: { FileSource fileSource = new FileSource(); ConnectionDefinition connectionDefinition; - List fileDefinitions; - List csvColumns; - List fbvColumns; + List filePaths; List fileOptions; CertificateVerification certificateVerification; @@ -1217,23 +1215,23 @@ FileSource FileSource() #FileSource: { ) token = { - fileDefinitions = new ArrayList(); + filePaths = new ArrayList(); StringValue stringVal = new StringValue(token.image); linkAST(stringVal, jjtThis); - fileDefinitions.add(stringVal); + filePaths.add(stringVal); } ( token = { StringValue stringVal = new StringValue(token.image); linkAST(stringVal, jjtThis); - fileDefinitions.add(stringVal); + filePaths.add(stringVal); } )* ) { connectionFileDefinitions = new ArrayList(); - connectionFileDefinitions.add(new ConnectionFileDefinition(connectionDefinition, fileDefinitions)); + connectionFileDefinitions.add(new ConnectionFileDefinition(connectionDefinition, filePaths)); } ( @@ -1244,21 +1242,21 @@ FileSource FileSource() #FileSource: { ) token = { - fileDefinitions = new ArrayList(); + filePaths = new ArrayList(); StringValue stringVal = new StringValue(token.image); linkAST(stringVal, jjtThis); - fileDefinitions.add(stringVal); + filePaths.add(stringVal); } ( token = { stringVal = new StringValue(token.image); linkAST(stringVal, jjtThis); - fileDefinitions.add(stringVal); + filePaths.add(stringVal); } )* ) - { connectionFileDefinitions.add(new ConnectionFileDefinition(connectionDefinition, fileDefinitions)); } + { connectionFileDefinitions.add(new ConnectionFileDefinition(connectionDefinition, filePaths)); } )* ) | ( @@ -1273,21 +1271,21 @@ FileSource FileSource() #FileSource: { ( token = { - fileDefinitions = new ArrayList(); + filePaths = new ArrayList(); StringValue stringVal = new StringValue(token.image); linkAST(stringVal, jjtThis); - fileDefinitions.add(stringVal); + filePaths.add(stringVal); } ( token = { stringVal = new StringValue(token.image); linkAST(stringVal, jjtThis); - fileDefinitions.add(stringVal); + filePaths.add(stringVal); } )* ) - { connectionFileDefinitions.add(new ConnectionFileDefinition(fileDefinitions)); } + { connectionFileDefinitions.add(new ConnectionFileDefinition(filePaths)); } ) ) { fileSource.setConnectionFileDefinitions(connectionFileDefinitions); } @@ -1300,14 +1298,14 @@ FileSource FileSource() #FileSource: { token= ".." token2= - { CSVColumns csvColumns = new CSVColumns(Long.parseLong(token.image), Long.parseLong(token2.image)); } - | token= { CSVColumns csvColumns = new CSVColumns(Long.parseLong(token.image)); } - [ "=" token = { csvColumns.setFormat(new StringValue(token.image)); }] + { CSVColumn csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); } + | token= { CSVColumn csvColumn = new CSVColumn(Long.valueOf(token.image)); } + [ "=" token = { csvColumn.setFormat(new StringValue(token.image)); }] ) { - List csvColumnsList = new ArrayList(); - fileSource.setCSVColumnsList(csvColumnsList); - csvColumnsList.add(csvColumns); + List csvColumns = new ArrayList(); + fileSource.setCSVColumns(csvColumns); + csvColumns.add(csvColumn); } ( "," @@ -1315,12 +1313,12 @@ FileSource FileSource() #FileSource: { token= ".." token2= - { csvColumns = new CSVColumns(Long.parseLong(token.image), Long.parseLong(token2.image)); } - | token= { csvColumns = new CSVColumns(Long.parseLong(token.image)); } - [ "=" token = { csvColumns.setFormat(new StringValue(token.image)); }] + { csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); } + | token= { csvColumn = new CSVColumn(Long.valueOf(token.image)); } + [ "=" token = { csvColumn.setFormat(new StringValue(token.image)); }] ) { - csvColumnsList.add(csvColumns); + csvColumns.add(csvColumn); } )* ) @@ -1330,24 +1328,24 @@ FileSource FileSource() #FileSource: { token= | token= ) "=" token2= - { FBVColumns fbvColumns = new FBVColumns(token.image, new LongValue(token2.image)); } + { FBVColumn fbvColumn = new FBVColumn(token.image, new LongValue(token2.image)); } | ( token= | token= ) "=" token2= - { FBVColumns fbvColumns = new FBVColumns(token.image, new StringValue(token2.image)); } + { FBVColumn fbvColumn = new FBVColumn(token.image, new StringValue(token2.image)); } | token= "=" ( token2= | token2= ) - { FBVColumns fbvColumns = new FBVColumns(token.image, new StringValue(token2.image)); } + { FBVColumn fbvColumn = new FBVColumn(token.image, new StringValue(token2.image)); } ) { - List fbvColumnsList = new ArrayList(); - fileSource.setFBVColumnsList(fbvColumnsList); - fbvColumnsList.add(fbvColumns); + List fbvColumns = new ArrayList(); + fileSource.setFBVColumns(fbvColumns); + fbvColumns.add(fbvColumn); } ) ( @@ -1358,23 +1356,23 @@ FileSource FileSource() #FileSource: { token= | token= ) "=" token2= - { fbvColumns = new FBVColumns(token.image, new LongValue(token2.image)); } + { fbvColumn = new FBVColumn(token.image, new LongValue(token2.image)); } | ( token= | token= ) "=" token2= - { fbvColumns = new FBVColumns(token.image, new StringValue(token2.image)); } + { fbvColumn = new FBVColumn(token.image, new StringValue(token2.image)); } | token= "=" ( token2= | token2= ) - { fbvColumns = new FBVColumns(token.image, new StringValue(token2.image)); } + { fbvColumn = new FBVColumn(token.image, new StringValue(token2.image)); } ) { - fbvColumns.setPrecedesComma(precedesComma); - fbvColumnsList.add(fbvColumns); + fbvColumn.setPrecedesComma(precedesComma); + fbvColumns.add(fbvColumn); } )* ) @@ -1553,7 +1551,7 @@ ErrorClause ErrorClause(): { ErrorClause errorClause = new ErrorClause(); ErrorDestination errorDestination; Expression expression; - RejectLimit rejectLimit; + RejectClause rejectClause; Token token; } { @@ -1568,27 +1566,27 @@ ErrorClause ErrorClause(): { { errorClause.setReplace(true); } | { errorClause.setTruncate(true); } ] - [ rejectLimit = RejectLimit() { errorClause.setRejectLimit(rejectLimit); } ] - | rejectLimit = RejectLimit() { errorClause.setRejectLimit(rejectLimit); } + [ rejectClause = RejectClause() { errorClause.setRejectClause(rejectClause); } ] + | rejectClause = RejectClause() { errorClause.setRejectClause(rejectClause); } { return errorClause; } } -RejectLimit RejectLimit(): { - RejectLimit rejectLimit = new RejectLimit(); +RejectClause RejectClause(): { + RejectClause rejectClause = new RejectClause(); } { ( - token= { rejectLimit.setLimit(new LongValue(token.image)); } + token= { rejectClause.setLimit(new LongValue(token.image)); } | ) - [ { rejectLimit.setErrors(true); } ] + [ { rejectClause.setErrors(true); } ] { - return rejectLimit; + return rejectClause; } } @@ -1597,7 +1595,6 @@ ErrorDestination ErrorDestination(): { } { ( errorDestination = CSVFileDestination() - | errorDestination = LocalCSVFileDestination() | errorDestination = Table() ) @@ -1611,36 +1608,26 @@ CSVFileDestination CSVFileDestination(): { ConnectionDefinition connectionDefinition; Token token; } { - ( - connectionDefinition = ConnectionDefinition() - | connectionDefinition = CloudConnectionDefinition() + + ( + connectionDefinition = ConnectionDefinition() + | connectionDefinition = CloudConnectionDefinition() + ) + { csvFileDestination.setConnectionDefinition(connectionDefinition); } + | { csvFileDestination.setLocal(true); } + [ { csvFileDestination.setSecure(true); } ] + ) - { csvFileDestination.setConnectionDefinition(connectionDefinition); } - token = { csvFileDestination.setFile(new StringValue(token.image)); } + token = { csvFileDestination.setFilePath(new StringValue(token.image)); } { return csvFileDestination; } } - -LocalCSVFileDestination LocalCSVFileDestination(): { - LocalCSVFileDestination localCSVFileDestination = new LocalCSVFileDestination(); - Token token; -} { - - [ { localCSVFileDestination.setSecure(true); } ] - - token = { localCSVFileDestination.setFile(new StringValue(token.image)); } - - { - return localCSVFileDestination; - } -} - DeclareStatement Declare(): { UserVariable userVariable; ColDataType colDataType; From e1a74e1f941accb3e5a96564c43fcf20df5f7909 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Tue, 4 Feb 2025 14:34:37 +0100 Subject: [PATCH 04/27] feat: Add LOOKAHEADs for IMPORT statement --- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 8bcb74124..2b7c33551 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1054,6 +1054,7 @@ LikeClause LikeClause(): { [columnsList = ColumnSelectItemsList() { likeClause.setColumnsList(columnsList); }] [ + LOOKAHEAD(2) ( { likeClause.setIncludingDefaults(true); } | { likeClause.setExcludingDefaults(true); } @@ -1062,6 +1063,7 @@ LikeClause LikeClause(): { ] [ + LOOKAHEAD(2) ( { likeClause.setIncludingIdentity(true); } | { likeClause.setExcludingIdentity(true); } @@ -1070,6 +1072,7 @@ LikeClause LikeClause(): { ] [ + LOOKAHEAD(2) ( { likeClause.setIncludingComments(true); } | { likeClause.setExcludingComments(true); } @@ -1167,7 +1170,7 @@ DBMSSource DBMSSource() #DBMSSource: { ( table = Table() { dbmsSource.setTable(table); } - [ columns = ParenthesedColumnList() { dbmsSource.setColumns(columns); } ] + [ LOOKAHEAD(2) columns = ParenthesedColumnList() { dbmsSource.setColumns(columns); } ] | token = { statements = new ArrayList(); @@ -1210,7 +1213,7 @@ FileSource FileSource() #FileSource: { ( ( - connectionDefinition = ConnectionDefinition() + LOOKAHEAD(2) connectionDefinition = ConnectionDefinition() | connectionDefinition = CloudConnectionDefinition() ) token = @@ -1237,7 +1240,7 @@ FileSource FileSource() #FileSource: { ( ( ( - connectionDefinition = ConnectionDefinition() + LOOKAHEAD(2) connectionDefinition = ConnectionDefinition() | connectionDefinition = CloudConnectionDefinition() ) token = @@ -1291,10 +1294,12 @@ FileSource FileSource() #FileSource: { { fileSource.setConnectionFileDefinitions(connectionFileDefinitions); } [ + LOOKAHEAD(2) "(" ( ( ( + LOOKAHEAD(2) token= ".." token2= @@ -1310,6 +1315,7 @@ FileSource FileSource() #FileSource: { ( "," ( + LOOKAHEAD(2) token= ".." token2= @@ -1401,7 +1407,8 @@ FileSource FileSource() #FileSource: { | token= "=" token2= { FileOption fileOption = new FileOption(token.image, new LongValue(token2.image)); } ) - | ( + | LOOKAHEAD(2) + ( token= token2= "=" token3= | token= ( @@ -1458,7 +1465,8 @@ ScriptSource ScriptSource(): { [ connectionDefinition = ConnectionDefinition() { scriptSource.setConnectionDefinition(connectionDefinition); } ] - [ + [ + LOOKAHEAD(2) { List properties = new ArrayList(); List values = new ArrayList(); @@ -1468,6 +1476,7 @@ ScriptSource ScriptSource(): { ( + LOOKAHEAD(2) ( property = RelObjectNameWithoutValue() "=" @@ -1558,13 +1567,17 @@ ErrorClause ErrorClause(): { errorDestination = ErrorDestination() { errorClause.setErrorDestination(errorDestination); } [ + LOOKAHEAD(2) "(" expression = Expression() { errorClause.setExpression(expression); } ")" ] [ - { errorClause.setReplace(true); } - | { errorClause.setTruncate(true); } + LOOKAHEAD(2) + ( + { errorClause.setReplace(true); } + | { errorClause.setTruncate(true); } + ) ] [ rejectClause = RejectClause() { errorClause.setRejectClause(rejectClause); } ] | rejectClause = RejectClause() { errorClause.setRejectClause(rejectClause); } @@ -1594,7 +1607,7 @@ ErrorDestination ErrorDestination(): { ErrorDestination errorDestination; } { ( - errorDestination = CSVFileDestination() + LOOKAHEAD(2) errorDestination = CSVFileDestination() | errorDestination = Table() ) @@ -1611,7 +1624,7 @@ CSVFileDestination CSVFileDestination(): { ( ( - connectionDefinition = ConnectionDefinition() + LOOKAHEAD(2) connectionDefinition = ConnectionDefinition() | connectionDefinition = CloudConnectionDefinition() ) { csvFileDestination.setConnectionDefinition(connectionDefinition); } From 711200d73a67402471397b9c7b31f6dac0ec9e54 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Tue, 4 Feb 2025 16:11:24 +0100 Subject: [PATCH 05/27] fix: Fix issues in IMPORT implementation --- src/main/java/module-info.java | 1 + .../sf/jsqlparser/parser/feature/Feature.java | 5 + .../statement/CertificateVerification.java | 9 ++ .../statement/ConnectionFileDefinition.java | 5 +- .../sf/jsqlparser/statement/LikeClause.java | 24 ++++ .../sf/jsqlparser/statement/RejectClause.java | 8 +- .../statement/StatementVisitorAdapter.java | 6 + .../statement/imprt/DBMSSource.java | 13 +- .../statement/imprt/FileSource.java | 74 +++++++++- .../sf/jsqlparser/statement/imprt/Import.java | 44 +++++- .../statement/imprt/ImportFromItem.java | 13 +- .../statement/imprt/ScriptSource.java | 6 +- .../sf/jsqlparser/util/TablesNamesFinder.java | 7 + .../util/deparser/StatementDeParser.java | 7 + .../validator/StatementValidator.java | 12 +- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 126 +++++++++--------- 16 files changed, 277 insertions(+), 83 deletions(-) diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 66fe1cb80..adc2c103a 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -36,6 +36,7 @@ exports net.sf.jsqlparser.statement.drop; exports net.sf.jsqlparser.statement.execute; exports net.sf.jsqlparser.statement.grant; + exports net.sf.jsqlparser.statement.imprt; exports net.sf.jsqlparser.statement.insert; exports net.sf.jsqlparser.statement.merge; exports net.sf.jsqlparser.statement.refresh; diff --git a/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java b/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java index 75b5c78a5..dc276dfe0 100644 --- a/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java +++ b/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java @@ -792,6 +792,11 @@ public enum Feature { * allows sub selects without parentheses, e.g. `select * from dual where 1 = select 1` */ allowUnparenthesizedSubSelects(false), + + /** + * "IMPORT" + */ + imprt, ; private final Object value; diff --git a/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java b/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java index 79c8131ae..d98de7d4b 100644 --- a/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java +++ b/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java @@ -1,3 +1,12 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2025 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ package net.sf.jsqlparser.statement; import net.sf.jsqlparser.expression.StringValue; diff --git a/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java b/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java index 80ce50cb0..eb81bee3d 100644 --- a/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java +++ b/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java @@ -10,7 +10,6 @@ package net.sf.jsqlparser.statement; import net.sf.jsqlparser.expression.StringValue; -import net.sf.jsqlparser.statement.select.PlainSelect; import java.util.List; @@ -18,6 +17,10 @@ public class ConnectionFileDefinition { private ConnectionDefinition connectionDefinition; private List filePaths; + public ConnectionFileDefinition(List filePaths) { + this(null, filePaths); + } + public ConnectionFileDefinition(ConnectionDefinition connectionDefinition, List filePaths) { this.connectionDefinition = connectionDefinition; this.filePaths = filePaths; diff --git a/src/main/java/net/sf/jsqlparser/statement/LikeClause.java b/src/main/java/net/sf/jsqlparser/statement/LikeClause.java index d55df471a..05c3dc420 100644 --- a/src/main/java/net/sf/jsqlparser/statement/LikeClause.java +++ b/src/main/java/net/sf/jsqlparser/statement/LikeClause.java @@ -56,6 +56,14 @@ public void setIncludingDefaults(Boolean includingDefaults) { this.includingDefaults = includingDefaults; } + public Boolean isExcludingDefaults() { + return includingDefaults == null ? null : !includingDefaults; + } + + public void setExcludingDefaults(Boolean excludingDefaults) { + this.includingDefaults = !excludingDefaults; + } + public Boolean isIncludingIdentity() { return includingIdentity; } @@ -64,6 +72,14 @@ public void setIncludingIdentity(Boolean includingIdentity) { this.includingIdentity = includingIdentity; } + public Boolean isExcludingIdentity() { + return includingIdentity == null ? null : !includingIdentity; + } + + public void setExcludingIdentity(Boolean excludingIdentity) { + this.includingIdentity = !excludingIdentity; + } + public Boolean isIncludingComments() { return includingComments; } @@ -72,6 +88,14 @@ public void setIncludingComments(Boolean includingComments) { this.includingComments = includingComments; } + public Boolean isExcludingComments() { + return includingComments == null ? null : !includingComments; + } + + public void setExcludingComments(Boolean excludingComments) { + this.includingComments = !excludingComments; + } + public StringBuilder appendTo(StringBuilder builder) { builder.append(" LIKE "); builder.append(table); diff --git a/src/main/java/net/sf/jsqlparser/statement/RejectClause.java b/src/main/java/net/sf/jsqlparser/statement/RejectClause.java index 455f8949b..0816425d8 100644 --- a/src/main/java/net/sf/jsqlparser/statement/RejectClause.java +++ b/src/main/java/net/sf/jsqlparser/statement/RejectClause.java @@ -9,15 +9,17 @@ */ package net.sf.jsqlparser.statement; +import net.sf.jsqlparser.expression.LongValue; + public class RejectClause { - private Long limit; + private LongValue limit; private boolean errors; - public Long getLimit() { + public LongValue getLimit() { return limit; } - public void setLimit(Long limit) { + public void setLimit(LongValue limit) { this.limit = limit; } diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java index 0e6ab8698..2e2015773 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java @@ -28,6 +28,7 @@ import net.sf.jsqlparser.statement.drop.Drop; import net.sf.jsqlparser.statement.execute.Execute; import net.sf.jsqlparser.statement.grant.Grant; +import net.sf.jsqlparser.statement.imprt.Import; import net.sf.jsqlparser.statement.insert.Insert; import net.sf.jsqlparser.statement.insert.ParenthesedInsert; import net.sf.jsqlparser.statement.merge.Merge; @@ -308,4 +309,9 @@ public T visit(UnsupportedStatement unsupportedStatement, S context) { public T visit(RefreshMaterializedViewStatement materializedView, S context) { return null; } + + @Override + public T visit(Import imprt, S context) { + return null; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java b/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java index 85631d8a4..4f1b6d6d9 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java @@ -16,11 +16,10 @@ import net.sf.jsqlparser.statement.ConnectionDefinition; import net.sf.jsqlparser.statement.select.PlainSelect; -import javax.sql.DataSource; import java.io.Serializable; import java.util.List; -public class DBMSSource implements ImportFromItem, Serializable { +public class DBMSSource extends ImportFromItem implements Serializable { private DataSource dataSource; private StringValue jdbcDriverDefinition; private ConnectionDefinition connectionDefinition; @@ -82,22 +81,26 @@ public String toString() { sql.append(dataSource); - if(jdbcDriverDefinition != null) { + if (jdbcDriverDefinition != null) { sql.append(" DRIVER = ").append(jdbcDriverDefinition); } sql.append(" "); sql.append(connectionDefinition); - if(table != null) { + if (table != null) { sql.append(" TABLE ").append(table); PlainSelect.appendStringListTo(sql, columns, true, true); } else if (statements != null) { - for(StringValue statement : statements) { + for (StringValue statement : statements) { sql.append(" STATEMENT ").append(statement); } } + if (errorClause != null) { + sql.append(errorClause); + } + return sql.toString(); } } diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java b/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java index 3a2a5e563..9dd399fb6 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java @@ -9,16 +9,14 @@ */ package net.sf.jsqlparser.statement.imprt; -import net.sf.jsqlparser.expression.StringValue; import net.sf.jsqlparser.statement.*; import net.sf.jsqlparser.statement.select.PlainSelect; import java.io.Serializable; import java.util.List; -public class FileSource implements ImportFromItem, Serializable { +public class FileSource extends ImportFromItem implements Serializable { private DataSource dataSource; - private ConnectionDefinition connectionDefinition; private List connectionFileDefinitions; private Boolean local; private Boolean secure; @@ -27,6 +25,70 @@ public class FileSource implements ImportFromItem, Serializable { private List fileOptions; private CertificateVerification certificateVerification; + public DataSource getDataSource() { + return dataSource; + } + + public void setDataSource(DataSource dataSource) { + this.dataSource = dataSource; + } + + public List getConnectionFileDefinitions() { + return connectionFileDefinitions; + } + + public void setConnectionFileDefinitions(List connectionFileDefinitions) { + this.connectionFileDefinitions = connectionFileDefinitions; + } + + public Boolean isLocal() { + return local; + } + + public void setLocal(Boolean local) { + this.local = local; + } + + public Boolean isSecure() { + return secure; + } + + public void setSecure(Boolean secure) { + this.secure = secure; + } + + public List getCSVColumns() { + return csvColumns; + } + + public void setCSVColumns(List csvColumns) { + this.csvColumns = csvColumns; + } + + public List getFBVColumns() { + return fbvColumns; + } + + public void setFBVColumns(List fbvColumns) { + this.fbvColumns = fbvColumns; + } + + public List getFileOptions() { + return fileOptions; + } + + public void setFileOptions(List fileOptions) { + this.fileOptions = fileOptions; + } + + public CertificateVerification getCertificateVerification() { + return certificateVerification; + } + + public void setCertificateVerification(CertificateVerification certificateVerification) { + this.certificateVerification = certificateVerification; + } + @Override public String toString() { StringBuilder sql = new StringBuilder(); @@ -54,10 +116,14 @@ public String toString() { PlainSelect.appendStringListTo(sql, fileOptions, false, false); } - if(certificateVerification != null) { + if (certificateVerification != null) { sql.append(certificateVerification); } + if (errorClause != null) { + sql.append(errorClause); + } + return sql.toString(); } } diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java b/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java index 73385144d..a9da50da2 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java @@ -19,20 +19,52 @@ import java.util.List; public class Import implements Statement { - private Table intoTable; - private ExpressionList columnList; + private Table table; + private ExpressionList columns; private List importColumns; private ImportFromItem fromItem; + public Table getTable() { + return table; + } + + public void setTable(Table table) { + this.table = table; + } + + public ExpressionList getColumns() { + return columns; + } + + public void setColumns(ExpressionList columns) { + this.columns = columns; + } + + public List getImportColumns() { + return importColumns; + } + + public void setImportColumns(List importColumns) { + this.importColumns = importColumns; + } + + public ImportFromItem getFromItem() { + return fromItem; + } + + public void setFromItem(ImportFromItem fromItem) { + this.fromItem = fromItem; + } + @Override public String toString() { StringBuilder sql = new StringBuilder(); sql.append("IMPORT "); - if (intoTable != null || importColumns != null) { + if (table != null || importColumns != null) { sql.append("INTO "); - if (intoTable != null) { - sql.append(intoTable); - PlainSelect.appendStringListTo(sql, columnList, true, true); + if (table != null) { + sql.append(table); + PlainSelect.appendStringListTo(sql, columns, true, true); } else { PlainSelect.appendStringListTo(sql, importColumns, true, true); } diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java b/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java index 7680158f9..d05f3bd01 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java @@ -9,5 +9,16 @@ */ package net.sf.jsqlparser.statement.imprt; -public interface ImportFromItem { +import net.sf.jsqlparser.statement.ErrorClause; + +public abstract class ImportFromItem { + protected ErrorClause errorClause; + + public ErrorClause getErrorClause() { + return errorClause; + } + + public void setErrorClause(ErrorClause errorClause) { + this.errorClause = errorClause; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/ScriptSource.java b/src/main/java/net/sf/jsqlparser/statement/imprt/ScriptSource.java index 18f016066..8f35d0f4c 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/ScriptSource.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/ScriptSource.java @@ -16,7 +16,7 @@ import java.io.Serializable; import java.util.List; -public class ScriptSource implements ImportFromItem, Serializable { +public class ScriptSource extends ImportFromItem implements Serializable { private Table script; private ConnectionDefinition connectionDefinition; private List properties; @@ -78,6 +78,10 @@ public String toString() { } } + if (errorClause != null) { + sql.append(errorClause); + } + return sql.toString(); } } diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java index 3025aca3f..7147c008f 100644 --- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java +++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java @@ -157,6 +157,7 @@ import net.sf.jsqlparser.statement.drop.Drop; import net.sf.jsqlparser.statement.execute.Execute; import net.sf.jsqlparser.statement.grant.Grant; +import net.sf.jsqlparser.statement.imprt.Import; import net.sf.jsqlparser.statement.insert.Insert; import net.sf.jsqlparser.statement.insert.ParenthesedInsert; import net.sf.jsqlparser.statement.merge.Merge; @@ -1821,4 +1822,10 @@ public Void visit(GeometryDistance geometryDistance, S context) { return null; } + @Override + public Void visit(Import imprt, S context) { + throwUnsupported(imprt); + return null; + } + } 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 cd16843fc..390f45de3 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java @@ -52,6 +52,7 @@ import net.sf.jsqlparser.statement.drop.Drop; import net.sf.jsqlparser.statement.execute.Execute; import net.sf.jsqlparser.statement.grant.Grant; +import net.sf.jsqlparser.statement.imprt.Import; import net.sf.jsqlparser.statement.insert.Insert; import net.sf.jsqlparser.statement.insert.ParenthesedInsert; import net.sf.jsqlparser.statement.merge.Merge; @@ -492,4 +493,10 @@ public ExpressionDeParser getExpressionDeParser() { public SelectDeParser getSelectDeParser() { return selectDeParser; } + + @Override + public StringBuilder visit(Import imprt, S context) { + buffer.append(imprt.toString()); + return buffer; + } } diff --git a/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java b/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java index 0e7f25a2e..7ba145fba 100644 --- a/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java +++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java @@ -50,6 +50,7 @@ import net.sf.jsqlparser.statement.drop.Drop; import net.sf.jsqlparser.statement.execute.Execute; import net.sf.jsqlparser.statement.grant.Grant; +import net.sf.jsqlparser.statement.imprt.Import; import net.sf.jsqlparser.statement.insert.Insert; import net.sf.jsqlparser.statement.insert.ParenthesedInsert; import net.sf.jsqlparser.statement.merge.Merge; @@ -70,7 +71,6 @@ */ public class StatementValidator extends AbstractValidator implements StatementVisitor { - @Override public Void visit(CreateIndex createIndex, S context) { getValidator(CreateIndexValidator.class).validate(createIndex); @@ -379,6 +379,12 @@ public Void visit(UnsupportedStatement unsupportedStatement, S context) { return null; } + @Override + public Void visit(Import imprt, S context) { + // TODO: not yet implemented + return null; + } + public void visit(CreateIndex createIndex) { visit(createIndex, null); } @@ -555,4 +561,8 @@ public void visit(UnsupportedStatement unsupportedStatement) { visit(unsupportedStatement, null); } + public void visit(Import imprt) { + visit(imprt, null); + } + } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 2b7c33551..3cfc74eb4 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -66,6 +66,7 @@ import net.sf.jsqlparser.statement.update.*; import net.sf.jsqlparser.statement.upsert.*; import net.sf.jsqlparser.statement.merge.*; import net.sf.jsqlparser.statement.grant.*; +import net.sf.jsqlparser.statement.imprt.*; import java.util.*; import java.util.AbstractMap.SimpleEntry; @@ -1182,7 +1183,7 @@ DBMSSource DBMSSource() #DBMSSource: { ( token = { - StringValue stringValue = new StringValue(token.image); + stringValue = new StringValue(token.image); linkAST(stringValue, jjtThis); statements.add(stringValue); } @@ -1196,8 +1197,8 @@ DBMSSource DBMSSource() #DBMSSource: { FileSource FileSource() #FileSource: { FileSource fileSource = new FileSource(); ConnectionDefinition connectionDefinition; + List connectionFileDefinitions = new ArrayList(); List filePaths; - List fileOptions; CertificateVerification certificateVerification; Token token = null; @@ -1226,16 +1227,13 @@ FileSource FileSource() #FileSource: { ( token = { - StringValue stringVal = new StringValue(token.image); + stringVal = new StringValue(token.image); linkAST(stringVal, jjtThis); filePaths.add(stringVal); } )* ) - { - connectionFileDefinitions = new ArrayList(); - connectionFileDefinitions.add(new ConnectionFileDefinition(connectionDefinition, filePaths)); - } + { connectionFileDefinitions.add(new ConnectionFileDefinition(connectionDefinition, filePaths)); } ( ( @@ -1246,7 +1244,7 @@ FileSource FileSource() #FileSource: { token = { filePaths = new ArrayList(); - StringValue stringVal = new StringValue(token.image); + stringVal = new StringValue(token.image); linkAST(stringVal, jjtThis); filePaths.add(stringVal); } @@ -1298,13 +1296,14 @@ FileSource FileSource() #FileSource: { "(" ( ( + { CSVColumn csvColumn; } ( LOOKAHEAD(2) token= ".." token2= - { CSVColumn csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); } - | token= { CSVColumn csvColumn = new CSVColumn(Long.valueOf(token.image)); } + { csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); } + | token= { csvColumn = new CSVColumn(Long.valueOf(token.image)); } [ "=" token = { csvColumn.setFormat(new StringValue(token.image)); }] ) { @@ -1319,34 +1318,33 @@ FileSource FileSource() #FileSource: { token= ".." token2= - { csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); } + { csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); } | token= { csvColumn = new CSVColumn(Long.valueOf(token.image)); } [ "=" token = { csvColumn.setFormat(new StringValue(token.image)); }] ) - { - csvColumns.add(csvColumn); - } + { csvColumns.add(csvColumn); } )* ) - | ( + | { FBVColumn fbvColumn; } + ( ( ( token= | token= ) "=" token2= - { FBVColumn fbvColumn = new FBVColumn(token.image, new LongValue(token2.image)); } + { fbvColumn = new FBVColumn(token.image, new LongValue(token2.image)); } | ( token= | token= ) "=" token2= - { FBVColumn fbvColumn = new FBVColumn(token.image, new StringValue(token2.image)); } + { fbvColumn = new FBVColumn(token.image, new StringValue(token2.image)); } | token= "=" ( token2= | token2= ) - { FBVColumn fbvColumn = new FBVColumn(token.image, new StringValue(token2.image)); } + { fbvColumn = new FBVColumn(token.image, new StringValue(token2.image)); } ) { List fbvColumns = new ArrayList(); @@ -1389,6 +1387,7 @@ FileSource FileSource() #FileSource: { { List fileOptions = new ArrayList(); fileSource.setFileOptions(fileOptions); + FileOption fileOption; } ( ( @@ -1397,15 +1396,15 @@ FileSource FileSource() #FileSource: { | token= | token= ) - { FileOption fileOption = new FileOption(token.image); } + { fileOption = new FileOption(token.image); } | ( ( token= | token= ) "=" token2= - { FileOption fileOption = new FileOption(token.image, new StringValue(token2.image)); } + { fileOption = new FileOption(token.image, new StringValue(token2.image)); } | token= "=" token2= - { FileOption fileOption = new FileOption(token.image, new LongValue(token2.image)); } + { fileOption = new FileOption(token.image, new LongValue(token2.image)); } ) | LOOKAHEAD(2) ( @@ -1416,9 +1415,9 @@ FileSource FileSource() #FileSource: { | token2= ) "=" token3= ) - { FileOption fileOption = new FileOption(token.image + " " + token2.image, new StringValue(token3.image)); } + { fileOption = new FileOption(token.image + " " + token2.image, new StringValue(token3.image)); } | token= token2= "=" token3= - { FileOption fileOption = new FileOption(token.image + " " + token2.image, new LongValue(token3.image)); } + { fileOption = new FileOption(token.image + " " + token2.image, new LongValue(token3.image)); } ) { fileOptions.add(fileOption); } )+ @@ -1435,18 +1434,19 @@ CertificateVerification CertificateVerification(): { CertificateVerification certificateVerification = new CertificateVerification(); Token token; } { - ( - { certificateVerification.setIgnoreCertificate(true); } - | { certificateVerification.setVerifyCertificate(true); } - ) - - [ - + ( + ( + { certificateVerification.setIgnoreCertificate(true); } + | { certificateVerification.setVerifyCertificate(true); } + ) + + [ + + token = { certificateVerification.setPublicKey(new StringValue(token.image)); } + ] + | token = { certificateVerification.setPublicKey(new StringValue(token.image)); } - ] - | - token = { certificateVerification.setPublicKey(new StringValue(token.image)); } - + ) { return certificateVerification; } @@ -1455,6 +1455,7 @@ CertificateVerification CertificateVerification(): { ScriptSource ScriptSource(): { ScriptSource scriptSource = new ScriptSource(); ConnectionDefinition connectionDefinition; + Table script; String property; StringValue value; @@ -1499,7 +1500,7 @@ UserIdentification UserIdentification(): { Token token; } { - token= { userIdentification.setUserName(new StringValue(token.image)); } + token= { userIdentification.setUser(new StringValue(token.image)); } token= { userIdentification.setPassword(new StringValue(token.image)); } @@ -1510,15 +1511,16 @@ UserIdentification UserIdentification(): { ConnectionDefinition ConnectionDefinition(): { ConnectionDefinition connectionDefinition = new ConnectionDefinition(); - String connectionIdentifier; + String connectionObjectName; + UserIdentification userIdentification; CertificateVerification certificateVerification; Token token; } { ( - connectionIdentifier=RelObjectNameWithoutValue() { connectionDefinition.setConnection(new Connection(connectionIdentifier)); } - | token= { connectionDefinition.setConnection(new StringValue(token.image)); } + connectionObjectName = RelObjectNameWithoutValue() { connectionDefinition.setConnectionObjectName(connectionObjectName); } + | token= { connectionDefinition.setConnectionDefinition(new StringValue(token.image)); } ) [ userIdentification = UserIdentification() { connectionDefinition.setUserIdentification(userIdentification); } ] @@ -1531,9 +1533,9 @@ ConnectionDefinition ConnectionDefinition(): { } ConnectionDefinition CloudConnectionDefinition(): { - ConnectionDefinition connectionDefinition = new CloudConnectionDefinition(); - String connectionIdentifier; - CertificateVerification certificateVerification; + CloudConnectionDefinition connectionDefinition = new CloudConnectionDefinition(); + String connectionObjectName; + UserIdentification userIdentification; Token token; Token token2; @@ -1541,12 +1543,12 @@ ConnectionDefinition CloudConnectionDefinition(): { ( token = { connectionDefinition.setStorage(token.image); } - | { connectionDefinition.setStorage(token.image + " " + token2.image); } + | token = token2 = { connectionDefinition.setStorage(token.image + " " + token2.image); } ) ( - connectionIdentifier=RelObjectNameWithoutValue() { connectionDefinition.setConnection(new Connection(connectionIdentifier)); } - | token= { connectionDefinition.setConnection(new StringValue(token.image)); } + connectionObjectName = RelObjectNameWithoutValue() { connectionDefinition.setConnectionObjectName(connectionObjectName); } + | token = { connectionDefinition.setConnectionDefinition(new StringValue(token.image)); } ) [ userIdentification = UserIdentification() { connectionDefinition.setUserIdentification(userIdentification); } ] @@ -1564,23 +1566,25 @@ ErrorClause ErrorClause(): { Token token; } { - - errorDestination = ErrorDestination() { errorClause.setErrorDestination(errorDestination); } - [ - LOOKAHEAD(2) - "(" - expression = Expression() { errorClause.setExpression(expression); } - ")" - ] - [ - LOOKAHEAD(2) - ( - { errorClause.setReplace(true); } - | { errorClause.setTruncate(true); } - ) - ] - [ rejectClause = RejectClause() { errorClause.setRejectClause(rejectClause); } ] - | rejectClause = RejectClause() { errorClause.setRejectClause(rejectClause); } + ( + + errorDestination = ErrorDestination() { errorClause.setErrorDestination(errorDestination); } + [ + LOOKAHEAD(2) + "(" + expression = Expression() { errorClause.setExpression(expression); } + ")" + ] + [ + LOOKAHEAD(2) + ( + { errorClause.setReplace(true); } + | { errorClause.setTruncate(true); } + ) + ] + [ rejectClause = RejectClause() { errorClause.setRejectClause(rejectClause); } ] + | rejectClause = RejectClause() { errorClause.setRejectClause(rejectClause); } + ) { return errorClause; From b0e6276167a79777a5490a87e3daa7c2a4ebf3ab Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Wed, 5 Feb 2025 11:48:25 +0100 Subject: [PATCH 06/27] feat: Update keywords --- .../jsqlparser/parser/ParserKeywordsUtils.java | 2 -- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 8 ++++---- src/site/sphinx/keywords.rst | 16 ++++++++++++++++ .../jsqlparser/statement/SerializationTest.java | 9 +++++++++ 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/parser/ParserKeywordsUtils.java b/src/main/java/net/sf/jsqlparser/parser/ParserKeywordsUtils.java index 3da975b20..0dc5e1bef 100644 --- a/src/main/java/net/sf/jsqlparser/parser/ParserKeywordsUtils.java +++ b/src/main/java/net/sf/jsqlparser/parser/ParserKeywordsUtils.java @@ -85,7 +85,6 @@ public class ParserKeywordsUtils { {"GROUPING", RESTRICTED_ALIAS}, {"QUALIFY", RESTRICTED_ALIAS}, {"HAVING", RESTRICTED_SQL2016}, - {"IDENTITY", RESTRICTED_JSQLPARSER}, {"IF", RESTRICTED_SQL2016}, {"IIF", RESTRICTED_ALIAS}, {"IGNORE", RESTRICTED_ALIAS}, @@ -106,7 +105,6 @@ public class ParserKeywordsUtils { {"MINUS", RESTRICTED_SQL2016}, {"NATURAL", RESTRICTED_SQL2016}, {"NOCYCLE", RESTRICTED_JSQLPARSER}, - {"NONE", RESTRICTED_JSQLPARSER}, {"NOT", RESTRICTED_SQL2016}, {"NULL", RESTRICTED_SQL2016}, {"OFFSET", RESTRICTED_SQL2016}, diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 3cfc74eb4..ab2a9a35a 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1052,7 +1052,7 @@ LikeClause LikeClause(): { } { table = Table() { likeClause.setTable(table); } - [columnsList = ColumnSelectItemsList() { likeClause.setColumnsList(columnsList); }] + [ LOOKAHEAD(2) columnsList = ColumnSelectItemsList() { likeClause.setColumnsList(columnsList); }] [ LOOKAHEAD(2) @@ -1086,7 +1086,7 @@ LikeClause LikeClause(): { } } -Import Import(): { +Import Import() #Import: { Import impt = new Import(); Table table; Column tableColumn; @@ -2719,7 +2719,7 @@ String RelObjectNameWithoutValue() : { Token tk = null; } { ( tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= - | tk="ACTION" | tk="ACTIVE" | tk="ADD" | tk="ADVANCE" | tk="ADVISE" | tk="AGAINST" | tk="ALGORITHM" | tk="ALTER" | tk="ANALYZE" | tk="APPLY" | tk="APPROXIMATE" | tk="ARCHIVE" | tk="ARRAY" | tk="ASC" | tk="AT" | tk="AUTHORIZATION" | tk="AUTO" | tk="AUTO_INCREMENT" | tk="BASE64" | tk="BEGIN" | tk="BERNOULLI" | tk="BINARY" | tk="BIT" | tk="BLOCK" | tk="BROWSE" | 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="CONCURRENTLY" | tk="CONFLICT" | tk="CONSTRAINTS" | tk="CONVERT" | tk="COSTS" | tk="COUNT" | tk="CS" | tk="CYCLE" | tk="DATA" | tk="DATABASE" | tk="DATETIME" | tk="DBA_RECYCLEBIN" | tk="DDL" | tk="DECLARE" | tk="DEFERRABLE" | tk="DELAYED" | tk="DELETE" | tk="DESC" | tk="DESCRIBE" | tk="DISABLE" | tk="DISCONNECT" | tk="DIV" | tk="DML" | tk="DO" | tk="DOMAIN" | tk="DROP" | tk="DUMP" | tk="DUPLICATE" | tk="ELEMENTS" | tk="EMIT" | tk="ENABLE" | tk="ENCRYPTION" | tk="END" | tk="ENGINE" | tk="ERROR" | tk="ESCAPE" | tk="EXCLUDE" | tk="EXEC" | tk="EXECUTE" | tk="EXPLAIN" | tk="EXPLICIT" | tk="EXTENDED" | tk="EXTRACT" | tk="FILTER" | tk="FIRST" | tk="FLUSH" | tk="FN" | tk="FOLLOWING" | tk="FORMAT" | tk="FULLTEXT" | tk="FUNCTION" | tk="GRANT" | tk="GROUP_CONCAT" | tk="GUARD" | tk="HASH" | tk="HIGH" | tk="HIGH_PRIORITY" | tk="HISTORY" | tk="HOPPING" | tk="INCLUDE" | tk="INCLUDE_NULL_VALUES" | tk="INCREMENT" | tk="INDEX" | tk="INSERT" | tk="INTERLEAVE" | tk="INTERPRET" | tk="INVALIDATE" | tk="INVERSE" | tk="ISNULL" | tk="JSON" | tk="JSON_ARRAY" | tk="JSON_ARRAYAGG" | tk="JSON_OBJECT" | tk="JSON_OBJECTAGG" | tk="KEEP" | tk="KEY" | tk="KEYS" | tk="LAST" | tk="LEADING" | tk="LESS" | tk="LINK" | tk="LOCAL" | tk="LOCK" | tk="LOCKED" | tk="LOG" | tk="LONGTEXT" | tk="LOOP" | tk="LOW" | tk="LOW_PRIORITY" | tk="MATCH" | tk="MATCHED" | tk="MATCH_ALL" | tk="MATCH_ANY" | tk="MATCH_PHRASE" | tk="MATCH_PHRASE_PREFIX" | tk="MATCH_REGEXP" | tk="MATERIALIZED" | tk="MAX" | tk="MAXVALUE" | tk="MEDIUMTEXT" | tk="MEMBER" | tk="MERGE" | tk="MIN" | 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="NOTNULL" | tk="NOVALIDATE" | tk="NOWAIT" | tk="NULLS" | tk="OF" | tk="OFF" | tk="OPEN" | tk="OVER" | tk="OVERFLOW" | tk="OVERLAPS" | tk="OVERRIDING" | tk="OVERWRITE" | tk="PARALLEL" | tk="PARENT" | tk="PARTITION" | tk="PATH" | tk="PERCENT" | tk="PLACING" | tk="PLAN" | tk="PLUS" | tk="PRECEDING" | tk="PRIMARY" | tk="PURGE" | tk="QUERY" | tk="QUICK" | tk="QUIESCE" | tk="RANGE" | tk="RAW" | tk="READ" | tk="RECURSIVE" | tk="RECYCLEBIN" | tk="REFERENCES" | tk="REFRESH" | tk="REGEXP" | tk="REGEXP_LIKE" | tk="REGISTER" | tk="REMOTE" | tk="RENAME" | tk="REPEATABLE" | tk="REPLACE" | tk="RESET" | tk="RESPECT" | tk="RESTART" | tk="RESTRICT" | tk="RESTRICTED" | tk="RESUMABLE" | tk="RESUME" | tk="RETURN" | tk="RLIKE" | tk="ROLLBACK" | tk="ROLLUP" | tk="ROOT" | tk="ROW" | tk="ROWS" | tk="RR" | tk="RS" | tk="SAFE_CAST" | tk="SAVEPOINT" | tk="SCHEMA" | tk="SECURE" | tk="SEED" | tk="SEPARATOR" | tk="SEQUENCE" | tk="SESSION" | tk="SETS" | tk="SHARE" | tk="SHOW" | tk="SHUTDOWN" | tk="SIBLINGS" | tk="SIGNED" | tk="SIMILAR" | tk="SIZE" | tk="SKIP" | tk="STORED" | tk="STRING" | tk="STRUCT" | tk="SUMMARIZE" | tk="SUSPEND" | tk="SWITCH" | tk="SYNONYM" | tk="SYSTEM" | tk="TABLE" | tk="TABLESPACE" | tk="TEMP" | tk="TEMPORARY" | tk="TEXT" | tk="THAN" | tk="THEN" | tk="TIMEOUT" | tk="TIMESTAMPTZ" | tk="TIMEZONE" | tk="TINYTEXT" | tk="TO" | tk="TRIGGER" | tk="TRUNCATE" | tk="TRY_CAST" | 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="VOLATILE" | tk="WAIT" | tk="WITHIN" | tk="WITHOUT" | tk="WITHOUT_ARRAY_WRAPPER" | tk="WORK" | tk="XML" | tk="XMLAGG" | tk="XMLDATA" | tk="XMLSCHEMA" | tk="XMLTEXT" | tk="XSINIL" | tk="YAML" | tk="YES" | tk="ZONE" ) + | tk="ACTION" | tk="ACTIVE" | tk="ADD" | tk="ADVANCE" | tk="ADVISE" | tk="AGAINST" | tk="ALGORITHM" | tk="ALIGN" | tk="ALTER" | tk="ANALYZE" | tk="APPLY" | tk="APPROXIMATE" | tk="ARCHIVE" | tk="ARRAY" | tk="ASC" | tk="AT" | tk="AUTHORIZATION" | tk="AUTO" | tk="AUTO_INCREMENT" | tk="AZURE" | tk="BASE64" | tk="BEGIN" | tk="BERNOULLI" | tk="BINARY" | tk="BIT" | tk="BLOBSTORAGE" | tk="BLOCK" | tk="BROWSE" | tk="BUFFERS" | tk="BY" | tk="BYTE" | tk="BYTES" | tk="CACHE" | tk="CALL" | tk="CASCADE" | tk="CASE" | tk="CAST" | tk="CERTIFICATE" | tk="CHANGE" | tk="CHANGES" | tk="CHAR" | tk="CHARACTER" | tk="CHECKPOINT" | tk="CLOSE" | tk="CLOUD" | tk="COLLATE" | tk="COLUMN" | tk="COLUMNS" | tk="COMMENT" | tk="COMMENTS" | tk="COMMIT" | tk="CONCURRENTLY" | tk="CONFLICT" | tk="CONSTRAINTS" | tk="CONVERT" | tk="COSTS" | tk="COUNT" | tk="CS" | tk="CYCLE" | tk="DATA" | tk="DATABASE" | tk="DATETIME" | tk="DBA_RECYCLEBIN" | tk="DDL" | tk="DECLARE" | tk="DEFAULTS" | tk="DEFERRABLE" | tk="DELAYED" | tk="DELETE" | tk="DELIMITER" | tk="DESC" | tk="DESCRIBE" | tk="DISABLE" | tk="DISCONNECT" | tk="DIV" | tk="DML" | tk="DO" | tk="DOMAIN" | tk="DRIVER" | tk="DROP" | tk="DUMP" | tk="DUPLICATE" | tk="ELEMENTS" | tk="EMIT" | tk="ENABLE" | tk="ENCODING" | tk="ENCRYPTION" | tk="END" | tk="ENGINE" | tk="ERROR" | tk="ESCAPE" | tk="EXA" | tk="EXCLUDE" | tk="EXCLUDING" | tk="EXEC" | tk="EXECUTE" | tk="EXPLAIN" | tk="EXPLICIT" | tk="EXTENDED" | tk="EXTRACT" | tk="FILTER" | tk="FIRST" | tk="FLUSH" | tk="FN" | tk="FOLLOWING" | tk="FORMAT" | tk="FULLTEXT" | tk="FUNCTION" | tk="GRANT" | tk="GROUP_CONCAT" | tk="GUARD" | tk="HASH" | tk="HIGH" | tk="HIGH_PRIORITY" | tk="HISTORY" | tk="HOPPING" | tk="IDENTIFIED" | tk="IDENTITY" | tk="INCLUDE" | tk="INCLUDE_NULL_VALUES" | tk="INCLUDING" | tk="INCREMENT" | tk="INDEX" | tk="INSERT" | tk="INTERLEAVE" | tk="INTERPRET" | tk="INVALIDATE" | tk="INVERSE" | tk="ISNULL" | tk="JDBC" | tk="JSON" | tk="JSON_ARRAY" | tk="JSON_ARRAYAGG" | tk="JSON_OBJECT" | tk="JSON_OBJECTAGG" | tk="KEEP" | tk="KEY" | tk="KEYS" | tk="LAST" | tk="LEADING" | tk="LESS" | tk="LINK" | tk="LOCAL" | tk="LOCK" | tk="LOCKED" | tk="LOG" | tk="LONGTEXT" | tk="LOOP" | tk="LOW" | tk="LOW_PRIORITY" | tk="LTRIM" | tk="MATCH" | tk="MATCHED" | tk="MATCH_ALL" | tk="MATCH_ANY" | tk="MATCH_PHRASE" | tk="MATCH_PHRASE_PREFIX" | tk="MATCH_REGEXP" | tk="MATERIALIZED" | tk="MAX" | tk="MAXVALUE" | tk="MEDIUMTEXT" | tk="MEMBER" | tk="MERGE" | tk="MIN" | tk="MINVALUE" | tk="MODIFY" | tk="MOVEMENT" | tk="NEXT" | tk="NO" | tk="NOCACHE" | tk="NOKEEP" | tk="NOLOCK" | tk="NOMAXVALUE" | tk="NOMINVALUE" | tk="NONE" | tk="NOORDER" | tk="NOTHING" | tk="NOTNULL" | tk="NOVALIDATE" | tk="NOWAIT" | tk="NULLS" | tk="OF" | tk="OFF" | tk="OPEN" | tk="ORA" | tk="OVER" | tk="OVERFLOW" | tk="OVERLAPS" | tk="OVERRIDING" | tk="OVERWRITE" | tk="PADDING" | tk="PARALLEL" | tk="PARENT" | tk="PARTITION" | tk="PATH" | tk="PERCENT" | tk="PLACING" | tk="PLAN" | tk="PLUS" | tk="PRECEDING" | tk="PRIMARY" | tk="PURGE" | tk="QUERY" | tk="QUICK" | tk="QUIESCE" | tk="RANGE" | tk="RAW" | tk="READ" | tk="RECURSIVE" | tk="RECYCLEBIN" | tk="REFERENCES" | tk="REFRESH" | tk="REGEXP" | tk="REGEXP_LIKE" | tk="REGISTER" | tk="REJECT" | tk="REMOTE" | tk="RENAME" | tk="REPEATABLE" | tk="REPLACE" | tk="RESET" | tk="RESPECT" | tk="RESTART" | tk="RESTRICT" | tk="RESTRICTED" | tk="RESUMABLE" | tk="RESUME" | tk="RETURN" | tk="RLIKE" | tk="ROLLBACK" | tk="ROLLUP" | tk="ROOT" | tk="ROW" | tk="ROWS" | tk="RR" | tk="RS" | tk="RTRIM" | tk="SAFE_CAST" | tk="SAVEPOINT" | tk="SCHEMA" | tk="SECURE" | tk="SEED" | tk="SEPARATOR" | tk="SEQUENCE" | tk="SESSION" | tk="SETS" | tk="SHARE" | tk="SHOW" | tk="SHUTDOWN" | tk="SIBLINGS" | tk="SIGNED" | tk="SIMILAR" | tk="SIZE" | tk="SKIP" | tk="STORED" | tk="STRING" | tk="STRUCT" | tk="SUMMARIZE" | tk="SUSPEND" | tk="SWITCH" | tk="SYNONYM" | tk="SYSTEM" | tk="TABLE" | tk="TABLESPACE" | tk="TEMP" | tk="TEMPORARY" | tk="TEXT" | tk="THAN" | tk="THEN" | tk="TIMEOUT" | tk="TIMESTAMPTZ" | tk="TIMEZONE" | tk="TINYTEXT" | tk="TO" | tk="TRIGGER" | tk="TRUNCATE" | tk="TRY_CAST" | tk="TUMBLING" | tk="TYPE" | tk="UNLIMITED" | tk="UNLOGGED" | tk="UNQIESCE" | tk="UNSIGNED" | tk="UPDATE" | tk="UPSERT" | tk="UR" | tk="USER" | tk="VALIDATE" | tk="VERBOSE" | tk="VIEW" | tk="VOLATILE" | tk="WAIT" | tk="WITHIN" | tk="WITHOUT" | tk="WITHOUT_ARRAY_WRAPPER" | tk="WORK" | tk="XML" | tk="XMLAGG" | tk="XMLDATA" | tk="XMLSCHEMA" | tk="XMLTEXT" | tk="XSINIL" | tk="YAML" | tk="YES" | tk="ZONE" ) { return tk.image; } } @@ -7466,7 +7466,7 @@ List CreateParameter(): | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk = | tk = - | tk= + | tk= | tk= | tk="=" ) { param.add(tk.image); } diff --git a/src/site/sphinx/keywords.rst b/src/site/sphinx/keywords.rst index f6e3926de..2f8d372fa 100644 --- a/src/site/sphinx/keywords.rst +++ b/src/site/sphinx/keywords.rst @@ -29,6 +29,8 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and +----------------------+-------------+-----------+ | CONNECT_BY_ROOT | Yes | Yes | +----------------------+-------------+-----------+ +| CSV | Yes | Yes | ++----------------------+-------------+-----------+ | PRIOR | Yes | Yes | +----------------------+-------------+-----------+ | CONSTRAINT | Yes | Yes | @@ -47,6 +49,8 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and +----------------------+-------------+-----------+ | ELSE | Yes | Yes | +----------------------+-------------+-----------+ +| ERRORS | Yes | Yes | ++----------------------+-------------+-----------+ | EXCEPT | Yes | Yes | +----------------------+-------------+-----------+ | EXCLUDES | Yes | Yes | @@ -55,8 +59,12 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and +----------------------+-------------+-----------+ | FALSE | Yes | Yes | +----------------------+-------------+-----------+ +| FBV | Yes | Yes | ++----------------------+-------------+-----------+ | FETCH | Yes | Yes | +----------------------+-------------+-----------+ +| FILE | Yes | Yes | ++----------------------+-------------+-----------+ | FINAL | Yes | Yes | +----------------------+-------------+-----------+ | FOR | Yes | Yes | @@ -87,6 +95,8 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and +----------------------+-------------+-----------+ | ILIKE | Yes | Yes | +----------------------+-------------+-----------+ +| IMPORT | Yes | Yes | ++----------------------+-------------+-----------+ | IN | Yes | Yes | +----------------------+-------------+-----------+ | INCLUDES | Yes | Yes | @@ -157,6 +167,8 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and +----------------------+-------------+-----------+ | SAMPLE | Yes | | +----------------------+-------------+-----------+ +| SCRIPT | Yes | Yes | ++----------------------+-------------+-----------+ | SEL | Yes | | +----------------------+-------------+-----------+ | SELECT | Yes | | @@ -169,6 +181,8 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and +----------------------+-------------+-----------+ | START | Yes | Yes | +----------------------+-------------+-----------+ +| STATEMENT | Yes | Yes | ++----------------------+-------------+-----------+ | TABLES | Yes | | +----------------------+-------------+-----------+ | TOP | Yes | Yes | @@ -207,6 +221,8 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and +----------------------+-------------+-----------+ | VARYING | Yes | Yes | +----------------------+-------------+-----------+ +| VERIFY | Yes | Yes | ++----------------------+-------------+-----------+ | WHEN | Yes | Yes | +----------------------+-------------+-----------+ | WHERE | Yes | Yes | diff --git a/src/test/java/net/sf/jsqlparser/statement/SerializationTest.java b/src/test/java/net/sf/jsqlparser/statement/SerializationTest.java index db9ffd467..f5cfad0f6 100644 --- a/src/test/java/net/sf/jsqlparser/statement/SerializationTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/SerializationTest.java @@ -1,3 +1,12 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2025 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ package net.sf.jsqlparser.statement; import net.sf.jsqlparser.JSQLParserException; From 0c9b80e9fbdf17ded4db499f862c18e3efce3b03 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Wed, 5 Feb 2025 15:36:47 +0100 Subject: [PATCH 07/27] feat: Allow IMPORT as FromItem in SELECT --- .../sf/jsqlparser/statement/imprt/Import.java | 38 ++++++++++++++++++- .../statement/select/FromItemVisitor.java | 7 ++++ .../select/FromItemVisitorAdapter.java | 7 ++++ .../sf/jsqlparser/util/TablesNamesFinder.java | 5 +++ .../util/deparser/SelectDeParser.java | 9 +++++ .../validation/validator/SelectValidator.java | 11 ++++++ .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 22 ++++++----- 7 files changed, 88 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java b/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java index a9da50da2..cb7b57a12 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java @@ -9,20 +9,23 @@ */ package net.sf.jsqlparser.statement.imprt; +import net.sf.jsqlparser.expression.Alias; import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.parser.ASTNodeAccessImpl; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.StatementVisitor; -import net.sf.jsqlparser.statement.select.PlainSelect; +import net.sf.jsqlparser.statement.select.*; import java.util.List; -public class Import implements Statement { +public class Import extends ASTNodeAccessImpl implements FromItem, Statement { private Table table; private ExpressionList columns; private List importColumns; private ImportFromItem fromItem; + private Alias alias; public Table getTable() { return table; @@ -80,4 +83,35 @@ public String toString() { public T accept(StatementVisitor statementVisitor, S context) { return statementVisitor.visit(this, context); } + + @Override + public T accept(FromItemVisitor fromItemVisitor, S context) { + return fromItemVisitor.visit(this, context); + } + + @Override + public Alias getAlias() { + return alias; + } + + @Override + public void setAlias(Alias alias) { + this.alias = alias; + } + + @Override + public Pivot getPivot() { + return null; + } + + @Override + public void setPivot(Pivot pivot) {} + + @Override + public UnPivot getUnPivot() { + return null; + } + + @Override + public void setUnPivot(UnPivot unpivot) {} } diff --git a/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitor.java b/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitor.java index d98614843..85b503826 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitor.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitor.java @@ -10,6 +10,7 @@ package net.sf.jsqlparser.statement.select; import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.imprt.Import; public interface FromItemVisitor { @@ -66,4 +67,10 @@ default void visit(SetOperationList setOperationList) { default void visit(TableStatement tableStatement) { this.visit(tableStatement, null); } + + T visit(Import imprt, S context); + + default void visit(Import imprt) { + this.visit(imprt, null); + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitorAdapter.java index fa530e32f..6c5fff9ce 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitorAdapter.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitorAdapter.java @@ -10,6 +10,7 @@ package net.sf.jsqlparser.statement.select; import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.imprt.Import; @SuppressWarnings({"PMD.UncommentedEmptyMethodBody"}) public class FromItemVisitorAdapter implements FromItemVisitor { @@ -67,4 +68,10 @@ public T visit(TableStatement tableStatement, S context) { return null; } + + @Override + public T visit(Import imprt, S context) { + + return null; + } } diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java index 7147c008f..f01ed3a5d 100644 --- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java +++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java @@ -1828,4 +1828,9 @@ public Void visit(Import imprt, S context) { return null; } + @Override + public void visit(Import imprt) { + StatementVisitor.super.visit(imprt); + } + } diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java index f7ac3ccf1..ef2186062 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java @@ -18,6 +18,7 @@ import net.sf.jsqlparser.expression.WindowDefinition; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.imprt.Import; import net.sf.jsqlparser.statement.select.Distinct; import net.sf.jsqlparser.statement.select.Fetch; import net.sf.jsqlparser.statement.select.First; @@ -755,6 +756,12 @@ public StringBuilder visit(Values values, S context) { return buffer; } + @Override + public StringBuilder visit(Import imprt, S context) { + buffer.append(imprt.toString()); + return buffer; + } + @Override public void visit(Values values) { SelectVisitor.super.visit(values); @@ -812,6 +819,8 @@ public void visit(ParenthesedFromItem fromItem) { visit(fromItem, null); } + public void visit(Import imprt) { visit(imprt, null); } + private void deparseOptimizeFor(OptimizeFor optimizeFor) { buffer.append(" OPTIMIZE FOR "); diff --git a/src/main/java/net/sf/jsqlparser/util/validation/validator/SelectValidator.java b/src/main/java/net/sf/jsqlparser/util/validation/validator/SelectValidator.java index 1948a78d7..62525edca 100644 --- a/src/main/java/net/sf/jsqlparser/util/validation/validator/SelectValidator.java +++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/SelectValidator.java @@ -16,6 +16,7 @@ import net.sf.jsqlparser.expression.SQLServerHints; import net.sf.jsqlparser.parser.feature.Feature; import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.imprt.Import; import net.sf.jsqlparser.statement.select.ExceptOp; import net.sf.jsqlparser.statement.select.Fetch; import net.sf.jsqlparser.statement.select.ForMode; @@ -359,6 +360,12 @@ public Void visit(Values values, S context) { return null; } + @Override + public Void visit(Import imprt, S context) { + // TODO: not yet implemented + return null; + } + @Override public void validate(SelectItem statement) { statement.accept(this, null); @@ -420,4 +427,8 @@ public void visit(Values values) { visit(values, null); } + public void visit(Import imprt) { + visit(imprt, null); + } + } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index ab2a9a35a..5bba550a6 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1142,7 +1142,7 @@ ImportFromItem ImportFromItem(): { importFromItem = DBMSSource() | importFromItem = FileSource() ) - [errorClause = ErrorClause() { importFromItem.setErrorClause(errorClause); }] + [ LOOKAHEAD(2) errorClause = ErrorClause() { importFromItem.setErrorClause(errorClause); } ] | importFromItem = ScriptSource() ) { @@ -1236,6 +1236,7 @@ FileSource FileSource() #FileSource: { { connectionFileDefinitions.add(new ConnectionFileDefinition(connectionDefinition, filePaths)); } ( + LOOKAHEAD(2) ( ( LOOKAHEAD(2) connectionDefinition = ConnectionDefinition() @@ -1384,12 +1385,14 @@ FileSource FileSource() #FileSource: { ] [ + LOOKAHEAD(2) { List fileOptions = new ArrayList(); fileSource.setFileOptions(fileOptions); FileOption fileOption; } ( + LOOKAHEAD(2) ( ( token= @@ -1423,7 +1426,7 @@ FileSource FileSource() #FileSource: { )+ ] - [ certificateVerification = CertificateVerification() { fileSource.setCertificateVerification(certificateVerification); } ] + [ LOOKAHEAD(2) certificateVerification = CertificateVerification() { fileSource.setCertificateVerification(certificateVerification); } ] { return fileSource; @@ -1441,8 +1444,9 @@ CertificateVerification CertificateVerification(): { ) [ - - token = { certificateVerification.setPublicKey(new StringValue(token.image)); } + LOOKAHEAD(2) + + token = { certificateVerification.setPublicKey(new StringValue(token.image)); } ] | token = { certificateVerification.setPublicKey(new StringValue(token.image)); } @@ -1464,7 +1468,7 @@ ScriptSource ScriptSource(): { script = Table() { scriptSource.setScript(script); } - [ connectionDefinition = ConnectionDefinition() { scriptSource.setConnectionDefinition(connectionDefinition); } ] + [ LOOKAHEAD(2) connectionDefinition = ConnectionDefinition() { scriptSource.setConnectionDefinition(connectionDefinition); } ] [ LOOKAHEAD(2) @@ -1523,9 +1527,9 @@ ConnectionDefinition ConnectionDefinition(): { | token= { connectionDefinition.setConnectionDefinition(new StringValue(token.image)); } ) - [ userIdentification = UserIdentification() { connectionDefinition.setUserIdentification(userIdentification); } ] + [ LOOKAHEAD(2) userIdentification = UserIdentification() { connectionDefinition.setUserIdentification(userIdentification); } ] - [ certificateVerification = CertificateVerification() { connectionDefinition.setCertificateVerification(certificateVerification); } ] + [ LOOKAHEAD(2) certificateVerification = CertificateVerification() { connectionDefinition.setCertificateVerification(certificateVerification); } ] { return connectionDefinition; @@ -1582,7 +1586,7 @@ ErrorClause ErrorClause(): { | { errorClause.setTruncate(true); } ) ] - [ rejectClause = RejectClause() { errorClause.setRejectClause(rejectClause); } ] + [ LOOKAHEAD(2) rejectClause = RejectClause() { errorClause.setRejectClause(rejectClause); } ] | rejectClause = RejectClause() { errorClause.setRejectClause(rejectClause); } ) @@ -3232,7 +3236,7 @@ PlainSelect PlainSelect() #PlainSelect: selectItems=SelectItemsList() [ LOOKAHEAD(2) intoTables = IntoClause() { plainSelect.setIntoTables(intoTables); } ] - [ LOOKAHEAD(2) fromItem=FromItem() + [ LOOKAHEAD(2) (fromItem=FromItem() | fromItem=Import()) [ LOOKAHEAD(2) lateralViews=LateralViews() ] [ LOOKAHEAD(2) joins=JoinsList() ] ] From d4120591fefa7e1a7acb4522b8dd6290022733c9 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Thu, 6 Feb 2025 11:39:22 +0100 Subject: [PATCH 08/27] fix: Split double dot to fix broken unit tests --- src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 5bba550a6..138f39752 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1301,7 +1301,7 @@ FileSource FileSource() #FileSource: { ( LOOKAHEAD(2) token= - ".." + "." "." token2= { csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); } | token= { csvColumn = new CSVColumn(Long.valueOf(token.image)); } @@ -1317,7 +1317,7 @@ FileSource FileSource() #FileSource: { ( LOOKAHEAD(2) token= - ".." + "." "." token2= { csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); } | token= { csvColumn = new CSVColumn(Long.valueOf(token.image)); } From bcfa4e9248c70529a1da795d37c05a22103b962d Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Thu, 6 Feb 2025 11:49:19 +0100 Subject: [PATCH 09/27] fix: Fix errors occured during verify step --- .../java/net/sf/jsqlparser/util/deparser/SelectDeParser.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java index ef2186062..5e8ec8658 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java @@ -819,7 +819,9 @@ public void visit(ParenthesedFromItem fromItem) { visit(fromItem, null); } - public void visit(Import imprt) { visit(imprt, null); } + public void visit(Import imprt) { + visit(imprt, null); + } private void deparseOptimizeFor(OptimizeFor optimizeFor) { From 0130d56472acd47d9faa7f278d7219490384cb34 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Fri, 7 Feb 2025 09:01:42 +0100 Subject: [PATCH 10/27] test: Implement unit tests for IMPORT --- .../statement/CloudConnectionDefinition.java | 1 + .../statement/ConnectionFileDefinition.java | 5 +- .../sf/jsqlparser/statement/FBVColumn.java | 28 +- .../sf/jsqlparser/statement/LikeClause.java | 5 +- .../statement/imprt/FileSource.java | 13 +- .../sf/jsqlparser/statement/imprt/Import.java | 3 +- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 31 +- .../statement/imprt/ImportTest.java | 266 ++++++++++++++++++ 8 files changed, 330 insertions(+), 22 deletions(-) create mode 100644 src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java diff --git a/src/main/java/net/sf/jsqlparser/statement/CloudConnectionDefinition.java b/src/main/java/net/sf/jsqlparser/statement/CloudConnectionDefinition.java index 93d17186b..b9cc8191e 100644 --- a/src/main/java/net/sf/jsqlparser/statement/CloudConnectionDefinition.java +++ b/src/main/java/net/sf/jsqlparser/statement/CloudConnectionDefinition.java @@ -29,6 +29,7 @@ public String toString() { sql.append("AT CLOUD "); sql.append(storage); + sql.append(" "); appendConnectionDefinition(sql); return sql.toString(); diff --git a/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java b/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java index eb81bee3d..91599e963 100644 --- a/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java +++ b/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java @@ -46,7 +46,10 @@ public void setFilePaths(List filePaths) { public String toString() { StringBuilder sql = new StringBuilder(); - sql.append(connectionDefinition); + if (connectionDefinition != null) { + sql.append(connectionDefinition); + } + for (StringValue filePath : filePaths) { sql.append(" FILE ").append(filePath); } diff --git a/src/main/java/net/sf/jsqlparser/statement/FBVColumn.java b/src/main/java/net/sf/jsqlparser/statement/FBVColumn.java index d0d1df320..664ab40aa 100644 --- a/src/main/java/net/sf/jsqlparser/statement/FBVColumn.java +++ b/src/main/java/net/sf/jsqlparser/statement/FBVColumn.java @@ -17,10 +17,18 @@ public class FBVColumn { private boolean precedesComma; private String key; private Expression value; + private String stringValue; private FBVColumn(String key, Expression value) { this.key = key; this.value = value; + this.stringValue = null; + } + + public FBVColumn(String key, String value) { + this.key = key; + this.value = null; + this.stringValue = value; } public FBVColumn(String key, StringValue value) { @@ -51,12 +59,22 @@ public Expression getValue() { return value; } - public void setValue(StringValue value) { + public void setValue(String value) { + this.stringValue = value; + this.value = null; + } + + private void setValue(Expression value) { this.value = value; + this.stringValue = null; + } + + public void setValue(StringValue value) { + setValue((Expression) value); } public void setValue(LongValue value) { - this.value = value; + setValue((Expression) value); } @Override @@ -69,7 +87,11 @@ public String toString() { sql.append(key); sql.append(" = "); - sql.append(value); + if (stringValue != null) { + sql.append(stringValue); + } else { + sql.append(value); + } return sql.toString(); } diff --git a/src/main/java/net/sf/jsqlparser/statement/LikeClause.java b/src/main/java/net/sf/jsqlparser/statement/LikeClause.java index 05c3dc420..65022a081 100644 --- a/src/main/java/net/sf/jsqlparser/statement/LikeClause.java +++ b/src/main/java/net/sf/jsqlparser/statement/LikeClause.java @@ -99,7 +99,10 @@ public void setExcludingComments(Boolean excludingComments) { public StringBuilder appendTo(StringBuilder builder) { builder.append(" LIKE "); builder.append(table); - PlainSelect.appendStringListTo(builder, columnsList, true, false); + if (columnsList != null) { + builder.append(" "); + PlainSelect.appendStringListTo(builder, columnsList, true, true); + } if (includingDefaults != null) { if (includingDefaults) { diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java b/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java index 9dd399fb6..b682a4a7d 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java @@ -14,6 +14,7 @@ import java.io.Serializable; import java.util.List; +import java.util.Objects; public class FileSource extends ImportFromItem implements Serializable { private DataSource dataSource; @@ -98,29 +99,37 @@ public String toString() { sql.append("LOCAL "); } - if (secure) { + if (Objects.requireNonNullElse(secure, false)) { sql.append("SECURE "); } } sql.append(dataSource); - PlainSelect.appendStringListTo(sql, connectionFileDefinitions, false, false); + if (connectionFileDefinitions != null) { + sql.append(" "); + PlainSelect.appendStringListTo(sql, connectionFileDefinitions, false, false); + } if (csvColumns != null) { + sql.append(" "); PlainSelect.appendStringListTo(sql, csvColumns, true, true); } else if (fbvColumns != null) { + sql.append(" "); PlainSelect.appendStringListTo(sql, fbvColumns, false, true); } if (fileOptions != null) { + sql.append(" "); PlainSelect.appendStringListTo(sql, fileOptions, false, false); } if (certificateVerification != null) { + sql.append(" "); sql.append(certificateVerification); } if (errorClause != null) { + sql.append(" "); sql.append(errorClause); } diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java b/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java index cb7b57a12..6bda55277 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java @@ -71,9 +71,10 @@ public String toString() { } else { PlainSelect.appendStringListTo(sql, importColumns, true, true); } + sql.append(" "); } - sql.append(" FROM "); + sql.append("FROM "); sql.append(fromItem); return sql.toString(); diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 138f39752..cc44fe77d 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1052,7 +1052,7 @@ LikeClause LikeClause(): { } { table = Table() { likeClause.setTable(table); } - [ LOOKAHEAD(2) columnsList = ColumnSelectItemsList() { likeClause.setColumnsList(columnsList); }] + [ "(" columnsList = ColumnSelectItemsList() ")" { likeClause.setColumnsList(columnsList); }] [ LOOKAHEAD(2) @@ -1196,7 +1196,6 @@ DBMSSource DBMSSource() #DBMSSource: { FileSource FileSource() #FileSource: { FileSource fileSource = new FileSource(); - ConnectionDefinition connectionDefinition; List connectionFileDefinitions = new ArrayList(); List filePaths; CertificateVerification certificateVerification; @@ -1213,10 +1212,11 @@ FileSource FileSource() #FileSource: { ) ( - ( - LOOKAHEAD(2) connectionDefinition = ConnectionDefinition() - | connectionDefinition = CloudConnectionDefinition() - ) + { ConnectionDefinition connectionDefinition = null; } + [ + LOOKAHEAD(2) connectionDefinition = CloudConnectionDefinition() + | connectionDefinition = ConnectionDefinition() + ] token = { filePaths = new ArrayList(); @@ -1225,6 +1225,7 @@ FileSource FileSource() #FileSource: { filePaths.add(stringVal); } ( + LOOKAHEAD(2) token = { stringVal = new StringValue(token.image); @@ -1238,10 +1239,11 @@ FileSource FileSource() #FileSource: { ( LOOKAHEAD(2) ( - ( - LOOKAHEAD(2) connectionDefinition = ConnectionDefinition() - | connectionDefinition = CloudConnectionDefinition() - ) + { connectionDefinition = null; } + [ + LOOKAHEAD(2) connectionDefinition = CloudConnectionDefinition() + | connectionDefinition = ConnectionDefinition() + ] token = { filePaths = new ArrayList(); @@ -1250,6 +1252,7 @@ FileSource FileSource() #FileSource: { filePaths.add(stringVal); } ( + LOOKAHEAD(2) token = { stringVal = new StringValue(token.image); @@ -1345,7 +1348,7 @@ FileSource FileSource() #FileSource: { token2= | token2= ) - { fbvColumn = new FBVColumn(token.image, new StringValue(token2.image)); } + { fbvColumn = new FBVColumn(token.image, token2.image); } ) { List fbvColumns = new ArrayList(); @@ -1373,7 +1376,7 @@ FileSource FileSource() #FileSource: { token2= | token2= ) - { fbvColumn = new FBVColumn(token.image, new StringValue(token2.image)); } + { fbvColumn = new FBVColumn(token.image, token2.image); } ) { fbvColumn.setPrecedesComma(precedesComma); @@ -1632,8 +1635,8 @@ CSVFileDestination CSVFileDestination(): { ( ( - LOOKAHEAD(2) connectionDefinition = ConnectionDefinition() - | connectionDefinition = CloudConnectionDefinition() + LOOKAHEAD(2) connectionDefinition = CloudConnectionDefinition() + | connectionDefinition = ConnectionDefinition() ) { csvFileDestination.setConnectionDefinition(connectionDefinition); } | { csvFileDestination.setLocal(true); } diff --git a/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java b/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java new file mode 100644 index 000000000..4c915be26 --- /dev/null +++ b/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java @@ -0,0 +1,266 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.imprt; + +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.test.TestUtils; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +@Execution(ExecutionMode.CONCURRENT) +public class ImportTest { + @ParameterizedTest + @ValueSource(strings = { + "IMPORT INTO schemaName.tableName FROM CSV FILE 'file.csv'", + "IMPORT INTO schemaName.tableName ( columnName ) FROM CSV FILE 'file.csv'", + "IMPORT INTO schemaName.tableName ( columnName1, columnName2 ) FROM CSV FILE 'file.csv'" + }) + public void testImportIntoTable(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "IMPORT INTO ( columnName integer ) FROM CSV FILE 'file.csv'", + "IMPORT INTO ( columnName1 integer, columnName2 varchar(100) ) FROM CSV FILE 'file.csv'", + + "IMPORT INTO ( LIKE schemaName.tableName ) FROM CSV FILE 'file.csv'", + "IMPORT INTO ( LIKE schemaName.tableName ( columnName ) ) FROM CSV FILE 'file.csv'", + "IMPORT INTO ( LIKE schemaName.tableName ( columnName1, columnName2 ) ) FROM CSV FILE 'file.csv'", + "IMPORT INTO ( LIKE schemaName.tableName ( columnName AS aliasName ) ) FROM CSV FILE 'file.csv'", + "IMPORT INTO ( LIKE schemaName.tableName ( columnName aliasName ) ) FROM CSV FILE 'file.csv'", + "IMPORT INTO ( LIKE schemaName.tableName ( columnName1 AS aliasName2, columnName2 AS aliasName2 ) ) FROM CSV FILE 'file.csv'" + }) + public void testImportIntoImportColumns(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "IMPORT FROM CSV FILE 'file.csv'", + "IMPORT FROM CSV FILE 'file1.csv' FILE 'file2.csv'", + + "IMPORT FROM LOCAL CSV FILE 'file.csv'", + "IMPORT FROM LOCAL CSV FILE 'file1.csv' FILE 'file2.csv'", + + "IMPORT FROM LOCAL SECURE CSV FILE 'file.csv'", + "IMPORT FROM LOCAL SECURE CSV FILE 'file1.csv' FILE 'file2.csv'" + }) + public void testImportFromFileCSV(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "IMPORT FROM CSV FILE 'file.csv' ( 1 )", + "IMPORT FROM CSV FILE 'file.csv' ( 1, 2 )", + "IMPORT FROM CSV FILE 'file.csv' ( 1 FORMAT = 'format' )", + "IMPORT FROM CSV FILE 'file.csv' ( 1 FORMAT = 'format', 2 FORMAT = 'format' )", + "IMPORT FROM CSV FILE 'file.csv' ( 1 .. 2 )", + "IMPORT FROM CSV FILE 'file.csv' ( 1, 1 .. 2 )", + "IMPORT FROM CSV FILE 'file.csv' ( 1, 1 .. 2, 3 )" + }) + public void testImportFromFileCSVCols(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "IMPORT FROM FBV FILE 'file.csv'", + "IMPORT FROM FBV FILE 'file1.csv' FILE 'file2.csv'", + + "IMPORT FROM LOCAL FBV FILE 'file.csv'", + "IMPORT FROM LOCAL FBV FILE 'file1.csv' FILE 'file2.csv'", + + "IMPORT FROM LOCAL SECURE FBV FILE 'file.csv'", + "IMPORT FROM LOCAL SECURE FBV FILE 'file1.csv' FILE 'file2.csv'" + }) + public void testImportFromFileFBV(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "IMPORT FROM FBV FILE 'file.fbv' ( SIZE = 1 )", + "IMPORT FROM FBV FILE 'file.fbv' ( START = 1 )", + "IMPORT FROM FBV FILE 'file.fbv' ( FORMAT = 'format' )", + "IMPORT FROM FBV FILE 'file.fbv' ( ALIGN = LEFT )", + "IMPORT FROM FBV FILE 'file.fbv' ( ALIGN = RIGHT )", + "IMPORT FROM FBV FILE 'file.fbv' ( PADDING = 'padding' )", + + "IMPORT FROM FBV FILE 'file.fbv' ( SIZE = 1, START = 1 )", + "IMPORT FROM FBV FILE 'file.fbv' ( SIZE = 1 START = 1 )", + "IMPORT FROM FBV FILE 'file.fbv' ( SIZE = 1 START = 1, FORMAT = 'format' )" + }) + public void testImportFromFileFBVCols(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "IMPORT FROM CSV FILE 'file.csv' ENCODING = 'UTF-8'", + "IMPORT FROM CSV FILE 'file.csv' SKIP = 1", + "IMPORT FROM CSV FILE 'file.csv' TRIM", + "IMPORT FROM CSV FILE 'file.csv' LTRIM", + "IMPORT FROM CSV FILE 'file.csv' RTRIM", + "IMPORT FROM CSV FILE 'file.csv' NULL = 'null'", + "IMPORT FROM CSV FILE 'file.csv' ROW SEPARATOR = 'CRLF'", + "IMPORT FROM CSV FILE 'file.csv' COLUMN SEPARATOR = ','", + "IMPORT FROM CSV FILE 'file.csv' COLUMN DELIMITER = '\"'", + "IMPORT FROM CSV FILE 'file.csv' ROW SIZE = 1", + + "IMPORT FROM CSV FILE 'file.csv' ENCODING = 'UTF-8' SKIP = 1", + "IMPORT FROM CSV FILE 'file.csv' ENCODING = 'UTF-8' SKIP = 1 TRIM" + }) + public void testImportFromFileFileOpts(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "IMPORT FROM CSV FILE 'file.csv' VERIFY CERTIFICATE", + "IMPORT FROM CSV FILE 'file.csv' IGNORE CERTIFICATE", + "IMPORT FROM CSV FILE 'file.csv' PUBLIC KEY 'publicKey'", + + "IMPORT FROM CSV FILE 'file.csv' VERIFY CERTIFICATE PUBLIC KEY 'publicKey'", + "IMPORT FROM CSV FILE 'file.csv' IGNORE CERTIFICATE PUBLIC KEY 'publicKey'" + }) + public void testImportFromFileCertVerification(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "IMPORT FROM CSV AT connectionName FILE 'file.csv'", + "IMPORT FROM CSV AT '127.0.0.1' FILE 'file.csv'", + + "IMPORT FROM CSV AT connectionName USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'", + "IMPORT FROM CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'", + + "IMPORT FROM CSV AT connectionName IGNORE CERTIFICATE FILE 'file.csv'", + "IMPORT FROM CSV AT connectionName VERIFY CERTIFICATE FILE 'file.csv'", + "IMPORT FROM CSV AT connectionName PUBLIC KEY 'publicKey' FILE 'file.csv'", + "IMPORT FROM CSV AT connectionName IGNORE CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'", + "IMPORT FROM CSV AT connectionName VERIFY CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'", + + "IMPORT FROM CSV AT connectionName USER 'user' IDENTIFIED BY 'password' IGNORE CERTIFICATE FILE 'file.csv'", + "IMPORT FROM CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' IGNORE CERTIFICATE FILE 'file.csv'", + "IMPORT FROM CSV AT connectionName USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE FILE 'file.csv'", + "IMPORT FROM CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE FILE 'file.csv'", + "IMPORT FROM CSV AT connectionName USER 'user' IDENTIFIED BY 'password' PUBLIC KEY 'publicKey' FILE 'file.csv'", + "IMPORT FROM CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' PUBLIC KEY 'publicKey' FILE 'file.csv'", + "IMPORT FROM CSV AT connectionName USER 'user' IDENTIFIED BY 'password' IGNORE CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'", + "IMPORT FROM CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' IGNORE CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'", + "IMPORT FROM CSV AT connectionName USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'", + "IMPORT FROM CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'" + }) + public void testImportFromConnectionDef(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "IMPORT FROM CSV AT CLOUD NONE connectionName FILE 'file.csv'", + "IMPORT FROM CSV AT CLOUD NONE '127.0.0.1' FILE 'file.csv'", + "IMPORT FROM CSV AT CLOUD NONE connectionName USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'", + "IMPORT FROM CSV AT CLOUD NONE '127.0.0.1' USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'", + "IMPORT FROM CSV AT CLOUD AZURE BLOBSTORAGE connectionName FILE 'file.csv'", + "IMPORT FROM CSV AT CLOUD AZURE BLOBSTORAGE '127.0.0.1' FILE 'file.csv'", + "IMPORT FROM CSV AT CLOUD AZURE BLOBSTORAGE connectionName USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'", + "IMPORT FROM CSV AT CLOUD AZURE BLOBSTORAGE '127.0.0.1' USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'" + }) + public void testImportFromCloudConnectionDef(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "IMPORT FROM EXA AT connectionName TABLE schemaName.tableName", + "IMPORT FROM EXA AT connectionName TABLE schemaName.tableName ( columnName )", + "IMPORT FROM EXA AT connectionName TABLE schemaName.tableName ( columnName1, columnName2 )", + + "IMPORT FROM EXA AT connectionName STATEMENT 'select 1'", + "IMPORT FROM EXA AT connectionName STATEMENT 'select 1' STATEMENT 'select 2'" + }) + public void testImportFromDBMSEXA(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "IMPORT FROM ORA AT connectionName TABLE schemaName.tableName", + "IMPORT FROM ORA AT connectionName TABLE schemaName.tableName ( columnName )", + "IMPORT FROM ORA AT connectionName TABLE schemaName.tableName ( columnName1, columnName2 )", + + "IMPORT FROM ORA AT connectionName STATEMENT 'select 1'", + "IMPORT FROM ORA AT connectionName STATEMENT 'select 1' STATEMENT 'select 2'" + }) + public void testImportFromDBMSORA(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "IMPORT FROM JDBC AT connectionName TABLE tableName", + "IMPORT FROM JDBC DRIVER = 'driverName' AT connectionName TABLE tableName" + }) + public void testImportFromDBMSJDBC(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "IMPORT FROM SCRIPT scriptName", + "IMPORT FROM SCRIPT scriptName AT connectionName", + "IMPORT FROM SCRIPT scriptName WITH propertyName = 'value'", + "IMPORT FROM SCRIPT scriptName WITH propertyName = 'value' propertyName2 = 'value2'", + "IMPORT FROM SCRIPT scriptName AT connectionName WITH propertyName = 'value' propertyName2 = 'value2'" + }) + public void testImportFromScript(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "IMPORT FROM CSV FILE 'file.csv' REJECT LIMIT 1", + "IMPORT FROM CSV FILE 'file.csv' REJECT LIMIT UNLIMITED", + + "IMPORT FROM CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS", + "IMPORT FROM CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS", + + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv'", + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv'", + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv'", + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO schemaName.tableName", + + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT 1", + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT 1", + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT 1", + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT 1", + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT 1 ERRORS", + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS", + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS", + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT 1 ERRORS", + + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT UNLIMITED", + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED", + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT UNLIMITED", + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT UNLIMITED", + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS", + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS", + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS", + "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT UNLIMITED ERRORS" + }) + public void testImportErrorClause(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } +} From 7437a75438887cfbdeaa7f17f3d4237983b2a8b0 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Fri, 7 Feb 2025 14:03:35 +0100 Subject: [PATCH 11/27] feat: Simplify grammar --- .../statement/CSVFileDestination.java | 12 +- .../net/sf/jsqlparser/statement/DBMSType.java | 40 ++ .../net/sf/jsqlparser/statement/FileType.java | 15 + ...urce.java => ScriptSourceDestination.java} | 6 +- ...Source.java => SourceDestinationType.java} | 10 +- .../statement/imprt/DBMSSource.java | 26 +- .../statement/imprt/FileSource.java | 12 +- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 575 +++++++++--------- .../statement/imprt/ImportTest.java | 156 +++-- 9 files changed, 439 insertions(+), 413 deletions(-) create mode 100644 src/main/java/net/sf/jsqlparser/statement/DBMSType.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/FileType.java rename src/main/java/net/sf/jsqlparser/statement/{imprt/ScriptSource.java => ScriptSourceDestination.java} (88%) rename src/main/java/net/sf/jsqlparser/statement/{imprt/DataSource.java => SourceDestinationType.java} (52%) diff --git a/src/main/java/net/sf/jsqlparser/statement/CSVFileDestination.java b/src/main/java/net/sf/jsqlparser/statement/CSVFileDestination.java index 2e0e97be7..e47848c8c 100644 --- a/src/main/java/net/sf/jsqlparser/statement/CSVFileDestination.java +++ b/src/main/java/net/sf/jsqlparser/statement/CSVFileDestination.java @@ -15,7 +15,7 @@ public class CSVFileDestination implements ErrorDestination { private ConnectionDefinition connectionDefinition; private boolean local; private boolean secure; - private StringValue filePath; + private StringValue file; public ConnectionDefinition getConnectionDefinition() { return connectionDefinition; @@ -41,12 +41,12 @@ public void setSecure(boolean secure) { this.secure = secure; } - public StringValue getFilePath() { - return filePath; + public StringValue getFile() { + return file; } - public void setFilePath(StringValue filePath) { - this.filePath = filePath; + public void setFile(StringValue file) { + this.file = file; } @Override @@ -68,7 +68,7 @@ public String toString() { } sql.append(" FILE "); - sql.append(filePath); + sql.append(file); return sql.toString(); } diff --git a/src/main/java/net/sf/jsqlparser/statement/DBMSType.java b/src/main/java/net/sf/jsqlparser/statement/DBMSType.java new file mode 100644 index 000000000..c4e4ba015 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/DBMSType.java @@ -0,0 +1,40 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.StringValue; + +public enum DBMSType implements SourceDestinationType { + EXA, + ORA, + JDBC; + + private StringValue jdbcDriverDefinition; + + public StringValue getJDBCDriverDefinition() { + return jdbcDriverDefinition; + } + + public void setJDBCDriverDefinition(StringValue jdbcDriverDefinition) { + this.jdbcDriverDefinition = jdbcDriverDefinition; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append(super.toString()); + if (jdbcDriverDefinition != null) { + sql.append(" DRIVER = ").append(jdbcDriverDefinition); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/FileType.java b/src/main/java/net/sf/jsqlparser/statement/FileType.java new file mode 100644 index 000000000..7d5b8704a --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/FileType.java @@ -0,0 +1,15 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2025 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +public enum FileType implements SourceDestinationType { + CSV, + FBV +} diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/ScriptSource.java b/src/main/java/net/sf/jsqlparser/statement/ScriptSourceDestination.java similarity index 88% rename from src/main/java/net/sf/jsqlparser/statement/imprt/ScriptSource.java rename to src/main/java/net/sf/jsqlparser/statement/ScriptSourceDestination.java index 8f35d0f4c..8423f02ac 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/ScriptSource.java +++ b/src/main/java/net/sf/jsqlparser/statement/ScriptSourceDestination.java @@ -7,16 +7,16 @@ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 * #L% */ -package net.sf.jsqlparser.statement.imprt; +package net.sf.jsqlparser.statement; import net.sf.jsqlparser.expression.StringValue; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.ConnectionDefinition; +import net.sf.jsqlparser.statement.imprt.ImportFromItem; import java.io.Serializable; import java.util.List; -public class ScriptSource extends ImportFromItem implements Serializable { +public class ScriptSourceDestination extends ImportFromItem implements Serializable { private Table script; private ConnectionDefinition connectionDefinition; private List properties; diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/DataSource.java b/src/main/java/net/sf/jsqlparser/statement/SourceDestinationType.java similarity index 52% rename from src/main/java/net/sf/jsqlparser/statement/imprt/DataSource.java rename to src/main/java/net/sf/jsqlparser/statement/SourceDestinationType.java index 5ee393e84..469ccc330 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/DataSource.java +++ b/src/main/java/net/sf/jsqlparser/statement/SourceDestinationType.java @@ -7,13 +7,7 @@ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 * #L% */ -package net.sf.jsqlparser.statement.imprt; +package net.sf.jsqlparser.statement; -public enum DataSource { - EXA, - ORA, - JDBC, - CSV, - FBV, - SCRIPT +public interface SourceDestinationType { } diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java b/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java index 4f1b6d6d9..90b0f5789 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java @@ -14,33 +14,25 @@ import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.ConnectionDefinition; +import net.sf.jsqlparser.statement.SourceDestinationType; import net.sf.jsqlparser.statement.select.PlainSelect; import java.io.Serializable; import java.util.List; public class DBMSSource extends ImportFromItem implements Serializable { - private DataSource dataSource; - private StringValue jdbcDriverDefinition; + private SourceDestinationType sourceType; private ConnectionDefinition connectionDefinition; private Table table; private ExpressionList columns; private List statements; - public DataSource getDataSource() { - return dataSource; + public SourceDestinationType getSourceType() { + return sourceType; } - public void setDataSource(DataSource dataSource) { - this.dataSource = dataSource; - } - - public StringValue getJdbcDriverDefinition() { - return jdbcDriverDefinition; - } - - public void setJdbcDriverDefinition(StringValue jdbcDriverDefinition) { - this.jdbcDriverDefinition = jdbcDriverDefinition; + public void setSourceType(SourceDestinationType sourceType) { + this.sourceType = sourceType; } public ConnectionDefinition getConnectionDefinition() { @@ -79,11 +71,7 @@ public void setStatements(List statements) { public String toString() { StringBuilder sql = new StringBuilder(); - sql.append(dataSource); - - if (jdbcDriverDefinition != null) { - sql.append(" DRIVER = ").append(jdbcDriverDefinition); - } + sql.append(sourceType); sql.append(" "); sql.append(connectionDefinition); diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java b/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java index b682a4a7d..8b20a85ec 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java @@ -17,7 +17,7 @@ import java.util.Objects; public class FileSource extends ImportFromItem implements Serializable { - private DataSource dataSource; + private SourceDestinationType sourceType; private List connectionFileDefinitions; private Boolean local; private Boolean secure; @@ -26,12 +26,12 @@ public class FileSource extends ImportFromItem implements Serializable { private List fileOptions; private CertificateVerification certificateVerification; - public DataSource getDataSource() { - return dataSource; + public SourceDestinationType getSourceType() { + return sourceType; } - public void setDataSource(DataSource dataSource) { - this.dataSource = dataSource; + public void setSourceType(SourceDestinationType sourceType) { + this.sourceType = sourceType; } public List getConnectionFileDefinitions() { @@ -104,7 +104,7 @@ public String toString() { } } - sql.append(dataSource); + sql.append(sourceType); if (connectionFileDefinitions != null) { sql.append(" "); PlainSelect.appendStringListTo(sql, connectionFileDefinitions, false, false); diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index cc44fe77d..15b1dbcc1 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1089,13 +1089,9 @@ LikeClause LikeClause(): { Import Import() #Import: { Import impt = new Import(); Table table; - Column tableColumn; - ExpressionList columns; - ImportColumn importColumn; + ParenthesedExpressionList columns; List importColumns; ImportFromItem fromItem; - ColumnDefinition columnDefinition; - LikeClause likeClause; } { [ @@ -1103,25 +1099,7 @@ Import Import() #Import: { ( table = Table() { impt.setTable(table); } [ columns = ParenthesedColumnList() { impt.setColumns(columns); } ] - | "(" - ( - importColumn = ColumnDefinition() - | importColumn = LikeClause() - ) - { - importColumns = new ArrayList(); - impt.setImportColumns(importColumns); - importColumns.add(importColumn); - } - ( - "," - ( - importColumn = ColumnDefinition() - | importColumn = LikeClause() - ) - { importColumns.add(importColumn); } - )* - ")" + | importColumns = ImportColumns() { impt.setImportColumns(importColumns); } ) ] @@ -1133,18 +1111,59 @@ Import Import() #Import: { } } +Import SubImport() #SubImport: { + Import impt = new Import(); + List importColumns; + ImportFromItem fromItem; +} { + + [ importColumns = ImportColumns() { impt.setImportColumns(importColumns); } ] + + + fromItem = ImportFromItem() { impt.setFromItem(fromItem); } + + { + return impt; + } +} + +List ImportColumns(): { + ImportColumn importColumn; + List importColumns = new ArrayList(); +} { + "(" + ( + importColumn = ColumnDefinition() + | importColumn = LikeClause() + ) + { importColumns.add(importColumn); } + + ( + "," + ( + importColumn = ColumnDefinition() + | importColumn = LikeClause() + ) + { importColumns.add(importColumn); } + )* + ")" + + { + return importColumns; + } +} + ImportFromItem ImportFromItem(): { ImportFromItem importFromItem; ErrorClause errorClause; } { ( - ( - importFromItem = DBMSSource() - | importFromItem = FileSource() - ) - [ LOOKAHEAD(2) errorClause = ErrorClause() { importFromItem.setErrorClause(errorClause); } ] - | importFromItem = ScriptSource() + importFromItem = DBMSSource() + | importFromItem = FileSource() + | importFromItem = ScriptSourceDestination() ) + [ LOOKAHEAD(2) errorClause = ErrorClause() { importFromItem.setErrorClause(errorClause); } ] + { return importFromItem; } @@ -1152,146 +1171,241 @@ ImportFromItem ImportFromItem(): { DBMSSource DBMSSource() #DBMSSource: { DBMSSource dbmsSource = new DBMSSource(); + DBMSType dbmsType; ConnectionDefinition connectionDefinition; Table table; ExpressionList columns; List statements; Token token; } { - ( - { dbmsSource.setDataSource(DataSource.EXA); } - | { dbmsSource.setDataSource(DataSource.ORA); } - | ( - { dbmsSource.setDataSource(DataSource.JDBC); } - [ "=" token = { dbmsSource.setJdbcDriverDefinition(new StringValue(token.image)); }] - ) - ) + dbmsType = DBMSType() { dbmsSource.setSourceType(dbmsType); } connectionDefinition = ConnectionDefinition() { dbmsSource.setConnectionDefinition(connectionDefinition); } ( table = Table() { dbmsSource.setTable(table); } [ LOOKAHEAD(2) columns = ParenthesedColumnList() { dbmsSource.setColumns(columns); } ] - | token = - { - statements = new ArrayList(); - dbmsSource.setStatements(statements); - StringValue stringValue = new StringValue(token.image); - linkAST(stringValue, jjtThis); - statements.add(stringValue); - } - ( - token = - { - stringValue = new StringValue(token.image); - linkAST(stringValue, jjtThis); - statements.add(stringValue); - } - )* + | statements = StatementsList() { dbmsSource.setStatements(statements); } ) { return dbmsSource; } } -FileSource FileSource() #FileSource: { - FileSource fileSource = new FileSource(); - List connectionFileDefinitions = new ArrayList(); - List filePaths; - CertificateVerification certificateVerification; +DBMSType DBMSType(): { + DBMSType dbmsType; +} { + ( + { dbmsType = DBMSType.EXA; } + | { dbmsType = DBMSType.ORA; } + | { dbmsType = DBMSType.JDBC; } + [ "=" token = { dbmsType.setJDBCDriverDefinition(new StringValue(token.image)); }] + ) - Token token = null; - Token token2 = null; - Token token3 = null; + { + return dbmsType; + } +} + +FileType FileType(): { + FileType fileType; } { - ( - ( - ( - { fileSource.setDataSource(DataSource.CSV); } - | { fileSource.setDataSource(DataSource.FBV); } - ) + ( + { fileType = FileType.CSV; } + | { fileType = FileType.FBV; } + ) + { + return fileType; + } +} - ( - { ConnectionDefinition connectionDefinition = null; } - [ - LOOKAHEAD(2) connectionDefinition = CloudConnectionDefinition() - | connectionDefinition = ConnectionDefinition() - ] - token = - { - filePaths = new ArrayList(); - StringValue stringVal = new StringValue(token.image); - linkAST(stringVal, jjtThis); - filePaths.add(stringVal); - } - ( - LOOKAHEAD(2) - token = - { - stringVal = new StringValue(token.image); - linkAST(stringVal, jjtThis); - filePaths.add(stringVal); - } - )* - ) - { connectionFileDefinitions.add(new ConnectionFileDefinition(connectionDefinition, filePaths)); } +StringValue ImportExportStatement() #ImportExportStatement: { + StringValue statement; +} { + token = + { + statement = new StringValue(token.image); + linkAST(statement, jjtThis); + return statement; + } +} - ( +List StatementsList(): { + List statements = new ArrayList(); + StringValue statement; +} { + ( statement = ImportExportStatement() { statements.add(statement); } )+ + + { + return statements; + } +} + +StringValue File() #File: { + Token token; +} { + token = + { + StringValue file = new StringValue(token.image); + linkAST(file, jjtThis); + return file; + } +} + +List FileList(): { + List files = new ArrayList(); + StringValue file; +} { + ( file = File() { files.add(file); } )+ + { + return files; + } +} + +ConnectionFileDefinition ConnectionFileDefinition(): { + ConnectionDefinition connectionDefinition = null; + List files; +} { + connectionDefinition = ConnectionOrCloudConnectionDefinition() + files = FileList() + { + return new ConnectionFileDefinition(connectionDefinition, files); + } +} + +List ConnectionFileDefinitionList(): { + List connectionFileDefinitions = new ArrayList(); + ConnectionFileDefinition connectionFileDefinition; +} { + ( LOOKAHEAD(2) connectionFileDefinition = ConnectionFileDefinition() { connectionFileDefinitions.add(connectionFileDefinition); } )+ + { + return connectionFileDefinitions; + } +} + +CSVColumn CSVSourceColumn(): { + CSVColumn csvColumn; + + Token token; + Token token2; +} { + ( LOOKAHEAD(2) - ( - { connectionDefinition = null; } - [ - LOOKAHEAD(2) connectionDefinition = CloudConnectionDefinition() - | connectionDefinition = ConnectionDefinition() - ] - token = - { - filePaths = new ArrayList(); - stringVal = new StringValue(token.image); - linkAST(stringVal, jjtThis); - filePaths.add(stringVal); - } - ( - LOOKAHEAD(2) - token = - { - stringVal = new StringValue(token.image); - linkAST(stringVal, jjtThis); - filePaths.add(stringVal); - } - )* - ) - { connectionFileDefinitions.add(new ConnectionFileDefinition(connectionDefinition, filePaths)); } - )* - ) - | ( - { fileSource.setLocal(true); } - [ { fileSource.setSecure(true); }] + token= "." "." token2= { csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); } + | token= { csvColumn = new CSVColumn(Long.valueOf(token.image)); } + [ "=" token = { csvColumn.setFormat(new StringValue(token.image)); }] + ) + { + return csvColumn; + } +} - ( - { fileSource.setDataSource(DataSource.CSV); } - | { fileSource.setDataSource(DataSource.FBV); } - ) +List CSVSourceColumnList(): { + List csvColumns = new ArrayList(); + CSVColumn csvColumn; +} { + csvColumn = CSVSourceColumn() { csvColumns.add(csvColumn); } + ( "," csvColumn = CSVSourceColumn() { csvColumns.add(csvColumn); } )* + { + return csvColumns; + } +} + +FBVColumn FBVSourceColumn(): { + FBVColumn fbvColumn; + + Token token; + Token token2; +} { + ( + ( token= | token= ) "=" token2= { fbvColumn = new FBVColumn(token.image, new LongValue(token2.image)); } + | ( token= | token= ) "=" token2= { fbvColumn = new FBVColumn(token.image, new StringValue(token2.image)); } + | token= "=" ( token2= | token2= ) { fbvColumn = new FBVColumn(token.image, token2.image); } + ) + { + return fbvColumn; + } +} +List FBVSourceColumnList(): { + List fbvColumns = new ArrayList(); + FBVColumn fbvColumn; + boolean precedesComma; +} { + fbvColumn = FBVSourceColumn() { fbvColumns.add(fbvColumn); } + ( + { precedesComma = false; } + ["," { precedesComma = true; }] + fbvColumn = FBVSourceColumn() { fbvColumn.setPrecedesComma(precedesComma); fbvColumns.add(fbvColumn); } + )* + { + return fbvColumns; + } +} + +FileOption FileSourceOption(): { + FileOption fileOption; + + Token token; + Token token2; + Token token3; +} { + ( + ( token= | token= | token= ) { fileOption = new FileOption(token.image); } + | ( + ( token= | token= ) "=" token2= { fileOption = new FileOption(token.image, new StringValue(token2.image)); } + | token= "=" token2= { fileOption = new FileOption(token.image, new LongValue(token2.image)); } + ) + | LOOKAHEAD(2) ( - token = - { - filePaths = new ArrayList(); - StringValue stringVal = new StringValue(token.image); - linkAST(stringVal, jjtThis); - filePaths.add(stringVal); - } - ( - token = - { - stringVal = new StringValue(token.image); - linkAST(stringVal, jjtThis); - filePaths.add(stringVal); - } - )* + token= token2= "=" token3= + | token= ( token2= | token2= ) "=" token3= ) - { connectionFileDefinitions.add(new ConnectionFileDefinition(filePaths)); } - ) + { fileOption = new FileOption(token.image + " " + token2.image, new StringValue(token3.image)); } + | token= token2= "=" token3= + { fileOption = new FileOption(token.image + " " + token2.image, new LongValue(token3.image)); } + ) + { + return fileOption; + } +} + +List FileSourceOptionList(): { + List fileOptions = new ArrayList(); + FileOption fileOption; +} { + ( LOOKAHEAD(2) fileOption = FileSourceOption() { fileOptions.add(fileOption); } )+ + { + return fileOptions; + } +} + +FileSource FileSource() #FileSource: { + FileSource fileSource = new FileSource(); + FileType fileType; + List connectionFileDefinitions; + List files; + List csvColumns; + List fbvColumns; + List fileOptions; + CertificateVerification certificateVerification; + + Token token = null; + Token token2 = null; + Token token3 = null; +} { + ( + fileType = FileType() { fileSource.setSourceType(fileType); } + connectionFileDefinitions = ConnectionFileDefinitionList() { fileSource.setConnectionFileDefinitions(connectionFileDefinitions); } + | { fileSource.setLocal(true); } + [ { fileSource.setSecure(true); }] + + fileType = FileType() { fileSource.setSourceType(fileType); } + files = FileList() + { + connectionFileDefinitions = new ArrayList(); + connectionFileDefinitions.add(new ConnectionFileDefinition(files)); + } ) { fileSource.setConnectionFileDefinitions(connectionFileDefinitions); } @@ -1299,135 +1413,13 @@ FileSource FileSource() #FileSource: { LOOKAHEAD(2) "(" ( - ( - { CSVColumn csvColumn; } - ( - LOOKAHEAD(2) - token= - "." "." - token2= - { csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); } - | token= { csvColumn = new CSVColumn(Long.valueOf(token.image)); } - [ "=" token = { csvColumn.setFormat(new StringValue(token.image)); }] - ) - { - List csvColumns = new ArrayList(); - fileSource.setCSVColumns(csvColumns); - csvColumns.add(csvColumn); - } - ( - "," - ( - LOOKAHEAD(2) - token= - "." "." - token2= - { csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); } - | token= { csvColumn = new CSVColumn(Long.valueOf(token.image)); } - [ "=" token = { csvColumn.setFormat(new StringValue(token.image)); }] - ) - { csvColumns.add(csvColumn); } - )* - ) - | { FBVColumn fbvColumn; } - ( - ( - ( - token= - | token= - ) "=" token2= - { fbvColumn = new FBVColumn(token.image, new LongValue(token2.image)); } - | ( - token= - | token= - ) "=" token2= - { fbvColumn = new FBVColumn(token.image, new StringValue(token2.image)); } - | - token= "=" - ( - token2= - | token2= - ) - { fbvColumn = new FBVColumn(token.image, token2.image); } - ) - { - List fbvColumns = new ArrayList(); - fileSource.setFBVColumns(fbvColumns); - fbvColumns.add(fbvColumn); - } - ) - ( - { boolean precedesComma = false; } - ["," { precedesComma = true; }] - ( - ( - token= - | token= - ) "=" token2= - { fbvColumn = new FBVColumn(token.image, new LongValue(token2.image)); } - | ( - token= - | token= - ) "=" token2= - { fbvColumn = new FBVColumn(token.image, new StringValue(token2.image)); } - | - token= "=" - ( - token2= - | token2= - ) - { fbvColumn = new FBVColumn(token.image, token2.image); } - ) - { - fbvColumn.setPrecedesComma(precedesComma); - fbvColumns.add(fbvColumn); - } - )* + csvColumns = CSVSourceColumnList() { fileSource.setCSVColumns(csvColumns); } + | fbvColumns = FBVSourceColumnList() { fileSource.setFBVColumns(fbvColumns); } ) ")" ] - [ - LOOKAHEAD(2) - { - List fileOptions = new ArrayList(); - fileSource.setFileOptions(fileOptions); - FileOption fileOption; - } - ( - LOOKAHEAD(2) - ( - ( - token= - | token= - | token= - ) - { fileOption = new FileOption(token.image); } - | ( - ( - token= - | token= - ) "=" token2= - { fileOption = new FileOption(token.image, new StringValue(token2.image)); } - | token= "=" token2= - { fileOption = new FileOption(token.image, new LongValue(token2.image)); } - ) - | LOOKAHEAD(2) - ( - token= token2= "=" token3= - | token= - ( - token2= - | token2= - ) "=" token3= - ) - { fileOption = new FileOption(token.image + " " + token2.image, new StringValue(token3.image)); } - | token= token2= "=" token3= - { fileOption = new FileOption(token.image + " " + token2.image, new LongValue(token3.image)); } - ) - { fileOptions.add(fileOption); } - )+ - ] + [ LOOKAHEAD(2) fileOptions = FileSourceOptionList() { fileSource.setFileOptions(fileOptions); } ] [ LOOKAHEAD(2) certificateVerification = CertificateVerification() { fileSource.setCertificateVerification(certificateVerification); } ] @@ -1459,8 +1451,8 @@ CertificateVerification CertificateVerification(): { } } -ScriptSource ScriptSource(): { - ScriptSource scriptSource = new ScriptSource(); +ScriptSourceDestination ScriptSourceDestination(): { + ScriptSourceDestination scriptSourceDestination = new ScriptSourceDestination(); ConnectionDefinition connectionDefinition; Table script; String property; @@ -1469,27 +1461,23 @@ ScriptSource ScriptSource(): { Token token; } { - script = Table() { scriptSource.setScript(script); } + script = Table() { scriptSourceDestination.setScript(script); } - [ LOOKAHEAD(2) connectionDefinition = ConnectionDefinition() { scriptSource.setConnectionDefinition(connectionDefinition); } ] + [ LOOKAHEAD(2) connectionDefinition = ConnectionDefinition() { scriptSourceDestination.setConnectionDefinition(connectionDefinition); } ] - [ + [ LOOKAHEAD(2) { List properties = new ArrayList(); List values = new ArrayList(); - scriptSource.setProperties(properties); - scriptSource.setValues(values); + scriptSourceDestination.setProperties(properties); + scriptSourceDestination.setValues(values); } ( LOOKAHEAD(2) - ( - property = RelObjectNameWithoutValue() - "=" - token = { value = new StringValue(token.image); } - ) + property = RelObjectNameWithoutValue() "=" token = { value = new StringValue(token.image); } { properties.add(property); values.add(value); @@ -1498,7 +1486,7 @@ ScriptSource ScriptSource(): { ] { - return scriptSource; + return scriptSourceDestination; } } @@ -1565,6 +1553,18 @@ ConnectionDefinition CloudConnectionDefinition(): { } } +ConnectionDefinition ConnectionOrCloudConnectionDefinition(): { + ConnectionDefinition connectionDefinition; +} { + ( + LOOKAHEAD(2) connectionDefinition = CloudConnectionDefinition() + | connectionDefinition = ConnectionDefinition() + ) + { + return connectionDefinition; + } +} + ErrorClause ErrorClause(): { ErrorClause errorClause = new ErrorClause(); ErrorDestination errorDestination; @@ -1630,22 +1630,17 @@ ErrorDestination ErrorDestination(): { CSVFileDestination CSVFileDestination(): { CSVFileDestination csvFileDestination = new CSVFileDestination(); ConnectionDefinition connectionDefinition; - Token token; + StringValue file; } { ( - ( - LOOKAHEAD(2) connectionDefinition = CloudConnectionDefinition() - | connectionDefinition = ConnectionDefinition() - ) - { csvFileDestination.setConnectionDefinition(connectionDefinition); } + connectionDefinition = ConnectionOrCloudConnectionDefinition() { csvFileDestination.setConnectionDefinition(connectionDefinition); } | { csvFileDestination.setLocal(true); } [ { csvFileDestination.setSecure(true); } ] ) - - token = { csvFileDestination.setFilePath(new StringValue(token.image)); } + file = File() { csvFileDestination.setFile(file); } { return csvFileDestination; @@ -3239,7 +3234,7 @@ PlainSelect PlainSelect() #PlainSelect: selectItems=SelectItemsList() [ LOOKAHEAD(2) intoTables = IntoClause() { plainSelect.setIntoTables(intoTables); } ] - [ LOOKAHEAD(2) (fromItem=FromItem() | fromItem=Import()) + [ LOOKAHEAD(2) (fromItem=FromItem() | fromItem=SubImport()) [ LOOKAHEAD(2) lateralViews=LateralViews() ] [ LOOKAHEAD(2) joins=JoinsList() ] ] diff --git a/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java b/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java index 4c915be26..f6459b557 100644 --- a/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java @@ -20,9 +20,9 @@ public class ImportTest { @ParameterizedTest @ValueSource(strings = { - "IMPORT INTO schemaName.tableName FROM CSV FILE 'file.csv'", - "IMPORT INTO schemaName.tableName ( columnName ) FROM CSV FILE 'file.csv'", - "IMPORT INTO schemaName.tableName ( columnName1, columnName2 ) FROM CSV FILE 'file.csv'" + "IMPORT INTO schemaName.tableName FROM LOCAL CSV FILE 'file.csv'", + "IMPORT INTO schemaName.tableName ( columnName ) FROM LOCAL CSV FILE 'file.csv'", + "IMPORT INTO schemaName.tableName ( columnName1, columnName2 ) FROM LOCAL CSV FILE 'file.csv'" }) public void testImportIntoTable(String sqlStr) throws JSQLParserException { TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); @@ -30,15 +30,15 @@ public void testImportIntoTable(String sqlStr) throws JSQLParserException { @ParameterizedTest @ValueSource(strings = { - "IMPORT INTO ( columnName integer ) FROM CSV FILE 'file.csv'", - "IMPORT INTO ( columnName1 integer, columnName2 varchar(100) ) FROM CSV FILE 'file.csv'", - - "IMPORT INTO ( LIKE schemaName.tableName ) FROM CSV FILE 'file.csv'", - "IMPORT INTO ( LIKE schemaName.tableName ( columnName ) ) FROM CSV FILE 'file.csv'", - "IMPORT INTO ( LIKE schemaName.tableName ( columnName1, columnName2 ) ) FROM CSV FILE 'file.csv'", - "IMPORT INTO ( LIKE schemaName.tableName ( columnName AS aliasName ) ) FROM CSV FILE 'file.csv'", - "IMPORT INTO ( LIKE schemaName.tableName ( columnName aliasName ) ) FROM CSV FILE 'file.csv'", - "IMPORT INTO ( LIKE schemaName.tableName ( columnName1 AS aliasName2, columnName2 AS aliasName2 ) ) FROM CSV FILE 'file.csv'" + "IMPORT INTO ( columnName integer ) FROM LOCAL CSV FILE 'file.csv'", + "IMPORT INTO ( columnName1 integer, columnName2 varchar(100) ) FROM LOCAL CSV FILE 'file.csv'", + + "IMPORT INTO ( LIKE schemaName.tableName ) FROM LOCAL CSV FILE 'file.csv'", + "IMPORT INTO ( LIKE schemaName.tableName ( columnName ) ) FROM LOCAL CSV FILE 'file.csv'", + "IMPORT INTO ( LIKE schemaName.tableName ( columnName1, columnName2 ) ) FROM LOCAL CSV FILE 'file.csv'", + "IMPORT INTO ( LIKE schemaName.tableName ( columnName AS aliasName ) ) FROM LOCAL CSV FILE 'file.csv'", + "IMPORT INTO ( LIKE schemaName.tableName ( columnName aliasName ) ) FROM LOCAL CSV FILE 'file.csv'", + "IMPORT INTO ( LIKE schemaName.tableName ( columnName1 AS aliasName2, columnName2 AS aliasName2 ) ) FROM LOCAL CSV FILE 'file.csv'" }) public void testImportIntoImportColumns(String sqlStr) throws JSQLParserException { TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); @@ -46,9 +46,6 @@ public void testImportIntoImportColumns(String sqlStr) throws JSQLParserExceptio @ParameterizedTest @ValueSource(strings = { - "IMPORT FROM CSV FILE 'file.csv'", - "IMPORT FROM CSV FILE 'file1.csv' FILE 'file2.csv'", - "IMPORT FROM LOCAL CSV FILE 'file.csv'", "IMPORT FROM LOCAL CSV FILE 'file1.csv' FILE 'file2.csv'", @@ -61,13 +58,13 @@ public void testImportFromFileCSV(String sqlStr) throws JSQLParserException { @ParameterizedTest @ValueSource(strings = { - "IMPORT FROM CSV FILE 'file.csv' ( 1 )", - "IMPORT FROM CSV FILE 'file.csv' ( 1, 2 )", - "IMPORT FROM CSV FILE 'file.csv' ( 1 FORMAT = 'format' )", - "IMPORT FROM CSV FILE 'file.csv' ( 1 FORMAT = 'format', 2 FORMAT = 'format' )", - "IMPORT FROM CSV FILE 'file.csv' ( 1 .. 2 )", - "IMPORT FROM CSV FILE 'file.csv' ( 1, 1 .. 2 )", - "IMPORT FROM CSV FILE 'file.csv' ( 1, 1 .. 2, 3 )" + "IMPORT FROM LOCAL CSV FILE 'file.csv' ( 1 )", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ( 1, 2 )", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ( 1 FORMAT = 'format' )", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ( 1 FORMAT = 'format', 2 FORMAT = 'format' )", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ( 1 .. 2 )", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ( 1, 1 .. 2 )", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ( 1, 1 .. 2, 3 )" }) public void testImportFromFileCSVCols(String sqlStr) throws JSQLParserException { TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); @@ -75,9 +72,6 @@ public void testImportFromFileCSVCols(String sqlStr) throws JSQLParserException @ParameterizedTest @ValueSource(strings = { - "IMPORT FROM FBV FILE 'file.csv'", - "IMPORT FROM FBV FILE 'file1.csv' FILE 'file2.csv'", - "IMPORT FROM LOCAL FBV FILE 'file.csv'", "IMPORT FROM LOCAL FBV FILE 'file1.csv' FILE 'file2.csv'", @@ -90,16 +84,16 @@ public void testImportFromFileFBV(String sqlStr) throws JSQLParserException { @ParameterizedTest @ValueSource(strings = { - "IMPORT FROM FBV FILE 'file.fbv' ( SIZE = 1 )", - "IMPORT FROM FBV FILE 'file.fbv' ( START = 1 )", - "IMPORT FROM FBV FILE 'file.fbv' ( FORMAT = 'format' )", - "IMPORT FROM FBV FILE 'file.fbv' ( ALIGN = LEFT )", - "IMPORT FROM FBV FILE 'file.fbv' ( ALIGN = RIGHT )", - "IMPORT FROM FBV FILE 'file.fbv' ( PADDING = 'padding' )", - - "IMPORT FROM FBV FILE 'file.fbv' ( SIZE = 1, START = 1 )", - "IMPORT FROM FBV FILE 'file.fbv' ( SIZE = 1 START = 1 )", - "IMPORT FROM FBV FILE 'file.fbv' ( SIZE = 1 START = 1, FORMAT = 'format' )" + "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( SIZE = 1 )", + "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( START = 1 )", + "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( FORMAT = 'format' )", + "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( ALIGN = LEFT )", + "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( ALIGN = RIGHT )", + "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( PADDING = 'padding' )", + + "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( SIZE = 1, START = 1 )", + "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( SIZE = 1 START = 1 )", + "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( SIZE = 1 START = 1, FORMAT = 'format' )" }) public void testImportFromFileFBVCols(String sqlStr) throws JSQLParserException { TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); @@ -107,19 +101,19 @@ public void testImportFromFileFBVCols(String sqlStr) throws JSQLParserException @ParameterizedTest @ValueSource(strings = { - "IMPORT FROM CSV FILE 'file.csv' ENCODING = 'UTF-8'", - "IMPORT FROM CSV FILE 'file.csv' SKIP = 1", - "IMPORT FROM CSV FILE 'file.csv' TRIM", - "IMPORT FROM CSV FILE 'file.csv' LTRIM", - "IMPORT FROM CSV FILE 'file.csv' RTRIM", - "IMPORT FROM CSV FILE 'file.csv' NULL = 'null'", - "IMPORT FROM CSV FILE 'file.csv' ROW SEPARATOR = 'CRLF'", - "IMPORT FROM CSV FILE 'file.csv' COLUMN SEPARATOR = ','", - "IMPORT FROM CSV FILE 'file.csv' COLUMN DELIMITER = '\"'", - "IMPORT FROM CSV FILE 'file.csv' ROW SIZE = 1", - - "IMPORT FROM CSV FILE 'file.csv' ENCODING = 'UTF-8' SKIP = 1", - "IMPORT FROM CSV FILE 'file.csv' ENCODING = 'UTF-8' SKIP = 1 TRIM" + "IMPORT FROM LOCAL CSV FILE 'file.csv' ENCODING = 'UTF-8'", + "IMPORT FROM LOCAL CSV FILE 'file.csv' SKIP = 1", + "IMPORT FROM LOCAL CSV FILE 'file.csv' TRIM", + "IMPORT FROM LOCAL CSV FILE 'file.csv' LTRIM", + "IMPORT FROM LOCAL CSV FILE 'file.csv' RTRIM", + "IMPORT FROM LOCAL CSV FILE 'file.csv' NULL = 'null'", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ROW SEPARATOR = 'CRLF'", + "IMPORT FROM LOCAL CSV FILE 'file.csv' COLUMN SEPARATOR = ','", + "IMPORT FROM LOCAL CSV FILE 'file.csv' COLUMN DELIMITER = '\"'", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ROW SIZE = 1", + + "IMPORT FROM LOCAL CSV FILE 'file.csv' ENCODING = 'UTF-8' SKIP = 1", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ENCODING = 'UTF-8' SKIP = 1 TRIM" }) public void testImportFromFileFileOpts(String sqlStr) throws JSQLParserException { TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); @@ -127,12 +121,12 @@ public void testImportFromFileFileOpts(String sqlStr) throws JSQLParserException @ParameterizedTest @ValueSource(strings = { - "IMPORT FROM CSV FILE 'file.csv' VERIFY CERTIFICATE", - "IMPORT FROM CSV FILE 'file.csv' IGNORE CERTIFICATE", - "IMPORT FROM CSV FILE 'file.csv' PUBLIC KEY 'publicKey'", + "IMPORT FROM LOCAL CSV FILE 'file.csv' VERIFY CERTIFICATE", + "IMPORT FROM LOCAL CSV FILE 'file.csv' IGNORE CERTIFICATE", + "IMPORT FROM LOCAL CSV FILE 'file.csv' PUBLIC KEY 'publicKey'", - "IMPORT FROM CSV FILE 'file.csv' VERIFY CERTIFICATE PUBLIC KEY 'publicKey'", - "IMPORT FROM CSV FILE 'file.csv' IGNORE CERTIFICATE PUBLIC KEY 'publicKey'" + "IMPORT FROM LOCAL CSV FILE 'file.csv' VERIFY CERTIFICATE PUBLIC KEY 'publicKey'", + "IMPORT FROM LOCAL CSV FILE 'file.csv' IGNORE CERTIFICATE PUBLIC KEY 'publicKey'" }) public void testImportFromFileCertVerification(String sqlStr) throws JSQLParserException { TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); @@ -231,34 +225,34 @@ public void testImportFromScript(String sqlStr) throws JSQLParserException { @ParameterizedTest @ValueSource(strings = { - "IMPORT FROM CSV FILE 'file.csv' REJECT LIMIT 1", - "IMPORT FROM CSV FILE 'file.csv' REJECT LIMIT UNLIMITED", - - "IMPORT FROM CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS", - "IMPORT FROM CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS", - - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv'", - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv'", - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv'", - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO schemaName.tableName", - - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT 1", - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT 1", - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT 1", - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT 1", - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT 1 ERRORS", - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS", - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS", - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT 1 ERRORS", - - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT UNLIMITED", - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED", - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT UNLIMITED", - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT UNLIMITED", - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS", - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS", - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS", - "IMPORT FROM CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT UNLIMITED ERRORS" + "IMPORT FROM LOCAL CSV FILE 'file.csv' REJECT LIMIT 1", + "IMPORT FROM LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED", + + "IMPORT FROM LOCAL CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS", + "IMPORT FROM LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS", + + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv'", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv'", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv'", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName", + + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT 1", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT 1", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT 1", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT 1", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT 1 ERRORS", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT 1 ERRORS", + + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT UNLIMITED", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT UNLIMITED", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT UNLIMITED", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS", + "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT UNLIMITED ERRORS" }) public void testImportErrorClause(String sqlStr) throws JSQLParserException { TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); From f495c96b434c5b592a8da87d03ebc5e2207724fc Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Fri, 7 Feb 2025 14:43:21 +0100 Subject: [PATCH 12/27] test: Implement test for sub IMPORT --- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 14 +++++++++----- .../sf/jsqlparser/statement/select/SelectTest.java | 10 ++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 15b1dbcc1..23a1d19a9 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1116,11 +1116,13 @@ Import SubImport() #SubImport: { List importColumns; ImportFromItem fromItem; } { - - [ importColumns = ImportColumns() { impt.setImportColumns(importColumns); } ] + "(" + + [ importColumns = ImportColumns() { impt.setImportColumns(importColumns); } ] - - fromItem = ImportFromItem() { impt.setFromItem(fromItem); } + + fromItem = ImportFromItem() { impt.setFromItem(fromItem); } + ")" { return impt; @@ -3234,7 +3236,7 @@ PlainSelect PlainSelect() #PlainSelect: selectItems=SelectItemsList() [ LOOKAHEAD(2) intoTables = IntoClause() { plainSelect.setIntoTables(intoTables); } ] - [ LOOKAHEAD(2) (fromItem=FromItem() | fromItem=SubImport()) + [ LOOKAHEAD(2) fromItem=FromItem() [ LOOKAHEAD(2) lateralViews=LateralViews() ] [ LOOKAHEAD(2) joins=JoinsList() ] ] @@ -3818,6 +3820,8 @@ FromItem FromItem() #FromItem: | fromItem=LateralSubSelect() | + LOOKAHEAD(2) fromItem=SubImport() { fromItem = new ParenthesedFromItem(fromItem); } + | LOOKAHEAD({ getAsBoolean(Feature.allowUnparenthesizedSubSelects) }) fromItem=Select() ) diff --git a/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java b/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java index b77d17cd9..b4b62a7c3 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java @@ -6154,4 +6154,14 @@ public void testSelectWithSkylineKeywords() throws JSQLParserException { select.getPlainSelect().getSelectItems().toString()); } + @ParameterizedTest + @ValueSource(strings = { + "SELECT * FROM ( IMPORT FROM EXA AT connectionName STATEMENT 'select 1' )", + "SELECT * FROM ( IMPORT INTO ( LIKE schemaName.tableName ( a, b as c) ) FROM EXA AT connectionName STATEMENT 'select 1' )", + "SELECT * FROM schemaName.tableName JOIN ( IMPORT FROM EXA AT connectionName STATEMENT 'select 1' ) USING ( columnName )" + }) + public void testSelectWithSubImport(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + } From 60bb98d65bc310300d3e1b9aa2223383d5c7103f Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Fri, 7 Feb 2025 16:24:20 +0100 Subject: [PATCH 13/27] fix: Use double dot token in IMPORT --- src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index eec065eb8..03f239f3e 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1298,7 +1298,7 @@ CSVColumn CSVSourceColumn(): { } { ( LOOKAHEAD(2) - token= "." "." token2= { csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); } + token= ".." token2= { csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); } | token= { csvColumn = new CSVColumn(Long.valueOf(token.image)); } [ "=" token = { csvColumn.setFormat(new StringValue(token.image)); }] ) From 34fc6ddab5fd5b15c53e05f5bc5068d2f1906a33 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Fri, 7 Feb 2025 17:08:44 +0100 Subject: [PATCH 14/27] feat: Implement EXPORT statement Implement Exasol EXPORT statement (see https://docs.exasol.com/db/latest/sql/export.htm) --- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 260 +++++++++++++++++- 1 file changed, 253 insertions(+), 7 deletions(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 03f239f3e..84b72be72 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -166,6 +166,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -188,6 +189,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -225,6 +227,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -240,6 +243,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -279,6 +283,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -380,7 +385,9 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | +| | | | @@ -874,6 +881,8 @@ Statement SingleStatement() : stm = PurgeStatement() | stm = Import() + | + stm = Export() ) { return stm; } } @@ -1091,6 +1100,28 @@ LikeClause LikeClause(): { } } +Export Export() #Export: { + Export export = new Export(); + Table table; + ParenthesedExpressionList columns; + ParenthesedSelect select; + ExportIntoItem exportIntoItem; +} { + + ( + table = Table() { export.setTable(table); } + [ columns = ParenthesedColumnList() { impt.setColumns(columns); } ] + | select = ParenthesedSelect() { export.setSelect(select); } + ) + + + exportIntoItem = ExportIntoItem() { export.setExportIntoItem(exportIntoItem); } + + { + return export; + } +} + Import Import() #Import: { Import impt = new Import(); Table table; @@ -1160,6 +1191,22 @@ List ImportColumns(): { } } +ExportIntoItem ExportIntoItem(): { + ExportIntoItem exportIntoItem; + ErrorClause errorClause; +} { + ( + exportIntoItem = DBMSDestination() + | exportIntoItem = FileDestination() + | exportIntoItem = ScriptSourceDestination() + ) + [ LOOKAHEAD(2) errorClause = ErrorClause() { exportIntoItem.setErrorClause(errorClause); } ] + + { + return exportIntoItem; + } +} + ImportFromItem ImportFromItem(): { ImportFromItem importFromItem; ErrorClause errorClause; @@ -1176,6 +1223,62 @@ ImportFromItem ImportFromItem(): { } } +DBMSDestination DBMSDestination() #DBMSDestination: { + DBMSDestination dbmsDestination = new DBMSDestination(); + DBMSType dbmsType; + ConnectionDefinition connectionDefinition; + Table table; + ExpressionList columns; + StringValue statement; + List dbmsTableDestinationOptions; +} { + dbmsType = DBMSType() { dbmsDestination.setSourceType(dbmsType); } + + connectionDefinition = ConnectionDefinition() { dbmsDestination.setConnectionDefinition(connectionDefinition); } + + ( + LOOKAHEAD(3) + table = Table() { dbmsDestination.setTable(table); } + [ LOOKAHEAD(2) columns = ParenthesedColumnList() { dbmsDestination.setColumns(columns); } ] + [ LOOKAHEAD(2) dbmsTableDestinationOptions = DBMSTableDestinationOptionList() { dbmsDestination.setDBMSTableDestinationOptionList(dbmsTableDestinationOptions); } ] + | statement = ImportExportStatement() { dbmsDestination.setStatement(statement); } + ) + + { + return dbmsDestination; + } +} + +DBMSTableDestinationOption DBMSTableDestinationOption(): { + DBMSTableDestinationOption dbmsTableDestinationOption; + + Token token; + Token token2; + Token token3; +} { + ( + ( + token = + | token = + ) { dbmsTableDestinationOption = new DBMSTableDestinationOption(token.image); } + | token = token2 = token3 = { dbmsTableDestinationOption = new DBMSTableDestinationOption(token.image + " " + token2.image, new StringValue(token3.image)); } + ) + + { + return dbmsTableDestinationOption; + } +} + +List DBMSTableDestinationOptionList(): { + List dbmsTableDestinationOptions = new ArrayList(); + DBMSTableDestinationOption dbmsTableDestinationOption; +} { + ( LOOKAHEAD(2) dbmsTableDestinationOption = DBMSTableDestinationOption() { dbmsTableDestinationOptions.add(dbmsTableDestinationOption); } )+ + { + return dbmsTableDestinationOptions; + } +} + DBMSSource DBMSSource() #DBMSSource: { DBMSSource dbmsSource = new DBMSSource(); DBMSType dbmsType; @@ -1192,7 +1295,7 @@ DBMSSource DBMSSource() #DBMSSource: { ( table = Table() { dbmsSource.setTable(table); } [ LOOKAHEAD(2) columns = ParenthesedColumnList() { dbmsSource.setColumns(columns); } ] - | statements = StatementsList() { dbmsSource.setStatements(statements); } + | statements = ImportExportStatementsList() { dbmsSource.setStatements(statements); } ) { return dbmsSource; @@ -1237,7 +1340,7 @@ StringValue ImportExportStatement() #ImportExportStatement: { } } -List StatementsList(): { +List ImportExportStatementsList(): { List statements = new ArrayList(); StringValue statement; } { @@ -1290,6 +1393,44 @@ List ConnectionFileDefinitionList(): { } } +CSVColumn CSVDestinationColumn(): { + CSVColumn csvColumn; + + Token token; + Token token2; +} { + ( + LOOKAHEAD(2) + token= ".." token2= { csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); } + | token= { csvColumn = new CSVColumn(Long.valueOf(token.image)); } + [ "=" token = { csvColumn.setFormat(new StringValue(token.image)); }] + [ + + "=" + ( + token= + | token= + | token= + ) + { csvColumn.setDelimit(token.image); } + ] + ) + { + return csvColumn; + } +} + +List CSVDestinationColumnList(): { + List csvColumns = new ArrayList(); + CSVColumn csvColumn; +} { + csvColumn = CSVDestinationColumn() { csvColumns.add(csvColumn); } + ( "," csvColumn = CSVDestinationColumn() { csvColumns.add(csvColumn); } )* + { + return csvColumns; + } +} + CSVColumn CSVSourceColumn(): { CSVColumn csvColumn; @@ -1318,6 +1459,38 @@ List CSVSourceColumnList(): { } } +FBVColumn FBVDestinationColumn(): { + FBVColumn fbvColumn; + + Token token; + Token token2; +} { + ( + token= "=" token2= { fbvColumn = new FBVColumn(token.image, new LongValue(token2.image)); } + | ( token= | token= ) "=" token2= { fbvColumn = new FBVColumn(token.image, new StringValue(token2.image)); } + | token= "=" ( token2= | token2= ) { fbvColumn = new FBVColumn(token.image, token2.image); } + ) + { + return fbvColumn; + } +} + +List FBVDestinationColumnList(): { + List fbvColumns = new ArrayList(); + FBVColumn fbvColumn; + boolean precedesComma; +} { + fbvColumn = FBVDestinationColumn() { fbvColumns.add(fbvColumn); } + ( + { precedesComma = false; } + ["," { precedesComma = true; }] + fbvColumn = FBVDestinationColumn() { fbvColumn.setPrecedesComma(precedesComma); fbvColumns.add(fbvColumn); } + )* + { + return fbvColumns; + } +} + FBVColumn FBVSourceColumn(): { FBVColumn fbvColumn; @@ -1350,6 +1523,39 @@ List FBVSourceColumnList(): { } } +FileOption FileDestinationOption(): { + FileOption fileOption; + + Token token; + Token token2; + Token token3; +} { + ( + ( token= | token= ) { fileOption = new FileOption(token.image); } + | token= token2= token3= { fileOption = new FileOption(token.image + " " + token2.image + " " + token3.image); } + | ( token= | token= | token= ) "=" token2= { fileOption = new FileOption(token.image, new StringValue(token2.image)); } + | ( + token= token2= "=" token3= + | token= ( token2= | token2= ) "=" token3= + ) + { fileOption = new FileOption(token.image + " " + token2.image, new StringValue(token3.image)); } + | token= "=" ( token2= | token2= | token2= ) { fileOption = new FileOption(token.image, token2.image); } + ) + { + return fileOption; + } +} + +List FileDestinationOptionList(): { + List fileOptions = new ArrayList(); + FileOption fileOption; +} { + ( LOOKAHEAD(2) fileOption = FileDestinationOption() { fileOptions.add(fileOption); } )+ + { + return fileOptions; + } +} + FileOption FileSourceOption(): { FileOption fileOption; @@ -1387,6 +1593,50 @@ List FileSourceOptionList(): { } } +FileDestination FileDestination() #FileDestination: { + FileDestination fileDestination = new FileDestination(); + FileType fileType; + List connectionFileDefinitions; + List files; + List csvColumns; + List fbvColumns; + List fileOptions; + CertificateVerification certificateVerification; +} { + ( + fileType = FileType() { fileDestination.setDestinationType(fileType); } + connectionFileDefinitions = ConnectionFileDefinitionList() { fileDestination.setConnectionFileDefinitions(connectionFileDefinitions); } + | { fileDestination.setLocal(true); } + [ { fileDestination.setSecure(true); }] + + fileType = FileType() { fileDestination.setDestinationType(fileType); } + files = FileList() + { + connectionFileDefinitions = new ArrayList(); + connectionFileDefinitions.add(new ConnectionFileDefinition(files)); + } + ) + { fileDestination.setConnectionFileDefinitions(connectionFileDefinitions); } + + [ + LOOKAHEAD(2) + "(" + ( + csvColumns = CSVDestinationColumnList() { fileDestination.setCSVColumns(csvColumns); } + | fbvColumns = FBVDestinationColumnList() { fileDestination.setFBVColumns(fbvColumns); } + ) + ")" + ] + + [ LOOKAHEAD(2) fileOptions = FileDestinationOptionList() { fileDestination.setFileOptions(fileOptions); } ] + + [ LOOKAHEAD(2) certificateVerification = CertificateVerification() { fileDestination.setCertificateVerification(certificateVerification); } ] + + { + return fileDestination; + } +} + FileSource FileSource() #FileSource: { FileSource fileSource = new FileSource(); FileType fileType; @@ -1396,10 +1646,6 @@ FileSource FileSource() #FileSource: { List fbvColumns; List fileOptions; CertificateVerification certificateVerification; - - Token token = null; - Token token2 = null; - Token token3 = null; } { ( fileType = FileType() { fileSource.setSourceType(fileType); } @@ -1614,7 +1860,7 @@ RejectClause RejectClause(): { | ) - [ { rejectClause.setErrors(true); } ] + [ LOOKAHEAD(2) { rejectClause.setErrors(true); } ] { return rejectClause; From c4e5907ec74fb9720e4fcedd6a808b65cb5cab4f Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Mon, 10 Feb 2025 09:14:16 +0100 Subject: [PATCH 15/27] refactor: Fix file extension in IMPORT tests --- .../net/sf/jsqlparser/statement/imprt/ImportTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java b/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java index f6459b557..af8ea619c 100644 --- a/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java @@ -72,11 +72,11 @@ public void testImportFromFileCSVCols(String sqlStr) throws JSQLParserException @ParameterizedTest @ValueSource(strings = { - "IMPORT FROM LOCAL FBV FILE 'file.csv'", - "IMPORT FROM LOCAL FBV FILE 'file1.csv' FILE 'file2.csv'", + "IMPORT FROM LOCAL FBV FILE 'file.fbv'", + "IMPORT FROM LOCAL FBV FILE 'file1.fbv' FILE 'file2.fbv'", - "IMPORT FROM LOCAL SECURE FBV FILE 'file.csv'", - "IMPORT FROM LOCAL SECURE FBV FILE 'file1.csv' FILE 'file2.csv'" + "IMPORT FROM LOCAL SECURE FBV FILE 'file.fbv'", + "IMPORT FROM LOCAL SECURE FBV FILE 'file1.fbv' FILE 'file2.fbv'" }) public void testImportFromFileFBV(String sqlStr) throws JSQLParserException { TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); From c1129a0d8996fcf6a0aacd775e3bd04b14e72a3d Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Mon, 10 Feb 2025 09:15:04 +0100 Subject: [PATCH 16/27] test: Implement unit tests for EXPORT statement --- .../statement/export/ExportTest.java | 256 ++++++++++++++++++ 1 file changed, 256 insertions(+) create mode 100644 src/test/java/net/sf/jsqlparser/statement/export/ExportTest.java diff --git a/src/test/java/net/sf/jsqlparser/statement/export/ExportTest.java b/src/test/java/net/sf/jsqlparser/statement/export/ExportTest.java new file mode 100644 index 000000000..bbe4c2ab9 --- /dev/null +++ b/src/test/java/net/sf/jsqlparser/statement/export/ExportTest.java @@ -0,0 +1,256 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.export; + +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.test.TestUtils; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +@Execution(ExecutionMode.CONCURRENT) +public class ExportTest { + @ParameterizedTest + @ValueSource(strings = { + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv'", + "EXPORT schemaName.tableName ( columnName ) INTO LOCAL CSV FILE 'file.csv'", + "EXPORT schemaName.tableName ( columnName1, columnName2 ) INTO LOCAL CSV FILE 'file.csv'", + + "EXPORT ( select 1 ) INTO LOCAL CSV FILE 'file.csv'", + }) + public void testExport(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv'", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file1.csv' FILE 'file2.csv'", + + "EXPORT schemaName.tableName INTO LOCAL SECURE CSV FILE 'file.csv'", + "EXPORT schemaName.tableName INTO LOCAL SECURE CSV FILE 'file1.csv' FILE 'file2.csv'" + }) + public void testExportIntoFileCSV(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 )", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1, 2 )", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 FORMAT = 'format' )", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 DELIMIT = ALWAYS )", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 DELIMIT = NEVER )", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 DELIMIT = AUTO )", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 FORMAT = 'format', 2 FORMAT = 'format', DELIMIT = ALWAYS )", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 .. 2 )", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1, 1 .. 2 )", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1, 1 .. 2, 3 )" + }) + public void testExportIntoFileCSVCols(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv'", + "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file1.fbv' FILE 'file2.fbv'", + + "EXPORT schemaName.tableName INTO LOCAL SECURE FBV FILE 'file.fbv'", + "EXPORT schemaName.tableName INTO LOCAL SECURE FBV FILE 'file1.fbv' FILE 'file2.fbv'" + }) + public void testExportIntoFileFBV(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( SIZE = 1 )", + "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( FORMAT = 'format' )", + "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( ALIGN = LEFT )", + "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( ALIGN = RIGHT )", + "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( PADDING = 'padding' )", + + "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( SIZE = 1, START = 1 )", + "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( SIZE = 1 START = 1 )", + "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( SIZE = 1 START = 1, FORMAT = 'format' )" + }) + public void testExportIntoFileFBVCols(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ENCODING = 'UTF-8'", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' REPLACE", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' TRUNCATE", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' NULL = 'null'", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' BOOLEAN = 'yes/no'", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ROW SEPARATOR = 'CRLF'", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' COLUMN SEPARATOR = ','", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' COLUMN DELIMITER = '\"'", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' DELIMIT = ALWAYS", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' DELIMIT = NEVER", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' DELIMIT = AUTO", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' WITH COLUMN NAMES", + + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ENCODING = 'UTF-8' REPLACE", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ENCODING = 'UTF-8' REPLACE WITH COLUMN NAMES" + }) + public void testExportIntoFileFileOpts(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' VERIFY CERTIFICATE", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' IGNORE CERTIFICATE", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' PUBLIC KEY 'publicKey'", + + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' VERIFY CERTIFICATE PUBLIC KEY 'publicKey'", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' IGNORE CERTIFICATE PUBLIC KEY 'publicKey'" + }) + public void testExportIntoFileCertVerification(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "EXPORT schemaName.tableName INTO CSV AT connectionName FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT '127.0.0.1' FILE 'file.csv'", + + "EXPORT schemaName.tableName INTO CSV AT connectionName USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'", + + "EXPORT schemaName.tableName INTO CSV AT connectionName IGNORE CERTIFICATE FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT connectionName VERIFY CERTIFICATE FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT connectionName PUBLIC KEY 'publicKey' FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT connectionName IGNORE CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT connectionName VERIFY CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'", + + "EXPORT schemaName.tableName INTO CSV AT connectionName USER 'user' IDENTIFIED BY 'password' IGNORE CERTIFICATE FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' IGNORE CERTIFICATE FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT connectionName USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT connectionName USER 'user' IDENTIFIED BY 'password' PUBLIC KEY 'publicKey' FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' PUBLIC KEY 'publicKey' FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT connectionName USER 'user' IDENTIFIED BY 'password' IGNORE CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' IGNORE CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT connectionName USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'" + }) + public void testExportIntoConnectionDef(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "EXPORT schemaName.tableName INTO CSV AT CLOUD NONE connectionName FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT CLOUD NONE '127.0.0.1' FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT CLOUD NONE connectionName USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT CLOUD NONE '127.0.0.1' USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT CLOUD AZURE BLOBSTORAGE connectionName FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT CLOUD AZURE BLOBSTORAGE '127.0.0.1' FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT CLOUD AZURE BLOBSTORAGE connectionName USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'", + "EXPORT schemaName.tableName INTO CSV AT CLOUD AZURE BLOBSTORAGE '127.0.0.1' USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'" + }) + public void testExportIntoCloudConnectionDef(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName", + "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName ( columnName )", + "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName ( columnName1, columnName2 )", + + "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName REPLACE", + "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName TRUNCATE", + "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName CREATED BY 'CREATE OR REPLACE TABLE schemaName (columnName INTEGER)'", + + "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName REPLACE TRUNCATE", + "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName ( columnName ) REPLACE TRUNCATE", + "EXPORT schemaName.tableName INTO EXA AT connectionName TABLE schemaName.tableName ( columnName1, columnName2 ) REPLACE TRUNCATE", + + "EXPORT schemaName.tableName INTO EXA AT connectionName STATEMENT 'insert into schemaName.tableName ( columnName ) values ( ? )'" + }) + public void testExportIntoDBMSEXA(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "EXPORT schemaName.tableName INTO ORA AT connectionName TABLE schemaName.tableName", + "EXPORT schemaName.tableName INTO ORA AT connectionName TABLE schemaName.tableName ( columnName )", + "EXPORT schemaName.tableName INTO ORA AT connectionName TABLE schemaName.tableName ( columnName1, columnName2 )", + + "EXPORT schemaName.tableName INTO ORA AT connectionName STATEMENT 'insert into schemaName.tableName ( columnName ) values ( ? )'" + }) + public void testExportIntoDBMSORA(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "EXPORT schemaName.tableName INTO JDBC AT connectionName TABLE tableName", + "EXPORT schemaName.tableName INTO JDBC DRIVER = 'driverName' AT connectionName TABLE tableName" + }) + public void testExportIntoDBMSJDBC(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "EXPORT schemaName.tableName INTO SCRIPT scriptName", + "EXPORT schemaName.tableName INTO SCRIPT scriptName AT connectionName", + "EXPORT schemaName.tableName INTO SCRIPT scriptName WITH propertyName = 'value'", + "EXPORT schemaName.tableName INTO SCRIPT scriptName WITH propertyName = 'value' propertyName2 = 'value2'", + "EXPORT schemaName.tableName INTO SCRIPT scriptName AT connectionName WITH propertyName = 'value' propertyName2 = 'value2'" + }) + public void testExportIntoScript(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } + + @ParameterizedTest + @ValueSource(strings = { + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT 1", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED", + + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS", + + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv'", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv'", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv'", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName", + + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT 1", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT 1", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT 1", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT 1", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT 1 ERRORS", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT 1 ERRORS", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT 1 ERRORS", + + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT UNLIMITED", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT UNLIMITED", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT UNLIMITED", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO CSV AT connectionName FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO LOCAL SECURE CSV FILE 'file.csv' REJECT LIMIT UNLIMITED ERRORS", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT UNLIMITED ERRORS" + }) + public void testImportErrorClause(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + } +} From 34791cf467c44b34aee96b2feb6a04acf150ece5 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Mon, 10 Feb 2025 10:47:52 +0100 Subject: [PATCH 17/27] feat: Implement classes for EXPORT statement --- src/main/java/module-info.java | 1 + .../sf/jsqlparser/statement/CSVColumn.java | 20 ++- .../sf/jsqlparser/statement/FileOption.java | 20 ++- .../statement/FileSourceDestination.java | 132 ++++++++++++++++++ .../statement/ScriptSourceDestination.java | 14 +- .../statement/StatementVisitor.java | 7 + .../statement/StatementVisitorAdapter.java | 6 + .../statement/export/DBMSDestination.java | 117 ++++++++++++++++ .../export/DBMSTableDestinationOption.java | 64 +++++++++ .../jsqlparser/statement/export/Export.java | 81 +++++++++++ .../statement/export/ExportIntoItem.java | 18 +++ .../statement/export/FileDestination.java | 50 +++++++ .../statement/imprt/DBMSSource.java | 14 +- .../statement/imprt/FileSource.java | 110 ++------------- .../statement/imprt/ImportFromItem.java | 12 +- .../sf/jsqlparser/util/TablesNamesFinder.java | 11 ++ .../util/deparser/StatementDeParser.java | 7 + .../validator/StatementValidator.java | 10 ++ .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 7 +- 19 files changed, 583 insertions(+), 118 deletions(-) create mode 100644 src/main/java/net/sf/jsqlparser/statement/FileSourceDestination.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/export/DBMSDestination.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/export/Export.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/export/ExportIntoItem.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/export/FileDestination.java diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index e7f76ae53..6765fe187 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -36,6 +36,7 @@ exports net.sf.jsqlparser.statement.delete; exports net.sf.jsqlparser.statement.drop; exports net.sf.jsqlparser.statement.execute; + exports net.sf.jsqlparser.statement.export; exports net.sf.jsqlparser.statement.grant; exports net.sf.jsqlparser.statement.imprt; exports net.sf.jsqlparser.statement.insert; diff --git a/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java b/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java index f41739dd3..d38aea39c 100644 --- a/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java +++ b/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java @@ -15,6 +15,7 @@ public class CSVColumn { private Long startIndex; private Long endIndex; private StringValue format; + private String delimit; public CSVColumn(Long startIndex, Long endIndex) { this.startIndex = startIndex; @@ -57,6 +58,14 @@ public void setFormat(StringValue format) { this.format = format; } + public String getDelimit() { + return delimit; + } + + public void setDelimit(String delimit) { + this.delimit = delimit; + } + @Override public String toString() { StringBuilder sql = new StringBuilder(); @@ -65,9 +74,14 @@ public String toString() { if (endIndex != null) { sql.append(" .. "); sql.append(endIndex); - } else if (format != null) { - sql.append(" FORMAT = "); - sql.append(format); + } else if (format != null || delimit != null) { + if (format != null) { + sql.append(" FORMAT = "); + sql.append(format); + } else { + sql.append(" DELIMIT = "); + sql.append(delimit); + } } return sql.toString(); diff --git a/src/main/java/net/sf/jsqlparser/statement/FileOption.java b/src/main/java/net/sf/jsqlparser/statement/FileOption.java index f26c31690..735cd6bfb 100644 --- a/src/main/java/net/sf/jsqlparser/statement/FileOption.java +++ b/src/main/java/net/sf/jsqlparser/statement/FileOption.java @@ -16,10 +16,18 @@ public class FileOption { private String key; private Expression value; + private String stringValue; private FileOption(String key, Expression value) { this.key = key; this.value = value; + this.stringValue = null; + } + + public FileOption(String key, String value) { + this.key = key; + this.value = null; + this.stringValue = value; } public FileOption(String key) { @@ -54,14 +62,22 @@ public void setValue(LongValue value) { this.value = value; } + public void setValue(String value) { + this.stringValue = value; + } + @Override public String toString() { StringBuilder sql = new StringBuilder(); sql.append(key); - if (value != null) { + if (value != null || stringValue != null) { sql.append(" = "); - sql.append(value); + if (stringValue != null) { + sql.append(stringValue); + } else { + sql.append(value); + } } return sql.toString(); diff --git a/src/main/java/net/sf/jsqlparser/statement/FileSourceDestination.java b/src/main/java/net/sf/jsqlparser/statement/FileSourceDestination.java new file mode 100644 index 000000000..722301747 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/FileSourceDestination.java @@ -0,0 +1,132 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.statement.select.PlainSelect; + +import java.io.Serializable; +import java.util.List; +import java.util.Objects; + +public abstract class FileSourceDestination implements Serializable { + private SourceDestinationType type; + private List connectionFileDefinitions; + private Boolean local; + private Boolean secure; + private List csvColumns; + private List fbvColumns; + private List fileOptions; + private CertificateVerification certificateVerification; + + protected SourceDestinationType getType() { + return type; + } + + protected void setType(SourceDestinationType type) { + this.type = type; + } + + public List getConnectionFileDefinitions() { + return connectionFileDefinitions; + } + + public void setConnectionFileDefinitions(List connectionFileDefinitions) { + this.connectionFileDefinitions = connectionFileDefinitions; + } + + public Boolean isLocal() { + return local; + } + + public void setLocal(Boolean local) { + this.local = local; + } + + public Boolean isSecure() { + return secure; + } + + public void setSecure(Boolean secure) { + this.secure = secure; + } + + public List getCSVColumns() { + return csvColumns; + } + + public void setCSVColumns(List csvColumns) { + this.csvColumns = csvColumns; + } + + public List getFBVColumns() { + return fbvColumns; + } + + public void setFBVColumns(List fbvColumns) { + this.fbvColumns = fbvColumns; + } + + public List getFileOptions() { + return fileOptions; + } + + public void setFileOptions(List fileOptions) { + this.fileOptions = fileOptions; + } + + public CertificateVerification getCertificateVerification() { + return certificateVerification; + } + + public void setCertificateVerification(CertificateVerification certificateVerification) { + this.certificateVerification = certificateVerification; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + if (local != null) { + if (local) { + sql.append("LOCAL "); + } + + if (Objects.requireNonNullElse(secure, false)) { + sql.append("SECURE "); + } + } + + sql.append(type); + if (connectionFileDefinitions != null) { + sql.append(" "); + PlainSelect.appendStringListTo(sql, connectionFileDefinitions, false, false); + } + + if (csvColumns != null) { + sql.append(" "); + PlainSelect.appendStringListTo(sql, csvColumns, true, true); + } else if (fbvColumns != null) { + sql.append(" "); + PlainSelect.appendStringListTo(sql, fbvColumns, false, true); + } + + if (fileOptions != null) { + sql.append(" "); + PlainSelect.appendStringListTo(sql, fileOptions, false, false); + } + + if (certificateVerification != null) { + sql.append(" "); + sql.append(certificateVerification); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/ScriptSourceDestination.java b/src/main/java/net/sf/jsqlparser/statement/ScriptSourceDestination.java index 8423f02ac..8b1ea2246 100644 --- a/src/main/java/net/sf/jsqlparser/statement/ScriptSourceDestination.java +++ b/src/main/java/net/sf/jsqlparser/statement/ScriptSourceDestination.java @@ -11,16 +11,18 @@ import net.sf.jsqlparser.expression.StringValue; import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.export.ExportIntoItem; import net.sf.jsqlparser.statement.imprt.ImportFromItem; import java.io.Serializable; import java.util.List; -public class ScriptSourceDestination extends ImportFromItem implements Serializable { +public class ScriptSourceDestination implements ImportFromItem, ExportIntoItem, Serializable { private Table script; private ConnectionDefinition connectionDefinition; private List properties; private List values; + private ErrorClause errorClause; public Table getScript() { return script; @@ -54,6 +56,16 @@ public void setValues(List values) { this.values = values; } + @Override + public ErrorClause getErrorClause() { + return errorClause; + } + + @Override + public void setErrorClause(ErrorClause errorClause) { + this.errorClause = errorClause; + } + @Override public String toString() { StringBuilder sql = new StringBuilder(); diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java index e2a84fa1f..cefcecfa4 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java @@ -27,6 +27,7 @@ import net.sf.jsqlparser.statement.delete.ParenthesedDelete; import net.sf.jsqlparser.statement.drop.Drop; import net.sf.jsqlparser.statement.execute.Execute; +import net.sf.jsqlparser.statement.export.Export; import net.sf.jsqlparser.statement.grant.Grant; import net.sf.jsqlparser.statement.imprt.Import; import net.sf.jsqlparser.statement.insert.Insert; @@ -330,4 +331,10 @@ default void visit(ParenthesedDelete parenthesedDelete) { default void visit(Import imprt) { this.visit(imprt, null); } + + T visit(Export export, S context); + + default void visit(Export export) { + this.visit(export, null); + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java index 2e2015773..0a7c46e57 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java @@ -27,6 +27,7 @@ import net.sf.jsqlparser.statement.delete.ParenthesedDelete; import net.sf.jsqlparser.statement.drop.Drop; import net.sf.jsqlparser.statement.execute.Execute; +import net.sf.jsqlparser.statement.export.Export; import net.sf.jsqlparser.statement.grant.Grant; import net.sf.jsqlparser.statement.imprt.Import; import net.sf.jsqlparser.statement.insert.Insert; @@ -314,4 +315,9 @@ public T visit(RefreshMaterializedViewStatement materializedView, S context) public T visit(Import imprt, S context) { return null; } + + @Override + public T visit(Export export, S context) { + return null; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/export/DBMSDestination.java b/src/main/java/net/sf/jsqlparser/statement/export/DBMSDestination.java new file mode 100644 index 000000000..313299b05 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/export/DBMSDestination.java @@ -0,0 +1,117 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.export; + +import net.sf.jsqlparser.expression.StringValue; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.ConnectionDefinition; +import net.sf.jsqlparser.statement.ErrorClause; +import net.sf.jsqlparser.statement.SourceDestinationType; +import net.sf.jsqlparser.statement.select.PlainSelect; + +import java.io.Serializable; +import java.util.List; + +public class DBMSDestination implements ExportIntoItem, Serializable { + private SourceDestinationType destinationType; + private ConnectionDefinition connectionDefinition; + private Table table; + private ExpressionList columns; + private List dbmsTableDestinationOptions; + private StringValue statement; + private ErrorClause errorClause; + + public SourceDestinationType getDestinationType() { + return destinationType; + } + + public void setDestinationType(SourceDestinationType destinationType) { + this.destinationType = destinationType; + } + + public ConnectionDefinition getConnectionDefinition() { + return connectionDefinition; + } + + public void setConnectionDefinition(ConnectionDefinition connectionDefinition) { + this.connectionDefinition = connectionDefinition; + } + + public Table getTable() { + return table; + } + + public void setTable(Table table) { + this.table = table; + } + + public ExpressionList getColumns() { + return columns; + } + + public void setColumns(ExpressionList columns) { + this.columns = columns; + } + + public List getDBMSTableDestinationOptions() { + return dbmsTableDestinationOptions; + } + + public void setDBMSTableDestinationOptions(List dbmsTableDestinationOptions) { + this.dbmsTableDestinationOptions = dbmsTableDestinationOptions; + } + + public StringValue getStatement() { + return statement; + } + + public void setStatement(StringValue statement) { + this.statement = statement; + } + + @Override + public ErrorClause getErrorClause() { + return errorClause; + } + + @Override + public void setErrorClause(ErrorClause errorClause) { + this.errorClause = errorClause; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append(destinationType); + + sql.append(" "); + sql.append(connectionDefinition); + + if (table != null) { + sql.append(" TABLE ").append(table); + PlainSelect.appendStringListTo(sql, columns, true, true); + if (dbmsTableDestinationOptions != null) { + sql.append(" "); + PlainSelect.appendStringListTo(sql, dbmsTableDestinationOptions, false, false); + } + } else if (statement != null) { + sql.append(" STATEMENT ").append(statement); + } + + if (errorClause != null) { + sql.append(errorClause); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java b/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java new file mode 100644 index 000000000..55bc9183f --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java @@ -0,0 +1,64 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.export; + +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.StringValue; + +public class DBMSTableDestinationOption { + private String key; + private Expression value; + + private DBMSTableDestinationOption(String key, Expression value) { + this.key = key; + this.value = value; + } + + public DBMSTableDestinationOption(String key) { + this(key, (Expression) null); + } + + public DBMSTableDestinationOption(String key, StringValue value) { + this(key, (Expression) value); + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public Expression getValue() { + return value; + } + + public void setValue(StringValue value) { + this.value = value; + } + + public void setValue(LongValue value) { + this.value = value; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append(key); + if (value != null) { + sql.append(value); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/export/Export.java b/src/main/java/net/sf/jsqlparser/statement/export/Export.java new file mode 100644 index 000000000..2b5d392ea --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/export/Export.java @@ -0,0 +1,81 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.export; + +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.StatementVisitor; +import net.sf.jsqlparser.statement.select.*; + +public class Export implements Statement { + private Table table; + private ExpressionList columns; + private Select select; + private ExportIntoItem exportIntoItem; + + public Table getTable() { + return table; + } + + public void setTable(Table table) { + this.table = table; + } + + public ExpressionList getColumns() { + return columns; + } + + public void setColumns(ExpressionList columns) { + this.columns = columns; + } + + public Select getSelect() { + return select; + } + + public void setSelect(Select select) { + this.select = select; + } + + public ExportIntoItem getExportIntoItem() { + return exportIntoItem; + } + + public void setExportIntoItem(ExportIntoItem exportIntoItem) { + this.exportIntoItem = exportIntoItem; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + sql.append("EXPORT "); + if (table != null || select != null) { + if (table != null) { + sql.append(table); + PlainSelect.appendStringListTo(sql, columns, true, true); + } else { + sql.append(select); + } + sql.append(" "); + } + + sql.append("INTO "); + sql.append(exportIntoItem); + + return sql.toString(); + } + + @Override + public T accept(StatementVisitor statementVisitor, S context) { + return statementVisitor.visit(this, context); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/export/ExportIntoItem.java b/src/main/java/net/sf/jsqlparser/statement/export/ExportIntoItem.java new file mode 100644 index 000000000..5a8b82a22 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/export/ExportIntoItem.java @@ -0,0 +1,18 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.export; + +import net.sf.jsqlparser.statement.ErrorClause; + +public interface ExportIntoItem { + ErrorClause getErrorClause(); + + void setErrorClause(ErrorClause errorClause); +} diff --git a/src/main/java/net/sf/jsqlparser/statement/export/FileDestination.java b/src/main/java/net/sf/jsqlparser/statement/export/FileDestination.java new file mode 100644 index 000000000..d36b9afea --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/export/FileDestination.java @@ -0,0 +1,50 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.export; + +import net.sf.jsqlparser.statement.*; + +import java.io.Serializable; + +public class FileDestination extends FileSourceDestination implements ExportIntoItem, Serializable { + private ErrorClause errorClause; + + public SourceDestinationType getDestinationType() { + return getType(); + } + + public void setDestinationType(SourceDestinationType destinationType) { + setType(destinationType); + } + + @Override + public ErrorClause getErrorClause() { + return errorClause; + } + + @Override + public void setErrorClause(ErrorClause errorClause) { + this.errorClause = errorClause; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append(super.toString()); + + if (errorClause != null) { + sql.append(" "); + sql.append(errorClause); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java b/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java index 90b0f5789..65fc62575 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java @@ -14,18 +14,20 @@ import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.ConnectionDefinition; +import net.sf.jsqlparser.statement.ErrorClause; import net.sf.jsqlparser.statement.SourceDestinationType; import net.sf.jsqlparser.statement.select.PlainSelect; import java.io.Serializable; import java.util.List; -public class DBMSSource extends ImportFromItem implements Serializable { +public class DBMSSource implements ImportFromItem, Serializable { private SourceDestinationType sourceType; private ConnectionDefinition connectionDefinition; private Table table; private ExpressionList columns; private List statements; + private ErrorClause errorClause; public SourceDestinationType getSourceType() { return sourceType; @@ -67,6 +69,16 @@ public void setStatements(List statements) { this.statements = statements; } + @Override + public ErrorClause getErrorClause() { + return errorClause; + } + + @Override + public void setErrorClause(ErrorClause errorClause) { + this.errorClause = errorClause; + } + @Override public String toString() { StringBuilder sql = new StringBuilder(); diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java b/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java index 8b20a85ec..6130c5e21 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java @@ -10,123 +10,35 @@ package net.sf.jsqlparser.statement.imprt; import net.sf.jsqlparser.statement.*; -import net.sf.jsqlparser.statement.select.PlainSelect; import java.io.Serializable; -import java.util.List; -import java.util.Objects; -public class FileSource extends ImportFromItem implements Serializable { - private SourceDestinationType sourceType; - private List connectionFileDefinitions; - private Boolean local; - private Boolean secure; - private List csvColumns; - private List fbvColumns; - private List fileOptions; - private CertificateVerification certificateVerification; +public class FileSource extends FileSourceDestination implements ImportFromItem, Serializable { + private ErrorClause errorClause; public SourceDestinationType getSourceType() { - return sourceType; + return getType(); } public void setSourceType(SourceDestinationType sourceType) { - this.sourceType = sourceType; + setType(sourceType); } - public List getConnectionFileDefinitions() { - return connectionFileDefinitions; - } - - public void setConnectionFileDefinitions(List connectionFileDefinitions) { - this.connectionFileDefinitions = connectionFileDefinitions; - } - - public Boolean isLocal() { - return local; - } - - public void setLocal(Boolean local) { - this.local = local; - } - - public Boolean isSecure() { - return secure; - } - - public void setSecure(Boolean secure) { - this.secure = secure; - } - - public List getCSVColumns() { - return csvColumns; - } - - public void setCSVColumns(List csvColumns) { - this.csvColumns = csvColumns; - } - - public List getFBVColumns() { - return fbvColumns; - } - - public void setFBVColumns(List fbvColumns) { - this.fbvColumns = fbvColumns; - } - - public List getFileOptions() { - return fileOptions; - } - - public void setFileOptions(List fileOptions) { - this.fileOptions = fileOptions; - } - - public CertificateVerification getCertificateVerification() { - return certificateVerification; + @Override + public ErrorClause getErrorClause() { + return errorClause; } - public void setCertificateVerification(CertificateVerification certificateVerification) { - this.certificateVerification = certificateVerification; + @Override + public void setErrorClause(ErrorClause errorClause) { + this.errorClause = errorClause; } @Override public String toString() { StringBuilder sql = new StringBuilder(); - if (local != null) { - if (local) { - sql.append("LOCAL "); - } - - if (Objects.requireNonNullElse(secure, false)) { - sql.append("SECURE "); - } - } - - sql.append(sourceType); - if (connectionFileDefinitions != null) { - sql.append(" "); - PlainSelect.appendStringListTo(sql, connectionFileDefinitions, false, false); - } - - if (csvColumns != null) { - sql.append(" "); - PlainSelect.appendStringListTo(sql, csvColumns, true, true); - } else if (fbvColumns != null) { - sql.append(" "); - PlainSelect.appendStringListTo(sql, fbvColumns, false, true); - } - - if (fileOptions != null) { - sql.append(" "); - PlainSelect.appendStringListTo(sql, fileOptions, false, false); - } - - if (certificateVerification != null) { - sql.append(" "); - sql.append(certificateVerification); - } + sql.append(super.toString()); if (errorClause != null) { sql.append(" "); diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java b/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java index d05f3bd01..e5a41546a 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java @@ -11,14 +11,8 @@ import net.sf.jsqlparser.statement.ErrorClause; -public abstract class ImportFromItem { - protected ErrorClause errorClause; +public interface ImportFromItem { + ErrorClause getErrorClause(); - public ErrorClause getErrorClause() { - return errorClause; - } - - public void setErrorClause(ErrorClause errorClause) { - this.errorClause = errorClause; - } + void setErrorClause(ErrorClause errorClause); } diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java index d141805a2..bcb85ab00 100644 --- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java +++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java @@ -156,6 +156,7 @@ import net.sf.jsqlparser.statement.delete.ParenthesedDelete; import net.sf.jsqlparser.statement.drop.Drop; import net.sf.jsqlparser.statement.execute.Execute; +import net.sf.jsqlparser.statement.export.Export; import net.sf.jsqlparser.statement.grant.Grant; import net.sf.jsqlparser.statement.imprt.Import; import net.sf.jsqlparser.statement.insert.Insert; @@ -1839,4 +1840,14 @@ public void visit(Import imprt) { StatementVisitor.super.visit(imprt); } + @Override + public Void visit(Export export, S context) { + throwUnsupported(export); + return null; + } + + @Override + public void visit(Export export) { + StatementVisitor.super.visit(export); + } } 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 bc729ee87..2ce6c5ba1 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java @@ -51,6 +51,7 @@ import net.sf.jsqlparser.statement.delete.ParenthesedDelete; import net.sf.jsqlparser.statement.drop.Drop; import net.sf.jsqlparser.statement.execute.Execute; +import net.sf.jsqlparser.statement.export.Export; import net.sf.jsqlparser.statement.grant.Grant; import net.sf.jsqlparser.statement.imprt.Import; import net.sf.jsqlparser.statement.insert.Insert; @@ -500,4 +501,10 @@ public StringBuilder visit(Import imprt, S context) { builder.append(imprt.toString()); return builder; } + + @Override + public StringBuilder visit(Export export, S context) { + builder.append(export.toString()); + return builder; + } } diff --git a/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java b/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java index ee0e773a8..2a88ed700 100644 --- a/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java +++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java @@ -49,6 +49,7 @@ import net.sf.jsqlparser.statement.delete.ParenthesedDelete; import net.sf.jsqlparser.statement.drop.Drop; import net.sf.jsqlparser.statement.execute.Execute; +import net.sf.jsqlparser.statement.export.Export; import net.sf.jsqlparser.statement.grant.Grant; import net.sf.jsqlparser.statement.imprt.Import; import net.sf.jsqlparser.statement.insert.Insert; @@ -386,6 +387,12 @@ public Void visit(Import imprt, S context) { return null; } + @Override + public Void visit(Export export, S context) { + // TODO: not yet implemented + return null; + } + public void visit(CreateIndex createIndex) { visit(createIndex, null); } @@ -566,4 +573,7 @@ public void visit(Import imprt) { visit(imprt, null); } + public void visit(Export export) { + visit(export, null); + } } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 84b72be72..d695d5772 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -68,6 +68,7 @@ import net.sf.jsqlparser.statement.upsert.*; import net.sf.jsqlparser.statement.merge.*; import net.sf.jsqlparser.statement.grant.*; import net.sf.jsqlparser.statement.imprt.*; +import net.sf.jsqlparser.statement.export.*; import java.util.*; import java.util.AbstractMap.SimpleEntry; import net.sf.jsqlparser.statement.select.SetOperationList.SetOperationType; @@ -1110,7 +1111,7 @@ Export Export() #Export: { ( table = Table() { export.setTable(table); } - [ columns = ParenthesedColumnList() { impt.setColumns(columns); } ] + [ columns = ParenthesedColumnList() { export.setColumns(columns); } ] | select = ParenthesedSelect() { export.setSelect(select); } ) @@ -1232,7 +1233,7 @@ DBMSDestination DBMSDestination() #DBMSDestination: { StringValue statement; List dbmsTableDestinationOptions; } { - dbmsType = DBMSType() { dbmsDestination.setSourceType(dbmsType); } + dbmsType = DBMSType() { dbmsDestination.setDestinationType(dbmsType); } connectionDefinition = ConnectionDefinition() { dbmsDestination.setConnectionDefinition(connectionDefinition); } @@ -1240,7 +1241,7 @@ DBMSDestination DBMSDestination() #DBMSDestination: { LOOKAHEAD(3) table = Table() { dbmsDestination.setTable(table); } [ LOOKAHEAD(2) columns = ParenthesedColumnList() { dbmsDestination.setColumns(columns); } ] - [ LOOKAHEAD(2) dbmsTableDestinationOptions = DBMSTableDestinationOptionList() { dbmsDestination.setDBMSTableDestinationOptionList(dbmsTableDestinationOptions); } ] + [ LOOKAHEAD(2) dbmsTableDestinationOptions = DBMSTableDestinationOptionList() { dbmsDestination.setDBMSTableDestinationOptions(dbmsTableDestinationOptions); } ] | statement = ImportExportStatement() { dbmsDestination.setStatement(statement); } ) From c658f4dfd14251bfe98722155d0671c78684a8dd Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Tue, 11 Feb 2025 14:03:55 +0100 Subject: [PATCH 18/27] test: Fix EXPORT unit tests --- .../java/net/sf/jsqlparser/statement/CSVColumn.java | 4 +++- .../statement/export/DBMSTableDestinationOption.java | 1 + .../sf/jsqlparser/statement/export/ExportTest.java | 11 ++++++----- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java b/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java index d38aea39c..139a9cadf 100644 --- a/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java +++ b/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java @@ -78,7 +78,9 @@ public String toString() { if (format != null) { sql.append(" FORMAT = "); sql.append(format); - } else { + } + + if (delimit != null) { sql.append(" DELIMIT = "); sql.append(delimit); } diff --git a/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java b/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java index 55bc9183f..090b1c597 100644 --- a/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java +++ b/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java @@ -56,6 +56,7 @@ public String toString() { sql.append(key); if (value != null) { + sql.append(" "); sql.append(value); } diff --git a/src/test/java/net/sf/jsqlparser/statement/export/ExportTest.java b/src/test/java/net/sf/jsqlparser/statement/export/ExportTest.java index bbe4c2ab9..3b53a845d 100644 --- a/src/test/java/net/sf/jsqlparser/statement/export/ExportTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/export/ExportTest.java @@ -50,7 +50,8 @@ public void testExportIntoFileCSV(String sqlStr) throws JSQLParserException { "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 DELIMIT = ALWAYS )", "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 DELIMIT = NEVER )", "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 DELIMIT = AUTO )", - "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 FORMAT = 'format', 2 FORMAT = 'format', DELIMIT = ALWAYS )", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 FORMAT = 'format', 2 DELIMIT = NEVER )", + "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 FORMAT = 'format', 2 DELIMIT = NEVER, 3 FORMAT = 'format' DELIMIT = ALWAYS )", "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1 .. 2 )", "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1, 1 .. 2 )", "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1, 1 .. 2, 3 )" @@ -77,11 +78,11 @@ public void testExportIntoFileFBV(String sqlStr) throws JSQLParserException { "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( FORMAT = 'format' )", "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( ALIGN = LEFT )", "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( ALIGN = RIGHT )", - "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( PADDING = 'padding' )", + "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( PADDING = '0' )", - "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( SIZE = 1, START = 1 )", - "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( SIZE = 1 START = 1 )", - "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( SIZE = 1 START = 1, FORMAT = 'format' )" + "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( SIZE = 1, PADDING = '0' )", + "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( SIZE = 1 PADDING = '0' )", + "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( SIZE = 1 PADDING = '0', FORMAT = 'format' )" }) public void testExportIntoFileFBVCols(String sqlStr) throws JSQLParserException { TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); From 8adaa89c07397f32c4cf27629cb4f8948a8e6ca9 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Mon, 2 Jun 2025 14:29:03 +0200 Subject: [PATCH 19/27] fix: Implement missing SampleClause methods --- .../java/net/sf/jsqlparser/statement/imprt/Import.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java b/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java index 6bda55277..beb9911be 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java @@ -115,4 +115,14 @@ public UnPivot getUnPivot() { @Override public void setUnPivot(UnPivot unpivot) {} + + @Override + public SampleClause getSampleClause() { + return null; + } + + @Override + public FromItem setSampleClause(SampleClause sampleClause) { + return null; + } } From 0c132d009fe9daf06a9d338e039b827ae93cd7a9 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Wed, 4 Jun 2025 12:15:29 +0200 Subject: [PATCH 20/27] feat: Add further Import tests --- .../java/net/sf/jsqlparser/statement/imprt/ImportTest.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java b/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java index af8ea619c..2f6083041 100644 --- a/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java @@ -205,7 +205,12 @@ public void testImportFromDBMSORA(String sqlStr) throws JSQLParserException { @ParameterizedTest @ValueSource(strings = { "IMPORT FROM JDBC AT connectionName TABLE tableName", - "IMPORT FROM JDBC DRIVER = 'driverName' AT connectionName TABLE tableName" + "IMPORT FROM JDBC DRIVER = 'driverName' AT connectionName TABLE tableName", + + "IMPORT FROM JDBC AT connectionName STATEMENT 'select 1'", + "IMPORT FROM JDBC AT connectionName STATEMENT 'select 1' STATEMENT 'select 2'", + "IMPORT FROM JDBC DRIVER = 'driverName' AT connectionName STATEMENT 'select 1'", + "IMPORT FROM JDBC DRIVER = 'driverName' AT connectionName STATEMENT 'select 1' STATEMENT 'select 2'" }) public void testImportFromDBMSJDBC(String sqlStr) throws JSQLParserException { TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); From 3d1b786f8f401cbb367a4c0aef447eb24042e7bd Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Wed, 4 Jun 2025 15:26:26 +0200 Subject: [PATCH 21/27] fix: Update Keywords and fix boolean data type matching --- src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 269b585e1..eee76d29d 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -723,7 +723,7 @@ TOKEN : /* Data Types */ | <#TYPE_BIT: "BISTRING"> | <#TYPE_BLOB: "BLOB" | "BYTEA" | | "VARBINARY" | > - | <#TYPE_BOOLEAN: "BOOLEAN" | "BOOL" > + | <#TYPE_BOOLEAN: | "BOOL" > | <#TYPE_ENUM: "ENUM" > | <#TYPE_MAP: "MAP" > | <#TYPE_DECIMAL: "DECIMAL" | "NUMBER" | "NUMERIC" > @@ -3161,7 +3161,7 @@ String RelObjectNameWithoutValue() : { Token tk = null; } { ( tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= - | tk= | tk= | tk="KILL" | tk="ACTION" | tk="ACTIVE" | tk="ADD" | tk="ADVANCE" | tk="ADVISE" | tk="AGAINST" | tk="AGGREGATE" | tk="ALGORITHM" | tk="ALTER" | tk="ANALYZE" | tk="APPLY" | tk="APPROXIMATE" | tk="ARCHIVE" | tk="ARRAY" | tk="ASC" | tk="AT" | tk="AUTHORIZATION" | tk="AUTO" | tk="AUTO_INCREMENT" | tk="BASE64" | tk="BEGIN" | tk="BERNOULLI" | tk="BINARY" | tk="BIT" | tk="BLOCK" | tk="BROWSE" | 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="COALESCE" | tk="COLLATE" | tk="COLUMN" | tk="COLUMNS" | tk="COMMENT" | tk="COMMIT" | tk="CONCURRENTLY" | tk="CONFLICT" | tk="CONSTRAINTS" | tk="CONVERT" | tk="CORRESPONDING" | tk="COSTS" | tk="COUNT" | tk="CS" | tk="CYCLE" | tk="DATA" | tk="DATABASE" | tk="DATETIME" | tk="DBA_RECYCLEBIN" | tk="DDL" | tk="DECLARE" | tk="DEFERRABLE" | tk="DELAYED" | tk="DELETE" | tk="DESC" | tk="DESCRIBE" | tk="DISABLE" | tk="DISCARD" | tk="DISCONNECT" | tk="DIV" | tk="DML" | tk="DO" | tk="DOMAIN" | tk="DROP" | tk="DUMP" | tk="DUPLICATE" | tk="ELEMENTS" | tk="EMIT" | tk="ENABLE" | tk="ENCRYPTION" | tk="END" | tk="ENFORCED" | tk="ENGINE" | tk="ERROR" | tk="ESCAPE" | tk="EXCHANGE" | tk="EXCLUDE" | tk="EXEC" | tk="EXECUTE" | tk="EXPLAIN" | tk="EXPLICIT" | tk="EXTENDED" | tk="EXTRACT" | tk="FILTER" | tk="FIRST" | tk="FLUSH" | tk="FN" | tk="FOLLOWING" | tk="FORMAT" | tk="FULLTEXT" | tk="FUNCTION" | tk="GRANT" | tk="GROUP_CONCAT" | tk="GUARD" | tk="HASH" | tk="HIGH" | tk="HIGH_PRIORITY" | tk="HISTORY" | tk="HOPPING" | tk="IMPORT" | tk="INCLUDE" | tk="INCLUDE_NULL_VALUES" | tk="INCREMENT" | tk="INDEX" | tk="INSERT" | tk="INTERLEAVE" | tk="INTERPRET" | tk="INVALIDATE" | tk="INVERSE" | tk="INVISIBLE" | tk="ISNULL" | tk="JSON" | tk="JSON_ARRAY" | tk="JSON_ARRAYAGG" | tk="JSON_OBJECT" | tk="JSON_OBJECTAGG" | tk="KEEP" | tk="KEY" | tk="KEYS" | tk="KEY_BLOCK_SIZE" | tk="LAST" | tk="LEADING" | tk="LESS" | tk="LINK" | tk="LOCAL" | tk="LOCK" | tk="LOCKED" | tk="LOG" | tk="LONGTEXT" | tk="LOOP" | tk="LOW" | tk="LOW_PRIORITY" | tk="MATCH" | tk="MATCHED" | tk="MATCH_ALL" | tk="MATCH_ANY" | tk="MATCH_PHRASE" | tk="MATCH_PHRASE_PREFIX" | tk="MATCH_REGEXP" | tk="MATERIALIZED" | tk="MAX" | tk="MAXVALUE" | tk="MEDIUMTEXT" | tk="MEMBER" | tk="MERGE" | tk="MIN" | tk="MINVALUE" | tk="MODIFY" | tk="MOVEMENT" | tk="NAME" | tk="NEXT" | tk="NO" | tk="NOCACHE" | tk="NOKEEP" | tk="NOLOCK" | tk="NOMAXVALUE" | tk="NOMINVALUE" | tk="NOORDER" | tk="NOTHING" | tk="NOTNULL" | tk="NOVALIDATE" | tk="NOWAIT" | tk="NULLS" | tk="OF" | tk="OFF" | tk="OPEN" | tk="ORDINALITY" | tk="OVER" | tk="OVERFLOW" | tk="OVERLAPS" | tk="OVERRIDING" | tk="OVERWRITE" | tk="PARALLEL" | tk="PARENT" | tk="PARSER" | tk="PARTITION" | tk="PARTITIONING" | tk="PATH" | tk="PERCENT" | tk="PLACING" | tk="PLAN" | tk="PLUS" | tk="PRECEDING" | tk="PRIMARY" | tk="PURGE" | tk="QUERY" | tk="QUICK" | tk="QUIESCE" | tk="RANGE" | tk="RAW" | tk="READ" | tk="REBUILD" | tk="RECURSIVE" | tk="RECYCLEBIN" | tk="REFERENCES" | tk="REFRESH" | tk="REGEXP" | tk="REGEXP_LIKE" | tk="REGISTER" | tk="REMOTE" | tk="REMOVE" | tk="RENAME" | tk="REORGANIZE" | tk="REPAIR" | tk="REPEATABLE" | tk="REPLACE" | tk="RESET" | tk="RESPECT" | tk="RESTART" | tk="RESTRICT" | tk="RESTRICTED" | tk="RESUMABLE" | tk="RESUME" | tk="RETURN" | tk="RLIKE" | tk="ROLLBACK" | tk="ROLLUP" | tk="ROOT" | tk="ROW" | tk="ROWS" | tk="RR" | tk="RS" | tk="SAFE_CAST" | tk="SAVEPOINT" | tk="SCHEMA" | tk="SECURE" | tk="SEED" | tk="SEPARATOR" | tk="SEQUENCE" | tk="SESSION" | tk="SETS" | tk="SHARE" | tk="SHOW" | tk="SHUTDOWN" | tk="SIBLINGS" | tk="SIGNED" | tk="SIMILAR" | tk="SIZE" | tk="SKIP" | tk="SPATIAL" | tk="STORED" | tk="STRICT" | tk="STRING" | tk="STRUCT" | tk="SUMMARIZE" | tk="SUSPEND" | tk="SWITCH" | tk="SYNONYM" | tk="SYSTEM" | tk="TABLE" | tk="TABLESPACE" | tk="TEMP" | tk="TEMPORARY" | tk="TEXT" | tk="THAN" | tk="THEN" | tk="TIMEOUT" | tk="TIMESTAMPTZ" | tk="TIMEZONE" | tk="TINYTEXT" | tk="TO" | tk="TRIGGER" | tk="TRUNCATE" | tk="TRY_CAST" | tk="TUMBLING" | tk="TYPE" | tk="UNLOGGED" | tk="UNQIESCE" | tk="UNSIGNED" | tk="UPDATE" | tk="UPSERT" | tk="UR" | tk="USER" | tk="VALIDATE" | tk="VALIDATION" | tk="VERBOSE" | tk="VIEW" | tk="VISIBLE" | tk="VOLATILE" | tk="WAIT" | tk="WITHIN" | tk="WITHOUT" | tk="WITHOUT_ARRAY_WRAPPER" | tk="WORK" | tk="XML" | tk="XMLAGG" | tk="XMLDATA" | tk="XMLSCHEMA" | tk="XMLTEXT" | tk="XSINIL" | tk="YAML" | tk="YES" | tk="ZONE" ) + | tk="ACTION" | tk="ACTIVE" | tk="ADD" | tk="ADVANCE" | tk="ADVISE" | tk="AGAINST" | tk="AGGREGATE" | tk="ALGORITHM" | tk="ALIGN" | tk="ALTER" | tk="ALWAYS" | tk="ANALYZE" | tk="APPLY" | tk="APPROXIMATE" | tk="ARCHIVE" | tk="ARRAY" | tk="ASC" | tk="ASYMMETRIC" | tk="AT" | tk="AUTHORIZATION" | tk="AUTO" | tk="AUTO_INCREMENT" | tk="AZURE" | tk="BASE64" | tk="BEGIN" | tk="BERNOULLI" | tk="BINARY" | tk="BIT" | tk="BLOBSTORAGE" | tk="BLOCK" | tk="BOOLEAN" | tk="BROWSE" | tk="BUFFERS" | tk="BY" | tk="BYTE" | tk="BYTES" | tk="CACHE" | tk="CALL" | tk="CASCADE" | tk="CASE" | tk="CAST" | tk="CERTIFICATE" | tk="CHANGE" | tk="CHANGES" | tk="CHAR" | tk="CHARACTER" | tk="CHECKPOINT" | tk="CLOSE" | tk="CLOUD" | tk="COALESCE" | tk="COLLATE" | tk="COLUMN" | tk="COLUMNS" | tk="COMMENT" | tk="COMMENTS" | tk="COMMIT" | tk="CONCURRENTLY" | tk="CONFLICT" | tk="CONSTRAINTS" | tk="CONVERT" | tk="CORRESPONDING" | tk="COSTS" | tk="COUNT" | tk="CREATED" | tk="CS" | tk="CYCLE" | tk="DATA" | tk="DATABASE" | tk="DATETIME" | tk="DBA_RECYCLEBIN" | tk="DDL" | tk="DECLARE" | tk="DEFAULTS" | tk="DEFERRABLE" | tk="DELAYED" | tk="DELETE" | tk="DELIMIT" | tk="DELIMITER" | tk="DESC" | tk="DESCRIBE" | tk="DISABLE" | tk="DISCARD" | tk="DISCONNECT" | tk="DIV" | tk="DML" | tk="DO" | tk="DOMAIN" | tk="DRIVER" | tk="DROP" | tk="DUMP" | tk="DUPLICATE" | tk="ELEMENTS" | tk="EMIT" | tk="ENABLE" | tk="ENCODING" | tk="ENCRYPTION" | tk="END" | tk="ENFORCED" | tk="ENGINE" | tk="ERROR" | tk="ESCAPE" | tk="EXA" | tk="EXCHANGE" | tk="EXCLUDE" | tk="EXCLUDING" | tk="EXEC" | tk="EXECUTE" | tk="EXPLAIN" | tk="EXPLICIT" | tk="EXPORT" | tk="EXTENDED" | tk="EXTRACT" | tk="FILTER" | tk="FIRST" | tk="FLUSH" | tk="FN" | tk="FOLLOWING" | tk="FORMAT" | tk="FULLTEXT" | tk="FUNCTION" | tk="GRANT" | tk="GROUP_CONCAT" | tk="GUARD" | tk="HASH" | tk="HIGH" | tk="HIGH_PRIORITY" | tk="HISTORY" | tk="HOPPING" | tk="IDENTIFIED" | tk="IDENTITY" | tk="INCLUDE" | tk="INCLUDE_NULL_VALUES" | tk="INCLUDING" | tk="INCREMENT" | tk="INDEX" | tk="INSERT" | tk="INTERLEAVE" | tk="INTERPRET" | tk="INVALIDATE" | tk="INVERSE" | tk="INVISIBLE" | tk="ISNULL" | tk="JDBC" | tk="JSON" | tk="JSON_ARRAY" | tk="JSON_ARRAYAGG" | tk="JSON_OBJECT" | tk="JSON_OBJECTAGG" | tk="KEEP" | tk="KEY" | tk="KEYS" | tk="KEY_BLOCK_SIZE" | tk="KILL" | tk="LAST" | tk="LEADING" | tk="LESS" | tk="LINK" | tk="LOCAL" | tk="LOCK" | tk="LOCKED" | tk="LOG" | tk="LONGTEXT" | tk="LOOP" | tk="LOW" | tk="LOW_PRIORITY" | tk="LTRIM" | tk="MATCH" | tk="MATCHED" | tk="MATCH_ALL" | tk="MATCH_ANY" | tk="MATCH_PHRASE" | tk="MATCH_PHRASE_PREFIX" | tk="MATCH_REGEXP" | tk="MATERIALIZED" | tk="MAX" | tk="MAXVALUE" | tk="MEDIUMTEXT" | tk="MEMBER" | tk="MERGE" | tk="MIN" | tk="MINVALUE" | tk="MODIFY" | tk="MOVEMENT" | tk="NAME" | tk="NAMES" | tk="NEVER" | tk="NEXT" | tk="NO" | tk="NOCACHE" | tk="NOKEEP" | tk="NOLOCK" | tk="NOMAXVALUE" | tk="NOMINVALUE" | tk="NONE" | tk="NOORDER" | tk="NOTHING" | tk="NOTNULL" | tk="NOVALIDATE" | tk="NOWAIT" | tk="NULLS" | tk="OF" | tk="OFF" | tk="OPEN" | tk="ORA" | tk="ORDINALITY" | tk="OVER" | tk="OVERFLOW" | tk="OVERLAPS" | tk="OVERRIDING" | tk="OVERWRITE" | tk="PADDING" | tk="PARALLEL" | tk="PARENT" | tk="PARSER" | tk="PARTITION" | tk="PARTITIONING" | tk="PATH" | tk="PERCENT" | tk="PLACING" | tk="PLAN" | tk="PLUS" | tk="PRECEDING" | tk="PRIMARY" | tk="PURGE" | tk="QUERY" | tk="QUICK" | tk="QUIESCE" | tk="RANGE" | tk="RAW" | tk="READ" | tk="REBUILD" | tk="RECURSIVE" | tk="RECYCLEBIN" | tk="REFERENCES" | tk="REFRESH" | tk="REGEXP" | tk="REGEXP_LIKE" | tk="REGISTER" | tk="REJECT" | tk="REMOTE" | tk="REMOVE" | tk="RENAME" | tk="REORGANIZE" | tk="REPAIR" | tk="REPEATABLE" | tk="REPLACE" | tk="RESET" | tk="RESPECT" | tk="RESTART" | tk="RESTRICT" | tk="RESTRICTED" | tk="RESUMABLE" | tk="RESUME" | tk="RETURN" | tk="RLIKE" | tk="ROLLBACK" | tk="ROLLUP" | tk="ROOT" | tk="ROW" | tk="ROWS" | tk="RR" | tk="RS" | tk="RTRIM" | tk="SAFE_CAST" | tk="SAVEPOINT" | tk="SCHEMA" | tk="SECURE" | tk="SEED" | tk="SEPARATOR" | tk="SEQUENCE" | tk="SESSION" | tk="SETS" | tk="SHARE" | tk="SHOW" | tk="SHUTDOWN" | tk="SIBLINGS" | tk="SIGNED" | tk="SIMILAR" | tk="SIZE" | tk="SKIP" | tk="SPATIAL" | tk="STORED" | tk="STRICT" | tk="STRING" | tk="STRUCT" | tk="SUMMARIZE" | tk="SUSPEND" | tk="SWITCH" | tk="SYMMETRIC" | tk="SYNONYM" | tk="SYSTEM" | tk="TABLE" | tk="TABLESPACE" | tk="TEMP" | tk="TEMPORARY" | tk="TEXT" | tk="THAN" | tk="THEN" | tk="TIMEOUT" | tk="TIMESTAMPTZ" | tk="TIMEZONE" | tk="TINYTEXT" | tk="TO" | tk="TRIGGER" | tk="TRUNCATE" | tk="TRY_CAST" | tk="TUMBLING" | tk="TYPE" | tk="UNLIMITED" | tk="UNLOGGED" | tk="UNQIESCE" | tk="UNSIGNED" | tk="UPDATE" | tk="UPSERT" | tk="UR" | tk="USER" | tk="VALIDATE" | tk="VALIDATION" | tk="VERBOSE" | tk="VIEW" | tk="VISIBLE" | tk="VOLATILE" | tk="WAIT" | tk="WITHIN" | tk="WITHOUT" | tk="WITHOUT_ARRAY_WRAPPER" | tk="WORK" | tk="XML" | tk="XMLAGG" | tk="XMLDATA" | tk="XMLSCHEMA" | tk="XMLTEXT" | tk="XSINIL" | tk="YAML" | tk="YES" | tk="ZONE" ) { return tk.image; } } @@ -8080,12 +8080,12 @@ ColDataType DataType(): | ( ( tk= | tk= | tk = | tk = | tk = - | tk= | tk= | tk= | tk= + | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= ) { type = tk.image; } [ // MySQL seems to allow: INT UNSIGNED LOOKAHEAD(2) ( LOOKAHEAD(2) ( tk = | tk = | tk = - | tk= | tk= | tk= | tk= + | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= ) { type += " " + tk.image; } )+ ] [ From 223143a3b07929335ac0fbe1d7094c605a65bc06 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Wed, 4 Jun 2025 16:54:56 +0200 Subject: [PATCH 22/27] fix: Fix SourceDestinationType implementations --- .../net/sf/jsqlparser/statement/DBMSType.java | 26 ++++++++++++++----- .../net/sf/jsqlparser/statement/FileType.java | 19 +++++++++++--- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 21 ++++++++------- 3 files changed, 47 insertions(+), 19 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/statement/DBMSType.java b/src/main/java/net/sf/jsqlparser/statement/DBMSType.java index c4e4ba015..8feaf977f 100644 --- a/src/main/java/net/sf/jsqlparser/statement/DBMSType.java +++ b/src/main/java/net/sf/jsqlparser/statement/DBMSType.java @@ -11,13 +11,27 @@ import net.sf.jsqlparser.expression.StringValue; -public enum DBMSType implements SourceDestinationType { - EXA, - ORA, - JDBC; - +public class DBMSType implements SourceDestinationType { + private final Kind dbmsType; private StringValue jdbcDriverDefinition; + public DBMSType(String dbmsType) { + this(dbmsType, null); + } + + public DBMSType(String dbmsType, String jdbcDriverDefinition) { + this.dbmsType = Kind.valueOf(dbmsType.toUpperCase()); + if (jdbcDriverDefinition != null) { + this.jdbcDriverDefinition = new StringValue(jdbcDriverDefinition); + } + } + + private enum Kind { + EXA, + ORA, + JDBC + } + public StringValue getJDBCDriverDefinition() { return jdbcDriverDefinition; } @@ -30,7 +44,7 @@ public void setJDBCDriverDefinition(StringValue jdbcDriverDefinition) { public String toString() { StringBuilder sql = new StringBuilder(); - sql.append(super.toString()); + sql.append(dbmsType); if (jdbcDriverDefinition != null) { sql.append(" DRIVER = ").append(jdbcDriverDefinition); } diff --git a/src/main/java/net/sf/jsqlparser/statement/FileType.java b/src/main/java/net/sf/jsqlparser/statement/FileType.java index 7d5b8704a..9a9c9807a 100644 --- a/src/main/java/net/sf/jsqlparser/statement/FileType.java +++ b/src/main/java/net/sf/jsqlparser/statement/FileType.java @@ -9,7 +9,20 @@ */ package net.sf.jsqlparser.statement; -public enum FileType implements SourceDestinationType { - CSV, - FBV +public class FileType implements SourceDestinationType { + private final Kind fileType; + + public FileType(String fileType) { + this.fileType = Kind.valueOf(fileType.toUpperCase()); + } + + private enum Kind { + CSV, + FBV + } + + @Override + public String toString() { + return fileType.toString(); + } } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index eee76d29d..3934bd1e7 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1419,7 +1419,6 @@ DBMSSource DBMSSource() #DBMSSource: { Table table; ExpressionList columns; List statements; - Token token; } { dbmsType = DBMSType() { dbmsSource.setSourceType(dbmsType); } @@ -1437,14 +1436,15 @@ DBMSSource DBMSSource() #DBMSSource: { DBMSType DBMSType(): { DBMSType dbmsType; + Token tk1; + Token tk2 = null; } { ( - { dbmsType = DBMSType.EXA; } - | { dbmsType = DBMSType.ORA; } - | { dbmsType = DBMSType.JDBC; } - [ "=" token = { dbmsType.setJDBCDriverDefinition(new StringValue(token.image)); }] - ) - + tk1= + | tk1= + | tk1= + [ "=" tk2=] + ) { dbmsType = new DBMSType(tk1.image, tk2 == null ? null : tk2.image); } { return dbmsType; } @@ -1452,11 +1452,12 @@ DBMSType DBMSType(): { FileType FileType(): { FileType fileType; + Token tk; } { ( - { fileType = FileType.CSV; } - | { fileType = FileType.FBV; } - ) + tk= + | tk= + ) { fileType = new FileType(tk.image); } { return fileType; } From 40f916de9d776907562711caac5d6b3b028b0836 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Thu, 5 Jun 2025 11:26:43 +0200 Subject: [PATCH 23/27] style: Run spotlessApply --- .../sf/jsqlparser/statement/CSVColumn.java | 182 ++++++------ .../statement/CSVFileDestination.java | 150 +++++----- .../statement/CertificateVerification.java | 130 ++++----- .../statement/CloudConnectionDefinition.java | 74 ++--- .../statement/ConnectionDefinition.java | 178 ++++++------ .../statement/ConnectionFileDefinition.java | 119 ++++---- .../net/sf/jsqlparser/statement/DBMSType.java | 106 ++++--- .../sf/jsqlparser/statement/ErrorClause.java | 176 ++++++------ .../statement/ErrorDestination.java | 26 +- .../sf/jsqlparser/statement/FBVColumn.java | 196 ++++++------- .../sf/jsqlparser/statement/FileOption.java | 170 +++++------ .../statement/FileSourceDestination.java | 265 +++++++++--------- .../net/sf/jsqlparser/statement/FileType.java | 55 ++-- .../sf/jsqlparser/statement/LikeClause.java | 3 +- .../sf/jsqlparser/statement/RejectClause.java | 102 +++---- .../statement/ScriptSourceDestination.java | 198 ++++++------- .../statement/SourceDestinationType.java | 26 +- .../statement/UserIdentification.java | 92 +++--- .../statement/export/DBMSDestination.java | 235 ++++++++-------- .../export/DBMSTableDestinationOption.java | 130 ++++----- .../jsqlparser/statement/export/Export.java | 162 +++++------ .../statement/export/ExportIntoItem.java | 36 +-- .../statement/export/FileDestination.java | 100 +++---- .../statement/imprt/DBMSSource.java | 212 +++++++------- .../statement/imprt/FileSource.java | 100 +++---- .../sf/jsqlparser/statement/imprt/Import.java | 256 ++++++++--------- .../statement/imprt/ImportColumn.java | 26 +- .../statement/imprt/ImportFromItem.java | 36 +-- 28 files changed, 1771 insertions(+), 1770 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java b/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java index 139a9cadf..08c7f4d1d 100644 --- a/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java +++ b/src/main/java/net/sf/jsqlparser/statement/CSVColumn.java @@ -1,91 +1,91 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2022 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement; - -import net.sf.jsqlparser.expression.StringValue; - -public class CSVColumn { - private Long startIndex; - private Long endIndex; - private StringValue format; - private String delimit; - - public CSVColumn(Long startIndex, Long endIndex) { - this.startIndex = startIndex; - this.endIndex = endIndex; - } - - public CSVColumn(Long index) { - this(index, null); - } - - public Long getStartIndex() { - return startIndex; - } - - public void setStartIndex(Long startIndex) { - this.startIndex = startIndex; - } - - public Long getIndex() { - return getStartIndex(); - } - - public void setIndex(Long index) { - setStartIndex(index); - } - - public Long getEndIndex() { - return endIndex; - } - - public void setEndIndex(Long endIndex) { - this.endIndex = endIndex; - } - - public StringValue getFormat() { - return format; - } - - public void setFormat(StringValue format) { - this.format = format; - } - - public String getDelimit() { - return delimit; - } - - public void setDelimit(String delimit) { - this.delimit = delimit; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - sql.append(startIndex); - if (endIndex != null) { - sql.append(" .. "); - sql.append(endIndex); - } else if (format != null || delimit != null) { - if (format != null) { - sql.append(" FORMAT = "); - sql.append(format); - } - - if (delimit != null) { - sql.append(" DELIMIT = "); - sql.append(delimit); - } - } - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.StringValue; + +public class CSVColumn { + private Long startIndex; + private Long endIndex; + private StringValue format; + private String delimit; + + public CSVColumn(Long startIndex, Long endIndex) { + this.startIndex = startIndex; + this.endIndex = endIndex; + } + + public CSVColumn(Long index) { + this(index, null); + } + + public Long getStartIndex() { + return startIndex; + } + + public void setStartIndex(Long startIndex) { + this.startIndex = startIndex; + } + + public Long getIndex() { + return getStartIndex(); + } + + public void setIndex(Long index) { + setStartIndex(index); + } + + public Long getEndIndex() { + return endIndex; + } + + public void setEndIndex(Long endIndex) { + this.endIndex = endIndex; + } + + public StringValue getFormat() { + return format; + } + + public void setFormat(StringValue format) { + this.format = format; + } + + public String getDelimit() { + return delimit; + } + + public void setDelimit(String delimit) { + this.delimit = delimit; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append(startIndex); + if (endIndex != null) { + sql.append(" .. "); + sql.append(endIndex); + } else if (format != null || delimit != null) { + if (format != null) { + sql.append(" FORMAT = "); + sql.append(format); + } + + if (delimit != null) { + sql.append(" DELIMIT = "); + sql.append(delimit); + } + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/CSVFileDestination.java b/src/main/java/net/sf/jsqlparser/statement/CSVFileDestination.java index e47848c8c..697368f83 100644 --- a/src/main/java/net/sf/jsqlparser/statement/CSVFileDestination.java +++ b/src/main/java/net/sf/jsqlparser/statement/CSVFileDestination.java @@ -1,75 +1,75 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2022 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement; - -import net.sf.jsqlparser.expression.StringValue; - -public class CSVFileDestination implements ErrorDestination { - private ConnectionDefinition connectionDefinition; - private boolean local; - private boolean secure; - private StringValue file; - - public ConnectionDefinition getConnectionDefinition() { - return connectionDefinition; - } - - public void setConnectionDefinition(ConnectionDefinition connectionDefinition) { - this.connectionDefinition = connectionDefinition; - } - - public boolean isLocal() { - return local; - } - - public void setLocal(boolean local) { - this.local = local; - } - - public boolean isSecure() { - return secure; - } - - public void setSecure(boolean secure) { - this.secure = secure; - } - - public StringValue getFile() { - return file; - } - - public void setFile(StringValue file) { - this.file = file; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - if (local) { - sql.append("LOCAL "); - if (secure) { - sql.append("SECURE "); - } - } - - sql.append("CSV"); - - if (connectionDefinition != null) { - sql.append(" "); - sql.append(connectionDefinition); - } - - sql.append(" FILE "); - sql.append(file); - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.StringValue; + +public class CSVFileDestination implements ErrorDestination { + private ConnectionDefinition connectionDefinition; + private boolean local; + private boolean secure; + private StringValue file; + + public ConnectionDefinition getConnectionDefinition() { + return connectionDefinition; + } + + public void setConnectionDefinition(ConnectionDefinition connectionDefinition) { + this.connectionDefinition = connectionDefinition; + } + + public boolean isLocal() { + return local; + } + + public void setLocal(boolean local) { + this.local = local; + } + + public boolean isSecure() { + return secure; + } + + public void setSecure(boolean secure) { + this.secure = secure; + } + + public StringValue getFile() { + return file; + } + + public void setFile(StringValue file) { + this.file = file; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + if (local) { + sql.append("LOCAL "); + if (secure) { + sql.append("SECURE "); + } + } + + sql.append("CSV"); + + if (connectionDefinition != null) { + sql.append(" "); + sql.append(connectionDefinition); + } + + sql.append(" FILE "); + sql.append(file); + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java b/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java index d98de7d4b..5ad49478f 100644 --- a/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java +++ b/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java @@ -1,65 +1,65 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2025 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement; - -import net.sf.jsqlparser.expression.StringValue; - -public class CertificateVerification { - private Boolean ignoreCertificate; - private StringValue publicKey; - - public StringValue getPublicKey() { - return publicKey; - } - - public void setPublicKey(StringValue publicKey) { - this.publicKey = publicKey; - } - - public Boolean getIgnoreCertificate() { - return ignoreCertificate; - } - - public void setIgnoreCertificate(Boolean ignoreCertificate) { - this.ignoreCertificate = ignoreCertificate; - } - - public Boolean getVerifyCertificate() { - return !ignoreCertificate; - } - - public void setVerifyCertificate(Boolean verifyCertificate) { - this.ignoreCertificate = !verifyCertificate; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - if (ignoreCertificate != null) { - if (ignoreCertificate) { - sql.append("IGNORE "); - } else { - sql.append("VERIFY "); - } - sql.append("CERTIFICATE"); - } - - if (publicKey != null) { - if (ignoreCertificate != null) { - sql.append(" "); - } - sql.append("PUBLIC KEY "); - sql.append(publicKey); - } - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2025 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.StringValue; + +public class CertificateVerification { + private Boolean ignoreCertificate; + private StringValue publicKey; + + public StringValue getPublicKey() { + return publicKey; + } + + public void setPublicKey(StringValue publicKey) { + this.publicKey = publicKey; + } + + public Boolean getIgnoreCertificate() { + return ignoreCertificate; + } + + public void setIgnoreCertificate(Boolean ignoreCertificate) { + this.ignoreCertificate = ignoreCertificate; + } + + public Boolean getVerifyCertificate() { + return !ignoreCertificate; + } + + public void setVerifyCertificate(Boolean verifyCertificate) { + this.ignoreCertificate = !verifyCertificate; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + if (ignoreCertificate != null) { + if (ignoreCertificate) { + sql.append("IGNORE "); + } else { + sql.append("VERIFY "); + } + sql.append("CERTIFICATE"); + } + + if (publicKey != null) { + if (ignoreCertificate != null) { + sql.append(" "); + } + sql.append("PUBLIC KEY "); + sql.append(publicKey); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/CloudConnectionDefinition.java b/src/main/java/net/sf/jsqlparser/statement/CloudConnectionDefinition.java index b9cc8191e..82b65fbd7 100644 --- a/src/main/java/net/sf/jsqlparser/statement/CloudConnectionDefinition.java +++ b/src/main/java/net/sf/jsqlparser/statement/CloudConnectionDefinition.java @@ -1,37 +1,37 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2022 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement; - -public class CloudConnectionDefinition extends ConnectionDefinition { - private String storage; - - public String getStorage() { - return storage; - } - - public void setStorage(String storage) { - this.storage = storage; - } - - @Override - public void setCertificateVerification(CertificateVerification certificateVerification) {} - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - sql.append("AT CLOUD "); - sql.append(storage); - sql.append(" "); - appendConnectionDefinition(sql); - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +public class CloudConnectionDefinition extends ConnectionDefinition { + private String storage; + + public String getStorage() { + return storage; + } + + public void setStorage(String storage) { + this.storage = storage; + } + + @Override + public void setCertificateVerification(CertificateVerification certificateVerification) {} + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append("AT CLOUD "); + sql.append(storage); + sql.append(" "); + appendConnectionDefinition(sql); + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/ConnectionDefinition.java b/src/main/java/net/sf/jsqlparser/statement/ConnectionDefinition.java index eb5377e0a..2ce2602bf 100644 --- a/src/main/java/net/sf/jsqlparser/statement/ConnectionDefinition.java +++ b/src/main/java/net/sf/jsqlparser/statement/ConnectionDefinition.java @@ -1,89 +1,89 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2022 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement; - -import net.sf.jsqlparser.expression.StringValue; - -public class ConnectionDefinition { - private String connectionObjectName; - private StringValue connectionDefinition; - private UserIdentification userIdentification; - private CertificateVerification certificateVerification; - - public String getConnectionObjectName() { - return connectionObjectName; - } - - public void setConnectionObjectName(String connectionObjectName) { - this.connectionObjectName = connectionObjectName; - } - - public StringValue getConnectionDefinition() { - return connectionDefinition; - } - - public void setConnectionDefinition(StringValue connectionDefinition) { - this.connectionDefinition = connectionDefinition; - } - - public void setConnection(String connectionObjectName) { - this.connectionObjectName = connectionObjectName; - } - - public void setConnection(StringValue connectionDefinition) { - this.connectionDefinition = connectionDefinition; - } - - public UserIdentification getUserIdentification() { - return userIdentification; - } - - public void setUserIdentification(UserIdentification userIdentification) { - this.userIdentification = userIdentification; - } - - public CertificateVerification getCertificateVerification() { - return certificateVerification; - } - - public void setCertificateVerification(CertificateVerification certificateVerification) { - this.certificateVerification = certificateVerification; - } - - protected StringBuilder appendConnectionDefinition(StringBuilder sql) { - if (connectionObjectName != null) { - sql.append(connectionObjectName); - } else if (connectionDefinition != null) { - sql.append(connectionDefinition); - } - - if (userIdentification != null) { - sql.append(" "); - sql.append(userIdentification); - } - - if (certificateVerification != null) { - sql.append(" "); - sql.append(certificateVerification); - } - - return sql; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - sql.append("AT "); - appendConnectionDefinition(sql); - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.StringValue; + +public class ConnectionDefinition { + private String connectionObjectName; + private StringValue connectionDefinition; + private UserIdentification userIdentification; + private CertificateVerification certificateVerification; + + public String getConnectionObjectName() { + return connectionObjectName; + } + + public void setConnectionObjectName(String connectionObjectName) { + this.connectionObjectName = connectionObjectName; + } + + public StringValue getConnectionDefinition() { + return connectionDefinition; + } + + public void setConnectionDefinition(StringValue connectionDefinition) { + this.connectionDefinition = connectionDefinition; + } + + public void setConnection(String connectionObjectName) { + this.connectionObjectName = connectionObjectName; + } + + public void setConnection(StringValue connectionDefinition) { + this.connectionDefinition = connectionDefinition; + } + + public UserIdentification getUserIdentification() { + return userIdentification; + } + + public void setUserIdentification(UserIdentification userIdentification) { + this.userIdentification = userIdentification; + } + + public CertificateVerification getCertificateVerification() { + return certificateVerification; + } + + public void setCertificateVerification(CertificateVerification certificateVerification) { + this.certificateVerification = certificateVerification; + } + + protected StringBuilder appendConnectionDefinition(StringBuilder sql) { + if (connectionObjectName != null) { + sql.append(connectionObjectName); + } else if (connectionDefinition != null) { + sql.append(connectionDefinition); + } + + if (userIdentification != null) { + sql.append(" "); + sql.append(userIdentification); + } + + if (certificateVerification != null) { + sql.append(" "); + sql.append(certificateVerification); + } + + return sql; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append("AT "); + appendConnectionDefinition(sql); + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java b/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java index 91599e963..f0e0d0cf1 100644 --- a/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java +++ b/src/main/java/net/sf/jsqlparser/statement/ConnectionFileDefinition.java @@ -1,59 +1,60 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2022 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement; - -import net.sf.jsqlparser.expression.StringValue; - -import java.util.List; - -public class ConnectionFileDefinition { - private ConnectionDefinition connectionDefinition; - private List filePaths; - - public ConnectionFileDefinition(List filePaths) { - this(null, filePaths); - } - - public ConnectionFileDefinition(ConnectionDefinition connectionDefinition, List filePaths) { - this.connectionDefinition = connectionDefinition; - this.filePaths = filePaths; - } - - public ConnectionDefinition getConnectionDefinition() { - return connectionDefinition; - } - - public void setConnectionDefinition(ConnectionDefinition connectionDefinition) { - this.connectionDefinition = connectionDefinition; - } - - public List getFilePaths() { - return filePaths; - } - - public void setFilePaths(List filePaths) { - this.filePaths = filePaths; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - if (connectionDefinition != null) { - sql.append(connectionDefinition); - } - - for (StringValue filePath : filePaths) { - sql.append(" FILE ").append(filePath); - } - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.StringValue; + +import java.util.List; + +public class ConnectionFileDefinition { + private ConnectionDefinition connectionDefinition; + private List filePaths; + + public ConnectionFileDefinition(List filePaths) { + this(null, filePaths); + } + + public ConnectionFileDefinition(ConnectionDefinition connectionDefinition, + List filePaths) { + this.connectionDefinition = connectionDefinition; + this.filePaths = filePaths; + } + + public ConnectionDefinition getConnectionDefinition() { + return connectionDefinition; + } + + public void setConnectionDefinition(ConnectionDefinition connectionDefinition) { + this.connectionDefinition = connectionDefinition; + } + + public List getFilePaths() { + return filePaths; + } + + public void setFilePaths(List filePaths) { + this.filePaths = filePaths; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + if (connectionDefinition != null) { + sql.append(connectionDefinition); + } + + for (StringValue filePath : filePaths) { + sql.append(" FILE ").append(filePath); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/DBMSType.java b/src/main/java/net/sf/jsqlparser/statement/DBMSType.java index 8feaf977f..4b3d667da 100644 --- a/src/main/java/net/sf/jsqlparser/statement/DBMSType.java +++ b/src/main/java/net/sf/jsqlparser/statement/DBMSType.java @@ -1,54 +1,52 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2019 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement; - -import net.sf.jsqlparser.expression.StringValue; - -public class DBMSType implements SourceDestinationType { - private final Kind dbmsType; - private StringValue jdbcDriverDefinition; - - public DBMSType(String dbmsType) { - this(dbmsType, null); - } - - public DBMSType(String dbmsType, String jdbcDriverDefinition) { - this.dbmsType = Kind.valueOf(dbmsType.toUpperCase()); - if (jdbcDriverDefinition != null) { - this.jdbcDriverDefinition = new StringValue(jdbcDriverDefinition); - } - } - - private enum Kind { - EXA, - ORA, - JDBC - } - - public StringValue getJDBCDriverDefinition() { - return jdbcDriverDefinition; - } - - public void setJDBCDriverDefinition(StringValue jdbcDriverDefinition) { - this.jdbcDriverDefinition = jdbcDriverDefinition; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - sql.append(dbmsType); - if (jdbcDriverDefinition != null) { - sql.append(" DRIVER = ").append(jdbcDriverDefinition); - } - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.StringValue; + +public class DBMSType implements SourceDestinationType { + private final Kind dbmsType; + private StringValue jdbcDriverDefinition; + + public DBMSType(String dbmsType) { + this(dbmsType, null); + } + + public DBMSType(String dbmsType, String jdbcDriverDefinition) { + this.dbmsType = Kind.valueOf(dbmsType.toUpperCase()); + if (jdbcDriverDefinition != null) { + this.jdbcDriverDefinition = new StringValue(jdbcDriverDefinition); + } + } + + private enum Kind { + EXA, ORA, JDBC + } + + public StringValue getJDBCDriverDefinition() { + return jdbcDriverDefinition; + } + + public void setJDBCDriverDefinition(StringValue jdbcDriverDefinition) { + this.jdbcDriverDefinition = jdbcDriverDefinition; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append(dbmsType); + if (jdbcDriverDefinition != null) { + sql.append(" DRIVER = ").append(jdbcDriverDefinition); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/ErrorClause.java b/src/main/java/net/sf/jsqlparser/statement/ErrorClause.java index f574da4bc..8f2053946 100644 --- a/src/main/java/net/sf/jsqlparser/statement/ErrorClause.java +++ b/src/main/java/net/sf/jsqlparser/statement/ErrorClause.java @@ -1,88 +1,88 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2022 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement; - -import net.sf.jsqlparser.expression.Expression; - -public class ErrorClause { - private ErrorDestination errorDestination; - private Expression expression; - private RejectClause rejectClause; - private boolean replace; - private boolean truncate; - - public ErrorDestination getErrorDestination() { - return errorDestination; - } - - public void setErrorDestination(ErrorDestination errorDestination) { - this.errorDestination = errorDestination; - } - - public Expression getExpression() { - return expression; - } - - public void setExpression(Expression expression) { - this.expression = expression; - } - - public RejectClause getRejectClause() { - return rejectClause; - } - - public void setRejectClause(RejectClause rejectClause) { - this.rejectClause = rejectClause; - } - - public boolean isReplace() { - return replace; - } - - public void setReplace(boolean replace) { - this.replace = replace; - } - - public boolean isTruncate() { - return truncate; - } - - public void setTruncate(boolean truncate) { - this.truncate = truncate; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - if (errorDestination != null) { - sql.append("ERRORS INTO "); - sql.append(errorDestination); - if (expression != null) { - sql.append(" ("); - sql.append(expression); - sql.append(")"); - } - - if (replace) { - sql.append(" REPLACE"); - } else if (truncate) { - sql.append(" TRUNCATE"); - } - } - - if (rejectClause != null) { - sql.append(" "); - sql.append(rejectClause); - } - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.Expression; + +public class ErrorClause { + private ErrorDestination errorDestination; + private Expression expression; + private RejectClause rejectClause; + private boolean replace; + private boolean truncate; + + public ErrorDestination getErrorDestination() { + return errorDestination; + } + + public void setErrorDestination(ErrorDestination errorDestination) { + this.errorDestination = errorDestination; + } + + public Expression getExpression() { + return expression; + } + + public void setExpression(Expression expression) { + this.expression = expression; + } + + public RejectClause getRejectClause() { + return rejectClause; + } + + public void setRejectClause(RejectClause rejectClause) { + this.rejectClause = rejectClause; + } + + public boolean isReplace() { + return replace; + } + + public void setReplace(boolean replace) { + this.replace = replace; + } + + public boolean isTruncate() { + return truncate; + } + + public void setTruncate(boolean truncate) { + this.truncate = truncate; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + if (errorDestination != null) { + sql.append("ERRORS INTO "); + sql.append(errorDestination); + if (expression != null) { + sql.append(" ("); + sql.append(expression); + sql.append(")"); + } + + if (replace) { + sql.append(" REPLACE"); + } else if (truncate) { + sql.append(" TRUNCATE"); + } + } + + if (rejectClause != null) { + sql.append(" "); + sql.append(rejectClause); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/ErrorDestination.java b/src/main/java/net/sf/jsqlparser/statement/ErrorDestination.java index 1ad02661f..258a39ebb 100644 --- a/src/main/java/net/sf/jsqlparser/statement/ErrorDestination.java +++ b/src/main/java/net/sf/jsqlparser/statement/ErrorDestination.java @@ -1,13 +1,13 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2022 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement; - -public interface ErrorDestination { -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +public interface ErrorDestination { +} diff --git a/src/main/java/net/sf/jsqlparser/statement/FBVColumn.java b/src/main/java/net/sf/jsqlparser/statement/FBVColumn.java index 664ab40aa..a1846efd9 100644 --- a/src/main/java/net/sf/jsqlparser/statement/FBVColumn.java +++ b/src/main/java/net/sf/jsqlparser/statement/FBVColumn.java @@ -1,98 +1,98 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2022 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement; - -import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.expression.LongValue; -import net.sf.jsqlparser.expression.StringValue; - -public class FBVColumn { - private boolean precedesComma; - private String key; - private Expression value; - private String stringValue; - - private FBVColumn(String key, Expression value) { - this.key = key; - this.value = value; - this.stringValue = null; - } - - public FBVColumn(String key, String value) { - this.key = key; - this.value = null; - this.stringValue = value; - } - - public FBVColumn(String key, StringValue value) { - this(key, (Expression) value); - } - - public FBVColumn(String key, LongValue value) { - this(key, (Expression) value); - } - - public boolean precedesComma() { - return precedesComma; - } - - public void setPrecedesComma(boolean precedesComma) { - this.precedesComma = precedesComma; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public Expression getValue() { - return value; - } - - public void setValue(String value) { - this.stringValue = value; - this.value = null; - } - - private void setValue(Expression value) { - this.value = value; - this.stringValue = null; - } - - public void setValue(StringValue value) { - setValue((Expression) value); - } - - public void setValue(LongValue value) { - setValue((Expression) value); - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - if (precedesComma) { - sql.append(", "); - } - - sql.append(key); - sql.append(" = "); - if (stringValue != null) { - sql.append(stringValue); - } else { - sql.append(value); - } - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.StringValue; + +public class FBVColumn { + private boolean precedesComma; + private String key; + private Expression value; + private String stringValue; + + private FBVColumn(String key, Expression value) { + this.key = key; + this.value = value; + this.stringValue = null; + } + + public FBVColumn(String key, String value) { + this.key = key; + this.value = null; + this.stringValue = value; + } + + public FBVColumn(String key, StringValue value) { + this(key, (Expression) value); + } + + public FBVColumn(String key, LongValue value) { + this(key, (Expression) value); + } + + public boolean precedesComma() { + return precedesComma; + } + + public void setPrecedesComma(boolean precedesComma) { + this.precedesComma = precedesComma; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public Expression getValue() { + return value; + } + + public void setValue(String value) { + this.stringValue = value; + this.value = null; + } + + private void setValue(Expression value) { + this.value = value; + this.stringValue = null; + } + + public void setValue(StringValue value) { + setValue((Expression) value); + } + + public void setValue(LongValue value) { + setValue((Expression) value); + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + if (precedesComma) { + sql.append(", "); + } + + sql.append(key); + sql.append(" = "); + if (stringValue != null) { + sql.append(stringValue); + } else { + sql.append(value); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/FileOption.java b/src/main/java/net/sf/jsqlparser/statement/FileOption.java index 735cd6bfb..ff91f571b 100644 --- a/src/main/java/net/sf/jsqlparser/statement/FileOption.java +++ b/src/main/java/net/sf/jsqlparser/statement/FileOption.java @@ -1,85 +1,85 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2022 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement; - -import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.expression.LongValue; -import net.sf.jsqlparser.expression.StringValue; - -public class FileOption { - private String key; - private Expression value; - private String stringValue; - - private FileOption(String key, Expression value) { - this.key = key; - this.value = value; - this.stringValue = null; - } - - public FileOption(String key, String value) { - this.key = key; - this.value = null; - this.stringValue = value; - } - - public FileOption(String key) { - this(key, (Expression) null); - } - - public FileOption(String key, StringValue value) { - this(key, (Expression) value); - } - - public FileOption(String key, LongValue value) { - this(key, (Expression) value); - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public Expression getValue() { - return value; - } - - public void setValue(StringValue value) { - this.value = value; - } - - public void setValue(LongValue value) { - this.value = value; - } - - public void setValue(String value) { - this.stringValue = value; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - sql.append(key); - if (value != null || stringValue != null) { - sql.append(" = "); - if (stringValue != null) { - sql.append(stringValue); - } else { - sql.append(value); - } - } - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.StringValue; + +public class FileOption { + private String key; + private Expression value; + private String stringValue; + + private FileOption(String key, Expression value) { + this.key = key; + this.value = value; + this.stringValue = null; + } + + public FileOption(String key, String value) { + this.key = key; + this.value = null; + this.stringValue = value; + } + + public FileOption(String key) { + this(key, (Expression) null); + } + + public FileOption(String key, StringValue value) { + this(key, (Expression) value); + } + + public FileOption(String key, LongValue value) { + this(key, (Expression) value); + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public Expression getValue() { + return value; + } + + public void setValue(StringValue value) { + this.value = value; + } + + public void setValue(LongValue value) { + this.value = value; + } + + public void setValue(String value) { + this.stringValue = value; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append(key); + if (value != null || stringValue != null) { + sql.append(" = "); + if (stringValue != null) { + sql.append(stringValue); + } else { + sql.append(value); + } + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/FileSourceDestination.java b/src/main/java/net/sf/jsqlparser/statement/FileSourceDestination.java index 722301747..d5a79ed8f 100644 --- a/src/main/java/net/sf/jsqlparser/statement/FileSourceDestination.java +++ b/src/main/java/net/sf/jsqlparser/statement/FileSourceDestination.java @@ -1,132 +1,133 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2019 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement; - -import net.sf.jsqlparser.statement.select.PlainSelect; - -import java.io.Serializable; -import java.util.List; -import java.util.Objects; - -public abstract class FileSourceDestination implements Serializable { - private SourceDestinationType type; - private List connectionFileDefinitions; - private Boolean local; - private Boolean secure; - private List csvColumns; - private List fbvColumns; - private List fileOptions; - private CertificateVerification certificateVerification; - - protected SourceDestinationType getType() { - return type; - } - - protected void setType(SourceDestinationType type) { - this.type = type; - } - - public List getConnectionFileDefinitions() { - return connectionFileDefinitions; - } - - public void setConnectionFileDefinitions(List connectionFileDefinitions) { - this.connectionFileDefinitions = connectionFileDefinitions; - } - - public Boolean isLocal() { - return local; - } - - public void setLocal(Boolean local) { - this.local = local; - } - - public Boolean isSecure() { - return secure; - } - - public void setSecure(Boolean secure) { - this.secure = secure; - } - - public List getCSVColumns() { - return csvColumns; - } - - public void setCSVColumns(List csvColumns) { - this.csvColumns = csvColumns; - } - - public List getFBVColumns() { - return fbvColumns; - } - - public void setFBVColumns(List fbvColumns) { - this.fbvColumns = fbvColumns; - } - - public List getFileOptions() { - return fileOptions; - } - - public void setFileOptions(List fileOptions) { - this.fileOptions = fileOptions; - } - - public CertificateVerification getCertificateVerification() { - return certificateVerification; - } - - public void setCertificateVerification(CertificateVerification certificateVerification) { - this.certificateVerification = certificateVerification; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - if (local != null) { - if (local) { - sql.append("LOCAL "); - } - - if (Objects.requireNonNullElse(secure, false)) { - sql.append("SECURE "); - } - } - - sql.append(type); - if (connectionFileDefinitions != null) { - sql.append(" "); - PlainSelect.appendStringListTo(sql, connectionFileDefinitions, false, false); - } - - if (csvColumns != null) { - sql.append(" "); - PlainSelect.appendStringListTo(sql, csvColumns, true, true); - } else if (fbvColumns != null) { - sql.append(" "); - PlainSelect.appendStringListTo(sql, fbvColumns, false, true); - } - - if (fileOptions != null) { - sql.append(" "); - PlainSelect.appendStringListTo(sql, fileOptions, false, false); - } - - if (certificateVerification != null) { - sql.append(" "); - sql.append(certificateVerification); - } - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.statement.select.PlainSelect; + +import java.io.Serializable; +import java.util.List; +import java.util.Objects; + +public abstract class FileSourceDestination implements Serializable { + private SourceDestinationType type; + private List connectionFileDefinitions; + private Boolean local; + private Boolean secure; + private List csvColumns; + private List fbvColumns; + private List fileOptions; + private CertificateVerification certificateVerification; + + protected SourceDestinationType getType() { + return type; + } + + protected void setType(SourceDestinationType type) { + this.type = type; + } + + public List getConnectionFileDefinitions() { + return connectionFileDefinitions; + } + + public void setConnectionFileDefinitions( + List connectionFileDefinitions) { + this.connectionFileDefinitions = connectionFileDefinitions; + } + + public Boolean isLocal() { + return local; + } + + public void setLocal(Boolean local) { + this.local = local; + } + + public Boolean isSecure() { + return secure; + } + + public void setSecure(Boolean secure) { + this.secure = secure; + } + + public List getCSVColumns() { + return csvColumns; + } + + public void setCSVColumns(List csvColumns) { + this.csvColumns = csvColumns; + } + + public List getFBVColumns() { + return fbvColumns; + } + + public void setFBVColumns(List fbvColumns) { + this.fbvColumns = fbvColumns; + } + + public List getFileOptions() { + return fileOptions; + } + + public void setFileOptions(List fileOptions) { + this.fileOptions = fileOptions; + } + + public CertificateVerification getCertificateVerification() { + return certificateVerification; + } + + public void setCertificateVerification(CertificateVerification certificateVerification) { + this.certificateVerification = certificateVerification; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + if (local != null) { + if (local) { + sql.append("LOCAL "); + } + + if (Objects.requireNonNullElse(secure, false)) { + sql.append("SECURE "); + } + } + + sql.append(type); + if (connectionFileDefinitions != null) { + sql.append(" "); + PlainSelect.appendStringListTo(sql, connectionFileDefinitions, false, false); + } + + if (csvColumns != null) { + sql.append(" "); + PlainSelect.appendStringListTo(sql, csvColumns, true, true); + } else if (fbvColumns != null) { + sql.append(" "); + PlainSelect.appendStringListTo(sql, fbvColumns, false, true); + } + + if (fileOptions != null) { + sql.append(" "); + PlainSelect.appendStringListTo(sql, fileOptions, false, false); + } + + if (certificateVerification != null) { + sql.append(" "); + sql.append(certificateVerification); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/FileType.java b/src/main/java/net/sf/jsqlparser/statement/FileType.java index 9a9c9807a..7ea1535f9 100644 --- a/src/main/java/net/sf/jsqlparser/statement/FileType.java +++ b/src/main/java/net/sf/jsqlparser/statement/FileType.java @@ -1,28 +1,27 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2025 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement; - -public class FileType implements SourceDestinationType { - private final Kind fileType; - - public FileType(String fileType) { - this.fileType = Kind.valueOf(fileType.toUpperCase()); - } - - private enum Kind { - CSV, - FBV - } - - @Override - public String toString() { - return fileType.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2025 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +public class FileType implements SourceDestinationType { + private final Kind fileType; + + public FileType(String fileType) { + this.fileType = Kind.valueOf(fileType.toUpperCase()); + } + + private enum Kind { + CSV, FBV + } + + @Override + public String toString() { + return fileType.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/LikeClause.java b/src/main/java/net/sf/jsqlparser/statement/LikeClause.java index 65022a081..448b4de72 100644 --- a/src/main/java/net/sf/jsqlparser/statement/LikeClause.java +++ b/src/main/java/net/sf/jsqlparser/statement/LikeClause.java @@ -21,7 +21,8 @@ /** * Exasol Like Clause * - * @see Like Clause in CREATE TABLE + * @see Like Clause in CREATE + * TABLE * @see Like Clause in IMPORT */ public class LikeClause implements ImportColumn, Serializable { diff --git a/src/main/java/net/sf/jsqlparser/statement/RejectClause.java b/src/main/java/net/sf/jsqlparser/statement/RejectClause.java index 0816425d8..6ffafea26 100644 --- a/src/main/java/net/sf/jsqlparser/statement/RejectClause.java +++ b/src/main/java/net/sf/jsqlparser/statement/RejectClause.java @@ -1,51 +1,51 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2022 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement; - -import net.sf.jsqlparser.expression.LongValue; - -public class RejectClause { - private LongValue limit; - private boolean errors; - - public LongValue getLimit() { - return limit; - } - - public void setLimit(LongValue limit) { - this.limit = limit; - } - - public boolean isErrors() { - return errors; - } - - public void setErrors(boolean errors) { - this.errors = errors; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - sql.append("REJECT LIMIT "); - if (limit != null) { - sql.append(limit); - } else { - sql.append("UNLIMITED"); - } - - if (errors) { - sql.append(" ERRORS"); - } - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.LongValue; + +public class RejectClause { + private LongValue limit; + private boolean errors; + + public LongValue getLimit() { + return limit; + } + + public void setLimit(LongValue limit) { + this.limit = limit; + } + + public boolean isErrors() { + return errors; + } + + public void setErrors(boolean errors) { + this.errors = errors; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append("REJECT LIMIT "); + if (limit != null) { + sql.append(limit); + } else { + sql.append("UNLIMITED"); + } + + if (errors) { + sql.append(" ERRORS"); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/ScriptSourceDestination.java b/src/main/java/net/sf/jsqlparser/statement/ScriptSourceDestination.java index 8b1ea2246..c1193b037 100644 --- a/src/main/java/net/sf/jsqlparser/statement/ScriptSourceDestination.java +++ b/src/main/java/net/sf/jsqlparser/statement/ScriptSourceDestination.java @@ -1,99 +1,99 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2019 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement; - -import net.sf.jsqlparser.expression.StringValue; -import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.export.ExportIntoItem; -import net.sf.jsqlparser.statement.imprt.ImportFromItem; - -import java.io.Serializable; -import java.util.List; - -public class ScriptSourceDestination implements ImportFromItem, ExportIntoItem, Serializable { - private Table script; - private ConnectionDefinition connectionDefinition; - private List properties; - private List values; - private ErrorClause errorClause; - - public Table getScript() { - return script; - } - - public void setScript(Table script) { - this.script = script; - } - - public ConnectionDefinition getConnectionDefinition() { - return connectionDefinition; - } - - public void setConnectionDefinition(ConnectionDefinition connectionDefinition) { - this.connectionDefinition = connectionDefinition; - } - - public List getProperties() { - return properties; - } - - public void setProperties(List properties) { - this.properties = properties; - } - - public List getValues() { - return values; - } - - public void setValues(List values) { - this.values = values; - } - - @Override - public ErrorClause getErrorClause() { - return errorClause; - } - - @Override - public void setErrorClause(ErrorClause errorClause) { - this.errorClause = errorClause; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - sql.append("SCRIPT "); - sql.append(script); - - if (connectionDefinition != null) { - sql.append(" "); - sql.append(connectionDefinition); - } - - if (properties != null && values != null) { - sql.append(" WITH"); - - int max = Math.min(properties.size(), values.size()); - for (int i = 0; i < max; i++) { - sql.append(" "); - sql.append(properties.get(i)); - sql.append(" = "); - sql.append(values.get(i)); - } - } - - if (errorClause != null) { - sql.append(errorClause); - } - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.StringValue; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.export.ExportIntoItem; +import net.sf.jsqlparser.statement.imprt.ImportFromItem; + +import java.io.Serializable; +import java.util.List; + +public class ScriptSourceDestination implements ImportFromItem, ExportIntoItem, Serializable { + private Table script; + private ConnectionDefinition connectionDefinition; + private List properties; + private List values; + private ErrorClause errorClause; + + public Table getScript() { + return script; + } + + public void setScript(Table script) { + this.script = script; + } + + public ConnectionDefinition getConnectionDefinition() { + return connectionDefinition; + } + + public void setConnectionDefinition(ConnectionDefinition connectionDefinition) { + this.connectionDefinition = connectionDefinition; + } + + public List getProperties() { + return properties; + } + + public void setProperties(List properties) { + this.properties = properties; + } + + public List getValues() { + return values; + } + + public void setValues(List values) { + this.values = values; + } + + @Override + public ErrorClause getErrorClause() { + return errorClause; + } + + @Override + public void setErrorClause(ErrorClause errorClause) { + this.errorClause = errorClause; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append("SCRIPT "); + sql.append(script); + + if (connectionDefinition != null) { + sql.append(" "); + sql.append(connectionDefinition); + } + + if (properties != null && values != null) { + sql.append(" WITH"); + + int max = Math.min(properties.size(), values.size()); + for (int i = 0; i < max; i++) { + sql.append(" "); + sql.append(properties.get(i)); + sql.append(" = "); + sql.append(values.get(i)); + } + } + + if (errorClause != null) { + sql.append(errorClause); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/SourceDestinationType.java b/src/main/java/net/sf/jsqlparser/statement/SourceDestinationType.java index 469ccc330..743d21378 100644 --- a/src/main/java/net/sf/jsqlparser/statement/SourceDestinationType.java +++ b/src/main/java/net/sf/jsqlparser/statement/SourceDestinationType.java @@ -1,13 +1,13 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2019 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement; - -public interface SourceDestinationType { -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +public interface SourceDestinationType { +} diff --git a/src/main/java/net/sf/jsqlparser/statement/UserIdentification.java b/src/main/java/net/sf/jsqlparser/statement/UserIdentification.java index 43a8d3f4b..853c4694f 100644 --- a/src/main/java/net/sf/jsqlparser/statement/UserIdentification.java +++ b/src/main/java/net/sf/jsqlparser/statement/UserIdentification.java @@ -1,46 +1,46 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2022 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement; - -import net.sf.jsqlparser.expression.StringValue; - -public class UserIdentification { - private StringValue user; - private StringValue password; - - public StringValue getUser() { - return user; - } - - public void setUser(StringValue user) { - this.user = user; - } - - public StringValue getPassword() { - return password; - } - - public void setPassword(StringValue password) { - this.password = password; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - sql.append("USER "); - sql.append(user); - - sql.append(" IDENTIFIED BY "); - sql.append(password); - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.expression.StringValue; + +public class UserIdentification { + private StringValue user; + private StringValue password; + + public StringValue getUser() { + return user; + } + + public void setUser(StringValue user) { + this.user = user; + } + + public StringValue getPassword() { + return password; + } + + public void setPassword(StringValue password) { + this.password = password; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append("USER "); + sql.append(user); + + sql.append(" IDENTIFIED BY "); + sql.append(password); + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/export/DBMSDestination.java b/src/main/java/net/sf/jsqlparser/statement/export/DBMSDestination.java index 313299b05..38774023a 100644 --- a/src/main/java/net/sf/jsqlparser/statement/export/DBMSDestination.java +++ b/src/main/java/net/sf/jsqlparser/statement/export/DBMSDestination.java @@ -1,117 +1,118 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2019 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement.export; - -import net.sf.jsqlparser.expression.StringValue; -import net.sf.jsqlparser.expression.operators.relational.ExpressionList; -import net.sf.jsqlparser.schema.Column; -import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.ConnectionDefinition; -import net.sf.jsqlparser.statement.ErrorClause; -import net.sf.jsqlparser.statement.SourceDestinationType; -import net.sf.jsqlparser.statement.select.PlainSelect; - -import java.io.Serializable; -import java.util.List; - -public class DBMSDestination implements ExportIntoItem, Serializable { - private SourceDestinationType destinationType; - private ConnectionDefinition connectionDefinition; - private Table table; - private ExpressionList columns; - private List dbmsTableDestinationOptions; - private StringValue statement; - private ErrorClause errorClause; - - public SourceDestinationType getDestinationType() { - return destinationType; - } - - public void setDestinationType(SourceDestinationType destinationType) { - this.destinationType = destinationType; - } - - public ConnectionDefinition getConnectionDefinition() { - return connectionDefinition; - } - - public void setConnectionDefinition(ConnectionDefinition connectionDefinition) { - this.connectionDefinition = connectionDefinition; - } - - public Table getTable() { - return table; - } - - public void setTable(Table table) { - this.table = table; - } - - public ExpressionList getColumns() { - return columns; - } - - public void setColumns(ExpressionList columns) { - this.columns = columns; - } - - public List getDBMSTableDestinationOptions() { - return dbmsTableDestinationOptions; - } - - public void setDBMSTableDestinationOptions(List dbmsTableDestinationOptions) { - this.dbmsTableDestinationOptions = dbmsTableDestinationOptions; - } - - public StringValue getStatement() { - return statement; - } - - public void setStatement(StringValue statement) { - this.statement = statement; - } - - @Override - public ErrorClause getErrorClause() { - return errorClause; - } - - @Override - public void setErrorClause(ErrorClause errorClause) { - this.errorClause = errorClause; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - sql.append(destinationType); - - sql.append(" "); - sql.append(connectionDefinition); - - if (table != null) { - sql.append(" TABLE ").append(table); - PlainSelect.appendStringListTo(sql, columns, true, true); - if (dbmsTableDestinationOptions != null) { - sql.append(" "); - PlainSelect.appendStringListTo(sql, dbmsTableDestinationOptions, false, false); - } - } else if (statement != null) { - sql.append(" STATEMENT ").append(statement); - } - - if (errorClause != null) { - sql.append(errorClause); - } - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.export; + +import net.sf.jsqlparser.expression.StringValue; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.ConnectionDefinition; +import net.sf.jsqlparser.statement.ErrorClause; +import net.sf.jsqlparser.statement.SourceDestinationType; +import net.sf.jsqlparser.statement.select.PlainSelect; + +import java.io.Serializable; +import java.util.List; + +public class DBMSDestination implements ExportIntoItem, Serializable { + private SourceDestinationType destinationType; + private ConnectionDefinition connectionDefinition; + private Table table; + private ExpressionList columns; + private List dbmsTableDestinationOptions; + private StringValue statement; + private ErrorClause errorClause; + + public SourceDestinationType getDestinationType() { + return destinationType; + } + + public void setDestinationType(SourceDestinationType destinationType) { + this.destinationType = destinationType; + } + + public ConnectionDefinition getConnectionDefinition() { + return connectionDefinition; + } + + public void setConnectionDefinition(ConnectionDefinition connectionDefinition) { + this.connectionDefinition = connectionDefinition; + } + + public Table getTable() { + return table; + } + + public void setTable(Table table) { + this.table = table; + } + + public ExpressionList getColumns() { + return columns; + } + + public void setColumns(ExpressionList columns) { + this.columns = columns; + } + + public List getDBMSTableDestinationOptions() { + return dbmsTableDestinationOptions; + } + + public void setDBMSTableDestinationOptions( + List dbmsTableDestinationOptions) { + this.dbmsTableDestinationOptions = dbmsTableDestinationOptions; + } + + public StringValue getStatement() { + return statement; + } + + public void setStatement(StringValue statement) { + this.statement = statement; + } + + @Override + public ErrorClause getErrorClause() { + return errorClause; + } + + @Override + public void setErrorClause(ErrorClause errorClause) { + this.errorClause = errorClause; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append(destinationType); + + sql.append(" "); + sql.append(connectionDefinition); + + if (table != null) { + sql.append(" TABLE ").append(table); + PlainSelect.appendStringListTo(sql, columns, true, true); + if (dbmsTableDestinationOptions != null) { + sql.append(" "); + PlainSelect.appendStringListTo(sql, dbmsTableDestinationOptions, false, false); + } + } else if (statement != null) { + sql.append(" STATEMENT ").append(statement); + } + + if (errorClause != null) { + sql.append(errorClause); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java b/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java index 090b1c597..cc013ea46 100644 --- a/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java +++ b/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java @@ -1,65 +1,65 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2022 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement.export; - -import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.expression.LongValue; -import net.sf.jsqlparser.expression.StringValue; - -public class DBMSTableDestinationOption { - private String key; - private Expression value; - - private DBMSTableDestinationOption(String key, Expression value) { - this.key = key; - this.value = value; - } - - public DBMSTableDestinationOption(String key) { - this(key, (Expression) null); - } - - public DBMSTableDestinationOption(String key, StringValue value) { - this(key, (Expression) value); - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public Expression getValue() { - return value; - } - - public void setValue(StringValue value) { - this.value = value; - } - - public void setValue(LongValue value) { - this.value = value; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - sql.append(key); - if (value != null) { - sql.append(" "); - sql.append(value); - } - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.export; + +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.StringValue; + +public class DBMSTableDestinationOption { + private String key; + private Expression value; + + private DBMSTableDestinationOption(String key, Expression value) { + this.key = key; + this.value = value; + } + + public DBMSTableDestinationOption(String key) { + this(key, (Expression) null); + } + + public DBMSTableDestinationOption(String key, StringValue value) { + this(key, (Expression) value); + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public Expression getValue() { + return value; + } + + public void setValue(StringValue value) { + this.value = value; + } + + public void setValue(LongValue value) { + this.value = value; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append(key); + if (value != null) { + sql.append(" "); + sql.append(value); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/export/Export.java b/src/main/java/net/sf/jsqlparser/statement/export/Export.java index 2b5d392ea..dd6628a20 100644 --- a/src/main/java/net/sf/jsqlparser/statement/export/Export.java +++ b/src/main/java/net/sf/jsqlparser/statement/export/Export.java @@ -1,81 +1,81 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2019 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement.export; - -import net.sf.jsqlparser.expression.operators.relational.ExpressionList; -import net.sf.jsqlparser.schema.Column; -import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; -import net.sf.jsqlparser.statement.StatementVisitor; -import net.sf.jsqlparser.statement.select.*; - -public class Export implements Statement { - private Table table; - private ExpressionList columns; - private Select select; - private ExportIntoItem exportIntoItem; - - public Table getTable() { - return table; - } - - public void setTable(Table table) { - this.table = table; - } - - public ExpressionList getColumns() { - return columns; - } - - public void setColumns(ExpressionList columns) { - this.columns = columns; - } - - public Select getSelect() { - return select; - } - - public void setSelect(Select select) { - this.select = select; - } - - public ExportIntoItem getExportIntoItem() { - return exportIntoItem; - } - - public void setExportIntoItem(ExportIntoItem exportIntoItem) { - this.exportIntoItem = exportIntoItem; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - sql.append("EXPORT "); - if (table != null || select != null) { - if (table != null) { - sql.append(table); - PlainSelect.appendStringListTo(sql, columns, true, true); - } else { - sql.append(select); - } - sql.append(" "); - } - - sql.append("INTO "); - sql.append(exportIntoItem); - - return sql.toString(); - } - - @Override - public T accept(StatementVisitor statementVisitor, S context) { - return statementVisitor.visit(this, context); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.export; + +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.StatementVisitor; +import net.sf.jsqlparser.statement.select.*; + +public class Export implements Statement { + private Table table; + private ExpressionList columns; + private Select select; + private ExportIntoItem exportIntoItem; + + public Table getTable() { + return table; + } + + public void setTable(Table table) { + this.table = table; + } + + public ExpressionList getColumns() { + return columns; + } + + public void setColumns(ExpressionList columns) { + this.columns = columns; + } + + public Select getSelect() { + return select; + } + + public void setSelect(Select select) { + this.select = select; + } + + public ExportIntoItem getExportIntoItem() { + return exportIntoItem; + } + + public void setExportIntoItem(ExportIntoItem exportIntoItem) { + this.exportIntoItem = exportIntoItem; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + sql.append("EXPORT "); + if (table != null || select != null) { + if (table != null) { + sql.append(table); + PlainSelect.appendStringListTo(sql, columns, true, true); + } else { + sql.append(select); + } + sql.append(" "); + } + + sql.append("INTO "); + sql.append(exportIntoItem); + + return sql.toString(); + } + + @Override + public T accept(StatementVisitor statementVisitor, S context) { + return statementVisitor.visit(this, context); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/export/ExportIntoItem.java b/src/main/java/net/sf/jsqlparser/statement/export/ExportIntoItem.java index 5a8b82a22..4558b67e9 100644 --- a/src/main/java/net/sf/jsqlparser/statement/export/ExportIntoItem.java +++ b/src/main/java/net/sf/jsqlparser/statement/export/ExportIntoItem.java @@ -1,18 +1,18 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2019 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement.export; - -import net.sf.jsqlparser.statement.ErrorClause; - -public interface ExportIntoItem { - ErrorClause getErrorClause(); - - void setErrorClause(ErrorClause errorClause); -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.export; + +import net.sf.jsqlparser.statement.ErrorClause; + +public interface ExportIntoItem { + ErrorClause getErrorClause(); + + void setErrorClause(ErrorClause errorClause); +} diff --git a/src/main/java/net/sf/jsqlparser/statement/export/FileDestination.java b/src/main/java/net/sf/jsqlparser/statement/export/FileDestination.java index d36b9afea..6ff364075 100644 --- a/src/main/java/net/sf/jsqlparser/statement/export/FileDestination.java +++ b/src/main/java/net/sf/jsqlparser/statement/export/FileDestination.java @@ -1,50 +1,50 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2019 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement.export; - -import net.sf.jsqlparser.statement.*; - -import java.io.Serializable; - -public class FileDestination extends FileSourceDestination implements ExportIntoItem, Serializable { - private ErrorClause errorClause; - - public SourceDestinationType getDestinationType() { - return getType(); - } - - public void setDestinationType(SourceDestinationType destinationType) { - setType(destinationType); - } - - @Override - public ErrorClause getErrorClause() { - return errorClause; - } - - @Override - public void setErrorClause(ErrorClause errorClause) { - this.errorClause = errorClause; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - sql.append(super.toString()); - - if (errorClause != null) { - sql.append(" "); - sql.append(errorClause); - } - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.export; + +import net.sf.jsqlparser.statement.*; + +import java.io.Serializable; + +public class FileDestination extends FileSourceDestination implements ExportIntoItem, Serializable { + private ErrorClause errorClause; + + public SourceDestinationType getDestinationType() { + return getType(); + } + + public void setDestinationType(SourceDestinationType destinationType) { + setType(destinationType); + } + + @Override + public ErrorClause getErrorClause() { + return errorClause; + } + + @Override + public void setErrorClause(ErrorClause errorClause) { + this.errorClause = errorClause; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append(super.toString()); + + if (errorClause != null) { + sql.append(" "); + sql.append(errorClause); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java b/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java index 65fc62575..0845af338 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/DBMSSource.java @@ -1,106 +1,106 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2019 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement.imprt; - -import net.sf.jsqlparser.expression.StringValue; -import net.sf.jsqlparser.expression.operators.relational.ExpressionList; -import net.sf.jsqlparser.schema.Column; -import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.ConnectionDefinition; -import net.sf.jsqlparser.statement.ErrorClause; -import net.sf.jsqlparser.statement.SourceDestinationType; -import net.sf.jsqlparser.statement.select.PlainSelect; - -import java.io.Serializable; -import java.util.List; - -public class DBMSSource implements ImportFromItem, Serializable { - private SourceDestinationType sourceType; - private ConnectionDefinition connectionDefinition; - private Table table; - private ExpressionList columns; - private List statements; - private ErrorClause errorClause; - - public SourceDestinationType getSourceType() { - return sourceType; - } - - public void setSourceType(SourceDestinationType sourceType) { - this.sourceType = sourceType; - } - - public ConnectionDefinition getConnectionDefinition() { - return connectionDefinition; - } - - public void setConnectionDefinition(ConnectionDefinition connectionDefinition) { - this.connectionDefinition = connectionDefinition; - } - - public Table getTable() { - return table; - } - - public void setTable(Table table) { - this.table = table; - } - - public ExpressionList getColumns() { - return columns; - } - - public void setColumns(ExpressionList columns) { - this.columns = columns; - } - - public List getStatements() { - return statements; - } - - public void setStatements(List statements) { - this.statements = statements; - } - - @Override - public ErrorClause getErrorClause() { - return errorClause; - } - - @Override - public void setErrorClause(ErrorClause errorClause) { - this.errorClause = errorClause; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - sql.append(sourceType); - - sql.append(" "); - sql.append(connectionDefinition); - - if (table != null) { - sql.append(" TABLE ").append(table); - PlainSelect.appendStringListTo(sql, columns, true, true); - } else if (statements != null) { - for (StringValue statement : statements) { - sql.append(" STATEMENT ").append(statement); - } - } - - if (errorClause != null) { - sql.append(errorClause); - } - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.imprt; + +import net.sf.jsqlparser.expression.StringValue; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.ConnectionDefinition; +import net.sf.jsqlparser.statement.ErrorClause; +import net.sf.jsqlparser.statement.SourceDestinationType; +import net.sf.jsqlparser.statement.select.PlainSelect; + +import java.io.Serializable; +import java.util.List; + +public class DBMSSource implements ImportFromItem, Serializable { + private SourceDestinationType sourceType; + private ConnectionDefinition connectionDefinition; + private Table table; + private ExpressionList columns; + private List statements; + private ErrorClause errorClause; + + public SourceDestinationType getSourceType() { + return sourceType; + } + + public void setSourceType(SourceDestinationType sourceType) { + this.sourceType = sourceType; + } + + public ConnectionDefinition getConnectionDefinition() { + return connectionDefinition; + } + + public void setConnectionDefinition(ConnectionDefinition connectionDefinition) { + this.connectionDefinition = connectionDefinition; + } + + public Table getTable() { + return table; + } + + public void setTable(Table table) { + this.table = table; + } + + public ExpressionList getColumns() { + return columns; + } + + public void setColumns(ExpressionList columns) { + this.columns = columns; + } + + public List getStatements() { + return statements; + } + + public void setStatements(List statements) { + this.statements = statements; + } + + @Override + public ErrorClause getErrorClause() { + return errorClause; + } + + @Override + public void setErrorClause(ErrorClause errorClause) { + this.errorClause = errorClause; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append(sourceType); + + sql.append(" "); + sql.append(connectionDefinition); + + if (table != null) { + sql.append(" TABLE ").append(table); + PlainSelect.appendStringListTo(sql, columns, true, true); + } else if (statements != null) { + for (StringValue statement : statements) { + sql.append(" STATEMENT ").append(statement); + } + } + + if (errorClause != null) { + sql.append(errorClause); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java b/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java index 6130c5e21..0be5bbab6 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/FileSource.java @@ -1,50 +1,50 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2019 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement.imprt; - -import net.sf.jsqlparser.statement.*; - -import java.io.Serializable; - -public class FileSource extends FileSourceDestination implements ImportFromItem, Serializable { - private ErrorClause errorClause; - - public SourceDestinationType getSourceType() { - return getType(); - } - - public void setSourceType(SourceDestinationType sourceType) { - setType(sourceType); - } - - @Override - public ErrorClause getErrorClause() { - return errorClause; - } - - @Override - public void setErrorClause(ErrorClause errorClause) { - this.errorClause = errorClause; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - - sql.append(super.toString()); - - if (errorClause != null) { - sql.append(" "); - sql.append(errorClause); - } - - return sql.toString(); - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.imprt; + +import net.sf.jsqlparser.statement.*; + +import java.io.Serializable; + +public class FileSource extends FileSourceDestination implements ImportFromItem, Serializable { + private ErrorClause errorClause; + + public SourceDestinationType getSourceType() { + return getType(); + } + + public void setSourceType(SourceDestinationType sourceType) { + setType(sourceType); + } + + @Override + public ErrorClause getErrorClause() { + return errorClause; + } + + @Override + public void setErrorClause(ErrorClause errorClause) { + this.errorClause = errorClause; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + + sql.append(super.toString()); + + if (errorClause != null) { + sql.append(" "); + sql.append(errorClause); + } + + return sql.toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java b/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java index beb9911be..e71799a3d 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/Import.java @@ -1,128 +1,128 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2019 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement.imprt; - -import net.sf.jsqlparser.expression.Alias; -import net.sf.jsqlparser.expression.operators.relational.ExpressionList; -import net.sf.jsqlparser.parser.ASTNodeAccessImpl; -import net.sf.jsqlparser.schema.Column; -import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; -import net.sf.jsqlparser.statement.StatementVisitor; -import net.sf.jsqlparser.statement.select.*; - -import java.util.List; - -public class Import extends ASTNodeAccessImpl implements FromItem, Statement { - private Table table; - private ExpressionList columns; - private List importColumns; - private ImportFromItem fromItem; - private Alias alias; - - public Table getTable() { - return table; - } - - public void setTable(Table table) { - this.table = table; - } - - public ExpressionList getColumns() { - return columns; - } - - public void setColumns(ExpressionList columns) { - this.columns = columns; - } - - public List getImportColumns() { - return importColumns; - } - - public void setImportColumns(List importColumns) { - this.importColumns = importColumns; - } - - public ImportFromItem getFromItem() { - return fromItem; - } - - public void setFromItem(ImportFromItem fromItem) { - this.fromItem = fromItem; - } - - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - sql.append("IMPORT "); - if (table != null || importColumns != null) { - sql.append("INTO "); - if (table != null) { - sql.append(table); - PlainSelect.appendStringListTo(sql, columns, true, true); - } else { - PlainSelect.appendStringListTo(sql, importColumns, true, true); - } - sql.append(" "); - } - - sql.append("FROM "); - sql.append(fromItem); - - return sql.toString(); - } - - @Override - public T accept(StatementVisitor statementVisitor, S context) { - return statementVisitor.visit(this, context); - } - - @Override - public T accept(FromItemVisitor fromItemVisitor, S context) { - return fromItemVisitor.visit(this, context); - } - - @Override - public Alias getAlias() { - return alias; - } - - @Override - public void setAlias(Alias alias) { - this.alias = alias; - } - - @Override - public Pivot getPivot() { - return null; - } - - @Override - public void setPivot(Pivot pivot) {} - - @Override - public UnPivot getUnPivot() { - return null; - } - - @Override - public void setUnPivot(UnPivot unpivot) {} - - @Override - public SampleClause getSampleClause() { - return null; - } - - @Override - public FromItem setSampleClause(SampleClause sampleClause) { - return null; - } -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.imprt; + +import net.sf.jsqlparser.expression.Alias; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.parser.ASTNodeAccessImpl; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.StatementVisitor; +import net.sf.jsqlparser.statement.select.*; + +import java.util.List; + +public class Import extends ASTNodeAccessImpl implements FromItem, Statement { + private Table table; + private ExpressionList columns; + private List importColumns; + private ImportFromItem fromItem; + private Alias alias; + + public Table getTable() { + return table; + } + + public void setTable(Table table) { + this.table = table; + } + + public ExpressionList getColumns() { + return columns; + } + + public void setColumns(ExpressionList columns) { + this.columns = columns; + } + + public List getImportColumns() { + return importColumns; + } + + public void setImportColumns(List importColumns) { + this.importColumns = importColumns; + } + + public ImportFromItem getFromItem() { + return fromItem; + } + + public void setFromItem(ImportFromItem fromItem) { + this.fromItem = fromItem; + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(); + sql.append("IMPORT "); + if (table != null || importColumns != null) { + sql.append("INTO "); + if (table != null) { + sql.append(table); + PlainSelect.appendStringListTo(sql, columns, true, true); + } else { + PlainSelect.appendStringListTo(sql, importColumns, true, true); + } + sql.append(" "); + } + + sql.append("FROM "); + sql.append(fromItem); + + return sql.toString(); + } + + @Override + public T accept(StatementVisitor statementVisitor, S context) { + return statementVisitor.visit(this, context); + } + + @Override + public T accept(FromItemVisitor fromItemVisitor, S context) { + return fromItemVisitor.visit(this, context); + } + + @Override + public Alias getAlias() { + return alias; + } + + @Override + public void setAlias(Alias alias) { + this.alias = alias; + } + + @Override + public Pivot getPivot() { + return null; + } + + @Override + public void setPivot(Pivot pivot) {} + + @Override + public UnPivot getUnPivot() { + return null; + } + + @Override + public void setUnPivot(UnPivot unpivot) {} + + @Override + public SampleClause getSampleClause() { + return null; + } + + @Override + public FromItem setSampleClause(SampleClause sampleClause) { + return null; + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/ImportColumn.java b/src/main/java/net/sf/jsqlparser/statement/imprt/ImportColumn.java index 2a7698d6a..7d3f719dd 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/ImportColumn.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/ImportColumn.java @@ -1,13 +1,13 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2019 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement.imprt; - -public interface ImportColumn { -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.imprt; + +public interface ImportColumn { +} diff --git a/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java b/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java index e5a41546a..86e736cca 100644 --- a/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java +++ b/src/main/java/net/sf/jsqlparser/statement/imprt/ImportFromItem.java @@ -1,18 +1,18 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2019 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement.imprt; - -import net.sf.jsqlparser.statement.ErrorClause; - -public interface ImportFromItem { - ErrorClause getErrorClause(); - - void setErrorClause(ErrorClause errorClause); -} +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.imprt; + +import net.sf.jsqlparser.statement.ErrorClause; + +public interface ImportFromItem { + ErrorClause getErrorClause(); + + void setErrorClause(ErrorClause errorClause); +} From b56565d1f0586f7eb679e26379669fda7fb9f419 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Thu, 5 Jun 2025 17:06:16 +0200 Subject: [PATCH 24/27] fix: Fix spotbugsMain --- .../net/sf/jsqlparser/statement/CertificateVerification.java | 4 +++- .../net/sf/jsqlparser/statement/ConnectionDefinition.java | 4 +++- src/main/java/net/sf/jsqlparser/statement/ErrorClause.java | 4 +++- src/main/java/net/sf/jsqlparser/statement/RejectClause.java | 4 +++- .../java/net/sf/jsqlparser/statement/UserIdentification.java | 4 +++- .../statement/export/DBMSTableDestinationOption.java | 4 +++- 6 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java b/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java index 5ad49478f..7aabbb060 100644 --- a/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java +++ b/src/main/java/net/sf/jsqlparser/statement/CertificateVerification.java @@ -11,7 +11,9 @@ import net.sf.jsqlparser.expression.StringValue; -public class CertificateVerification { +import java.io.Serializable; + +public class CertificateVerification implements Serializable { private Boolean ignoreCertificate; private StringValue publicKey; diff --git a/src/main/java/net/sf/jsqlparser/statement/ConnectionDefinition.java b/src/main/java/net/sf/jsqlparser/statement/ConnectionDefinition.java index 2ce2602bf..f2887cf82 100644 --- a/src/main/java/net/sf/jsqlparser/statement/ConnectionDefinition.java +++ b/src/main/java/net/sf/jsqlparser/statement/ConnectionDefinition.java @@ -11,7 +11,9 @@ import net.sf.jsqlparser.expression.StringValue; -public class ConnectionDefinition { +import java.io.Serializable; + +public class ConnectionDefinition implements Serializable { private String connectionObjectName; private StringValue connectionDefinition; private UserIdentification userIdentification; diff --git a/src/main/java/net/sf/jsqlparser/statement/ErrorClause.java b/src/main/java/net/sf/jsqlparser/statement/ErrorClause.java index 8f2053946..92db1a3dc 100644 --- a/src/main/java/net/sf/jsqlparser/statement/ErrorClause.java +++ b/src/main/java/net/sf/jsqlparser/statement/ErrorClause.java @@ -11,7 +11,9 @@ import net.sf.jsqlparser.expression.Expression; -public class ErrorClause { +import java.io.Serializable; + +public class ErrorClause implements Serializable { private ErrorDestination errorDestination; private Expression expression; private RejectClause rejectClause; diff --git a/src/main/java/net/sf/jsqlparser/statement/RejectClause.java b/src/main/java/net/sf/jsqlparser/statement/RejectClause.java index 6ffafea26..5ca9f9714 100644 --- a/src/main/java/net/sf/jsqlparser/statement/RejectClause.java +++ b/src/main/java/net/sf/jsqlparser/statement/RejectClause.java @@ -11,7 +11,9 @@ import net.sf.jsqlparser.expression.LongValue; -public class RejectClause { +import java.io.Serializable; + +public class RejectClause implements Serializable { private LongValue limit; private boolean errors; diff --git a/src/main/java/net/sf/jsqlparser/statement/UserIdentification.java b/src/main/java/net/sf/jsqlparser/statement/UserIdentification.java index 853c4694f..d951931d9 100644 --- a/src/main/java/net/sf/jsqlparser/statement/UserIdentification.java +++ b/src/main/java/net/sf/jsqlparser/statement/UserIdentification.java @@ -11,7 +11,9 @@ import net.sf.jsqlparser.expression.StringValue; -public class UserIdentification { +import java.io.Serializable; + +public class UserIdentification implements Serializable { private StringValue user; private StringValue password; diff --git a/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java b/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java index cc013ea46..904acea95 100644 --- a/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java +++ b/src/main/java/net/sf/jsqlparser/statement/export/DBMSTableDestinationOption.java @@ -13,7 +13,9 @@ import net.sf.jsqlparser.expression.LongValue; import net.sf.jsqlparser.expression.StringValue; -public class DBMSTableDestinationOption { +import java.io.Serializable; + +public class DBMSTableDestinationOption implements Serializable { private String key; private Expression value; From 3b74289c706c8d47e893ad8a793dc20eb00b6d62 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Tue, 10 Jun 2025 09:46:38 +0200 Subject: [PATCH 25/27] feat: Add test for RTRIM and LTRIM functions Refs: #2256 --- .../net/sf/jsqlparser/expression/FunctionTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/java/net/sf/jsqlparser/expression/FunctionTest.java b/src/test/java/net/sf/jsqlparser/expression/FunctionTest.java index 0433222d3..8f3daf474 100644 --- a/src/test/java/net/sf/jsqlparser/expression/FunctionTest.java +++ b/src/test/java/net/sf/jsqlparser/expression/FunctionTest.java @@ -108,4 +108,15 @@ void testSimpleFunctionIssue2059() throws JSQLParserException { void testListAggOnOverflow(String sqlStr) throws Exception { TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); } + + @ParameterizedTest + @ValueSource(strings = { + "select RTRIM('string')", + "select LTRIM('string')", + "select RTRIM(field) from dual", + "select LTRIM(field) from dual" + }) + void testTrimFunctions(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + } } From 140a6f118ea41d2fe6bcc2aa9c6fed94907e1f52 Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Tue, 10 Jun 2025 10:01:00 +0200 Subject: [PATCH 26/27] feat: Add EXPORT feature flag --- src/main/java/net/sf/jsqlparser/parser/feature/Feature.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java b/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java index 45c51eb9e..7f4cf2af0 100644 --- a/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java +++ b/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java @@ -804,6 +804,11 @@ public enum Feature { * "IMPORT" */ imprt, + + /** + * "EXPORT" + */ + export, ; private final Object value; From 82e2f787b40ade72c0a51e3dc1dda69ad33ee6de Mon Sep 17 00:00:00 2001 From: Stefan Steinhauser Date: Tue, 10 Jun 2025 11:20:15 +0200 Subject: [PATCH 27/27] feat: Implement EXASOL dialect feature flag --- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 6 +-- .../statement/export/ExportTest.java | 43 +++++++++++------ .../statement/imprt/ImportTest.java | 46 +++++++++++++------ .../statement/select/SelectTest.java | 4 +- 4 files changed, 65 insertions(+), 34 deletions(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index c7368cc43..a3f148379 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1014,9 +1014,7 @@ Statement SingleStatement() : | stm = SessionStatement() | - stm = Import() - | - stm = Export() + LOOKAHEAD({ Dialect.EXASOL.name().equals(getAsString(Feature.dialect)) }) ( stm = Import() | stm = Export() ) ) { return stm; } } @@ -4663,7 +4661,7 @@ FromItem FromItem() #FromItem: | fromItem=LateralSubSelect() | - LOOKAHEAD(2) fromItem=SubImport() { fromItem = new ParenthesedFromItem(fromItem); } + LOOKAHEAD(2, { Dialect.EXASOL.name().equals(getAsString(Feature.dialect)) }) fromItem=SubImport() { fromItem = new ParenthesedFromItem(fromItem); } | LOOKAHEAD({ getAsBoolean(Feature.allowUnparenthesizedSubSelects) }) fromItem=Select() ) diff --git a/src/test/java/net/sf/jsqlparser/statement/export/ExportTest.java b/src/test/java/net/sf/jsqlparser/statement/export/ExportTest.java index 3b53a845d..1d158b975 100644 --- a/src/test/java/net/sf/jsqlparser/statement/export/ExportTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/export/ExportTest.java @@ -10,6 +10,7 @@ package net.sf.jsqlparser.statement.export; import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.parser.AbstractJSqlParser.Dialect; import net.sf.jsqlparser.test.TestUtils; import org.junit.jupiter.api.parallel.Execution; import org.junit.jupiter.api.parallel.ExecutionMode; @@ -27,7 +28,8 @@ public class ExportTest { "EXPORT ( select 1 ) INTO LOCAL CSV FILE 'file.csv'", }) public void testExport(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -39,7 +41,8 @@ public void testExport(String sqlStr) throws JSQLParserException { "EXPORT schemaName.tableName INTO LOCAL SECURE CSV FILE 'file1.csv' FILE 'file2.csv'" }) public void testExportIntoFileCSV(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -57,7 +60,8 @@ public void testExportIntoFileCSV(String sqlStr) throws JSQLParserException { "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ( 1, 1 .. 2, 3 )" }) public void testExportIntoFileCSVCols(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -69,7 +73,8 @@ public void testExportIntoFileCSVCols(String sqlStr) throws JSQLParserException "EXPORT schemaName.tableName INTO LOCAL SECURE FBV FILE 'file1.fbv' FILE 'file2.fbv'" }) public void testExportIntoFileFBV(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -85,7 +90,8 @@ public void testExportIntoFileFBV(String sqlStr) throws JSQLParserException { "EXPORT schemaName.tableName INTO LOCAL FBV FILE 'file.fbv' ( SIZE = 1 PADDING = '0', FORMAT = 'format' )" }) public void testExportIntoFileFBVCols(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -107,7 +113,8 @@ public void testExportIntoFileFBVCols(String sqlStr) throws JSQLParserException "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ENCODING = 'UTF-8' REPLACE WITH COLUMN NAMES" }) public void testExportIntoFileFileOpts(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -120,7 +127,8 @@ public void testExportIntoFileFileOpts(String sqlStr) throws JSQLParserException "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' IGNORE CERTIFICATE PUBLIC KEY 'publicKey'" }) public void testExportIntoFileCertVerification(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -149,7 +157,8 @@ public void testExportIntoFileCertVerification(String sqlStr) throws JSQLParserE "EXPORT schemaName.tableName INTO CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'" }) public void testExportIntoConnectionDef(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -164,7 +173,8 @@ public void testExportIntoConnectionDef(String sqlStr) throws JSQLParserExceptio "EXPORT schemaName.tableName INTO CSV AT CLOUD AZURE BLOBSTORAGE '127.0.0.1' USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'" }) public void testExportIntoCloudConnectionDef(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -184,7 +194,8 @@ public void testExportIntoCloudConnectionDef(String sqlStr) throws JSQLParserExc "EXPORT schemaName.tableName INTO EXA AT connectionName STATEMENT 'insert into schemaName.tableName ( columnName ) values ( ? )'" }) public void testExportIntoDBMSEXA(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -196,7 +207,8 @@ public void testExportIntoDBMSEXA(String sqlStr) throws JSQLParserException { "EXPORT schemaName.tableName INTO ORA AT connectionName STATEMENT 'insert into schemaName.tableName ( columnName ) values ( ? )'" }) public void testExportIntoDBMSORA(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -205,7 +217,8 @@ public void testExportIntoDBMSORA(String sqlStr) throws JSQLParserException { "EXPORT schemaName.tableName INTO JDBC DRIVER = 'driverName' AT connectionName TABLE tableName" }) public void testExportIntoDBMSJDBC(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -217,7 +230,8 @@ public void testExportIntoDBMSJDBC(String sqlStr) throws JSQLParserException { "EXPORT schemaName.tableName INTO SCRIPT scriptName AT connectionName WITH propertyName = 'value' propertyName2 = 'value2'" }) public void testExportIntoScript(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -252,6 +266,7 @@ public void testExportIntoScript(String sqlStr) throws JSQLParserException { "EXPORT schemaName.tableName INTO LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT UNLIMITED ERRORS" }) public void testImportErrorClause(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } } diff --git a/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java b/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java index 2f6083041..1539d4375 100644 --- a/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/imprt/ImportTest.java @@ -10,6 +10,7 @@ package net.sf.jsqlparser.statement.imprt; import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.parser.AbstractJSqlParser.Dialect; import net.sf.jsqlparser.test.TestUtils; import org.junit.jupiter.api.parallel.Execution; import org.junit.jupiter.api.parallel.ExecutionMode; @@ -25,7 +26,8 @@ public class ImportTest { "IMPORT INTO schemaName.tableName ( columnName1, columnName2 ) FROM LOCAL CSV FILE 'file.csv'" }) public void testImportIntoTable(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -41,7 +43,8 @@ public void testImportIntoTable(String sqlStr) throws JSQLParserException { "IMPORT INTO ( LIKE schemaName.tableName ( columnName1 AS aliasName2, columnName2 AS aliasName2 ) ) FROM LOCAL CSV FILE 'file.csv'" }) public void testImportIntoImportColumns(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -53,7 +56,8 @@ public void testImportIntoImportColumns(String sqlStr) throws JSQLParserExceptio "IMPORT FROM LOCAL SECURE CSV FILE 'file1.csv' FILE 'file2.csv'" }) public void testImportFromFileCSV(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -67,7 +71,8 @@ public void testImportFromFileCSV(String sqlStr) throws JSQLParserException { "IMPORT FROM LOCAL CSV FILE 'file.csv' ( 1, 1 .. 2, 3 )" }) public void testImportFromFileCSVCols(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -79,7 +84,8 @@ public void testImportFromFileCSVCols(String sqlStr) throws JSQLParserException "IMPORT FROM LOCAL SECURE FBV FILE 'file1.fbv' FILE 'file2.fbv'" }) public void testImportFromFileFBV(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -96,7 +102,8 @@ public void testImportFromFileFBV(String sqlStr) throws JSQLParserException { "IMPORT FROM LOCAL FBV FILE 'file.fbv' ( SIZE = 1 START = 1, FORMAT = 'format' )" }) public void testImportFromFileFBVCols(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -116,7 +123,8 @@ public void testImportFromFileFBVCols(String sqlStr) throws JSQLParserException "IMPORT FROM LOCAL CSV FILE 'file.csv' ENCODING = 'UTF-8' SKIP = 1 TRIM" }) public void testImportFromFileFileOpts(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -129,7 +137,8 @@ public void testImportFromFileFileOpts(String sqlStr) throws JSQLParserException "IMPORT FROM LOCAL CSV FILE 'file.csv' IGNORE CERTIFICATE PUBLIC KEY 'publicKey'" }) public void testImportFromFileCertVerification(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -158,7 +167,8 @@ public void testImportFromFileCertVerification(String sqlStr) throws JSQLParserE "IMPORT FROM CSV AT '127.0.0.1' USER 'user' IDENTIFIED BY 'password' VERIFY CERTIFICATE PUBLIC KEY 'publicKey' FILE 'file.csv'" }) public void testImportFromConnectionDef(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -173,7 +183,8 @@ public void testImportFromConnectionDef(String sqlStr) throws JSQLParserExceptio "IMPORT FROM CSV AT CLOUD AZURE BLOBSTORAGE '127.0.0.1' USER 'user' IDENTIFIED BY 'password' FILE 'file.csv'" }) public void testImportFromCloudConnectionDef(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -186,7 +197,8 @@ public void testImportFromCloudConnectionDef(String sqlStr) throws JSQLParserExc "IMPORT FROM EXA AT connectionName STATEMENT 'select 1' STATEMENT 'select 2'" }) public void testImportFromDBMSEXA(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -199,7 +211,8 @@ public void testImportFromDBMSEXA(String sqlStr) throws JSQLParserException { "IMPORT FROM ORA AT connectionName STATEMENT 'select 1' STATEMENT 'select 2'" }) public void testImportFromDBMSORA(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -213,7 +226,8 @@ public void testImportFromDBMSORA(String sqlStr) throws JSQLParserException { "IMPORT FROM JDBC DRIVER = 'driverName' AT connectionName STATEMENT 'select 1' STATEMENT 'select 2'" }) public void testImportFromDBMSJDBC(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -225,7 +239,8 @@ public void testImportFromDBMSJDBC(String sqlStr) throws JSQLParserException { "IMPORT FROM SCRIPT scriptName AT connectionName WITH propertyName = 'value' propertyName2 = 'value2'" }) public void testImportFromScript(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } @ParameterizedTest @@ -260,6 +275,7 @@ public void testImportFromScript(String sqlStr) throws JSQLParserException { "IMPORT FROM LOCAL CSV FILE 'file.csv' ERRORS INTO schemaName.tableName REJECT LIMIT UNLIMITED ERRORS" }) public void testImportErrorClause(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } } diff --git a/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java b/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java index 4de88b578..1ba1bb4a7 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java @@ -58,6 +58,7 @@ import net.sf.jsqlparser.expression.operators.relational.GreaterThan; import net.sf.jsqlparser.expression.operators.relational.InExpression; import net.sf.jsqlparser.expression.operators.relational.LikeExpression; +import net.sf.jsqlparser.parser.AbstractJSqlParser.Dialect; import net.sf.jsqlparser.parser.CCJSqlParserManager; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.schema.Column; @@ -6402,7 +6403,8 @@ void testQuotedStringValueIssue2258() throws JSQLParserException { "SELECT * FROM schemaName.tableName JOIN ( IMPORT FROM EXA AT connectionName STATEMENT 'select 1' ) USING ( columnName )" }) public void testSelectWithSubImport(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withDialect(Dialect.EXASOL)); } }