@@ -166,6 +166,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
166166| <K_ALIGN:"ALIGN">
167167| <K_ALL:"ALL">
168168| <K_ALTER:"ALTER">
169+ | <K_ALWAYS:"ALWAYS">
169170| <K_ANALYZE:"ANALYZE">
170171| <K_AND:"AND">
171172| <K_ANY:"ANY">
@@ -188,6 +189,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
188189| <K_BIT:"BIT">
189190| <K_BLOBSTORAGE:"BLOBSTORAGE">
190191| <K_BLOCK: "BLOCK">
192+ | <K_BOOLEAN:"BOOLEAN">
191193| <K_BOTH:"BOTH">
192194| <K_BROWSE:"BROWSE">
193195| <K_BY:"BY">
@@ -225,6 +227,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
225227| <K_COSTS: "COSTS">
226228| <K_COUNT: "COUNT">
227229| <K_CREATE:"CREATE">
230+ | <K_CREATED:"CREATED">
228231| <K_CROSS:"CROSS">
229232| <K_CSV:"CSV">
230233| <K_CURRENT: "CURRENT">
@@ -240,6 +243,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
240243| <K_DEFERRABLE : "DEFERRABLE">
241244| <K_DELAYED : "DELAYED">
242245| <K_DELETE:"DELETE">
246+ | <K_DELIMIT : "DELIMIT">
243247| <K_DELIMITER : "DELIMITER">
244248| <K_DESC:"DESC">
245249| <K_DESCRIBE:"DESCRIBE">
@@ -279,6 +283,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
279283| <K_EXTEND:"EXTEND">
280284| <K_EXTENDED:"EXTENDED">
281285| <K_EXTRACT:"EXTRACT">
286+ | <K_EXPORT:"EXPORT">
282287| <K_FBV:"FBV">
283288| <K_FETCH:"FETCH">
284289| <K_ISOLATION:("UR" | "RS" | "RR" | "CS")>
@@ -380,7 +385,9 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
380385| <K_MINVALUE:"MINVALUE">
381386| <K_MODIFY: "MODIFY">
382387| <K_MOVEMENT: "MOVEMENT">
388+ | <K_NAMES:"NAMES">
383389| <K_NATURAL:"NATURAL">
390+ | <K_NEVER:"NEVER">
384391| <K_NEXT:"NEXT">
385392| <K_NEXTVAL: ( (("NEXTVAL")((" ")+("FOR"))?) | ( ("NEXT")(" ")+("VALUE") (" ")+("FOR") ) )>
386393| <K_NO:"NO">
@@ -874,6 +881,8 @@ Statement SingleStatement() :
874881 stm = PurgeStatement()
875882 |
876883 stm = Import()
884+ |
885+ stm = Export()
877886 )
878887 { return stm; }
879888}
@@ -1091,6 +1100,28 @@ LikeClause LikeClause(): {
10911100 }
10921101}
10931102
1103+ Export Export() #Export: {
1104+ Export export = new Export();
1105+ Table table;
1106+ ParenthesedExpressionList<Column> columns;
1107+ ParenthesedSelect select;
1108+ ExportIntoItem exportIntoItem;
1109+ } {
1110+ <K_EXPORT>
1111+ (
1112+ table = Table() { export.setTable(table); }
1113+ [ columns = ParenthesedColumnList() { impt.setColumns(columns); } ]
1114+ | select = ParenthesedSelect() { export.setSelect(select); }
1115+ )
1116+
1117+ <K_INTO>
1118+ exportIntoItem = ExportIntoItem() { export.setExportIntoItem(exportIntoItem); }
1119+
1120+ {
1121+ return export;
1122+ }
1123+ }
1124+
10941125Import Import() #Import: {
10951126 Import impt = new Import();
10961127 Table table;
@@ -1160,6 +1191,22 @@ List<ImportColumn> ImportColumns(): {
11601191 }
11611192}
11621193
1194+ ExportIntoItem ExportIntoItem(): {
1195+ ExportIntoItem exportIntoItem;
1196+ ErrorClause errorClause;
1197+ } {
1198+ (
1199+ exportIntoItem = DBMSDestination()
1200+ | exportIntoItem = FileDestination()
1201+ | exportIntoItem = ScriptSourceDestination()
1202+ )
1203+ [ LOOKAHEAD(2) errorClause = ErrorClause() { exportIntoItem.setErrorClause(errorClause); } ]
1204+
1205+ {
1206+ return exportIntoItem;
1207+ }
1208+ }
1209+
11631210ImportFromItem ImportFromItem(): {
11641211 ImportFromItem importFromItem;
11651212 ErrorClause errorClause;
@@ -1176,6 +1223,62 @@ ImportFromItem ImportFromItem(): {
11761223 }
11771224}
11781225
1226+ DBMSDestination DBMSDestination() #DBMSDestination: {
1227+ DBMSDestination dbmsDestination = new DBMSDestination();
1228+ DBMSType dbmsType;
1229+ ConnectionDefinition connectionDefinition;
1230+ Table table;
1231+ ExpressionList<Column> columns;
1232+ StringValue statement;
1233+ List<DBMSTableDestinationOption> dbmsTableDestinationOptions;
1234+ } {
1235+ dbmsType = DBMSType() { dbmsDestination.setSourceType(dbmsType); }
1236+
1237+ connectionDefinition = ConnectionDefinition() { dbmsDestination.setConnectionDefinition(connectionDefinition); }
1238+
1239+ (
1240+ LOOKAHEAD(3)
1241+ <K_TABLE> table = Table() { dbmsDestination.setTable(table); }
1242+ [ LOOKAHEAD(2) columns = ParenthesedColumnList() { dbmsDestination.setColumns(columns); } ]
1243+ [ LOOKAHEAD(2) dbmsTableDestinationOptions = DBMSTableDestinationOptionList() { dbmsDestination.setDBMSTableDestinationOptionList(dbmsTableDestinationOptions); } ]
1244+ | statement = ImportExportStatement() { dbmsDestination.setStatement(statement); }
1245+ )
1246+
1247+ {
1248+ return dbmsDestination;
1249+ }
1250+ }
1251+
1252+ DBMSTableDestinationOption DBMSTableDestinationOption(): {
1253+ DBMSTableDestinationOption dbmsTableDestinationOption;
1254+
1255+ Token token;
1256+ Token token2;
1257+ Token token3;
1258+ } {
1259+ (
1260+ (
1261+ token = <K_REPLACE>
1262+ | token = <K_TRUNCATE>
1263+ ) { dbmsTableDestinationOption = new DBMSTableDestinationOption(token.image); }
1264+ | token = <K_CREATED> token2 = <K_BY> token3 = <S_CHAR_LITERAL> { dbmsTableDestinationOption = new DBMSTableDestinationOption(token.image + " " + token2.image, new StringValue(token3.image)); }
1265+ )
1266+
1267+ {
1268+ return dbmsTableDestinationOption;
1269+ }
1270+ }
1271+
1272+ List<DBMSTableDestinationOption> DBMSTableDestinationOptionList(): {
1273+ List<DBMSTableDestinationOption> dbmsTableDestinationOptions = new ArrayList<DBMSTableDestinationOption>();
1274+ DBMSTableDestinationOption dbmsTableDestinationOption;
1275+ } {
1276+ ( LOOKAHEAD(2) dbmsTableDestinationOption = DBMSTableDestinationOption() { dbmsTableDestinationOptions.add(dbmsTableDestinationOption); } )+
1277+ {
1278+ return dbmsTableDestinationOptions;
1279+ }
1280+ }
1281+
11791282DBMSSource DBMSSource() #DBMSSource: {
11801283 DBMSSource dbmsSource = new DBMSSource();
11811284 DBMSType dbmsType;
@@ -1192,7 +1295,7 @@ DBMSSource DBMSSource() #DBMSSource: {
11921295 (
11931296 <K_TABLE> table = Table() { dbmsSource.setTable(table); }
11941297 [ LOOKAHEAD(2) columns = ParenthesedColumnList() { dbmsSource.setColumns(columns); } ]
1195- | statements = StatementsList () { dbmsSource.setStatements(statements); }
1298+ | statements = ImportExportStatementsList () { dbmsSource.setStatements(statements); }
11961299 )
11971300 {
11981301 return dbmsSource;
@@ -1237,7 +1340,7 @@ StringValue ImportExportStatement() #ImportExportStatement: {
12371340 }
12381341}
12391342
1240- List<StringValue> StatementsList (): {
1343+ List<StringValue> ImportExportStatementsList (): {
12411344 List<StringValue> statements = new ArrayList<StringValue>();
12421345 StringValue statement;
12431346} {
@@ -1290,6 +1393,44 @@ List<ConnectionFileDefinition> ConnectionFileDefinitionList(): {
12901393 }
12911394}
12921395
1396+ CSVColumn CSVDestinationColumn(): {
1397+ CSVColumn csvColumn;
1398+
1399+ Token token;
1400+ Token token2;
1401+ } {
1402+ (
1403+ LOOKAHEAD(2)
1404+ token=<S_LONG> ".." token2=<S_LONG> { csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); }
1405+ | token=<S_LONG> { csvColumn = new CSVColumn(Long.valueOf(token.image)); }
1406+ [ <K_FORMAT> "=" token = <S_CHAR_LITERAL> { csvColumn.setFormat(new StringValue(token.image)); }]
1407+ [
1408+ <K_DELIMIT>
1409+ "="
1410+ (
1411+ token=<K_ALWAYS>
1412+ | token=<K_NEVER>
1413+ | token=<K_AUTO>
1414+ )
1415+ { csvColumn.setDelimit(token.image); }
1416+ ]
1417+ )
1418+ {
1419+ return csvColumn;
1420+ }
1421+ }
1422+
1423+ List<CSVColumn> CSVDestinationColumnList(): {
1424+ List<CSVColumn> csvColumns = new ArrayList<CSVColumn>();
1425+ CSVColumn csvColumn;
1426+ } {
1427+ csvColumn = CSVDestinationColumn() { csvColumns.add(csvColumn); }
1428+ ( "," csvColumn = CSVDestinationColumn() { csvColumns.add(csvColumn); } )*
1429+ {
1430+ return csvColumns;
1431+ }
1432+ }
1433+
12931434CSVColumn CSVSourceColumn(): {
12941435 CSVColumn csvColumn;
12951436
@@ -1318,6 +1459,38 @@ List<CSVColumn> CSVSourceColumnList(): {
13181459 }
13191460}
13201461
1462+ FBVColumn FBVDestinationColumn(): {
1463+ FBVColumn fbvColumn;
1464+
1465+ Token token;
1466+ Token token2;
1467+ } {
1468+ (
1469+ token=<K_SIZE> "=" token2=<S_LONG> { fbvColumn = new FBVColumn(token.image, new LongValue(token2.image)); }
1470+ | ( token=<K_FORMAT> | token=<K_PADDING> ) "=" token2=<S_CHAR_LITERAL> { fbvColumn = new FBVColumn(token.image, new StringValue(token2.image)); }
1471+ | token=<K_ALIGN> "=" ( token2=<K_LEFT> | token2=<K_RIGHT> ) { fbvColumn = new FBVColumn(token.image, token2.image); }
1472+ )
1473+ {
1474+ return fbvColumn;
1475+ }
1476+ }
1477+
1478+ List<FBVColumn> FBVDestinationColumnList(): {
1479+ List<FBVColumn> fbvColumns = new ArrayList<FBVColumn>();
1480+ FBVColumn fbvColumn;
1481+ boolean precedesComma;
1482+ } {
1483+ fbvColumn = FBVDestinationColumn() { fbvColumns.add(fbvColumn); }
1484+ (
1485+ { precedesComma = false; }
1486+ ["," { precedesComma = true; }]
1487+ fbvColumn = FBVDestinationColumn() { fbvColumn.setPrecedesComma(precedesComma); fbvColumns.add(fbvColumn); }
1488+ )*
1489+ {
1490+ return fbvColumns;
1491+ }
1492+ }
1493+
13211494FBVColumn FBVSourceColumn(): {
13221495 FBVColumn fbvColumn;
13231496
@@ -1350,6 +1523,39 @@ List<FBVColumn> FBVSourceColumnList(): {
13501523 }
13511524}
13521525
1526+ FileOption FileDestinationOption(): {
1527+ FileOption fileOption;
1528+
1529+ Token token;
1530+ Token token2;
1531+ Token token3;
1532+ } {
1533+ (
1534+ ( token=<K_REPLACE> | token=<K_TRUNCATE> ) { fileOption = new FileOption(token.image); }
1535+ | token=<K_WITH> token2=<K_COLUMN> token3=<K_NAMES> { fileOption = new FileOption(token.image + " " + token2.image + " " + token3.image); }
1536+ | ( token=<K_ENCODING> | token=<K_NULL> | token=<K_BOOLEAN> ) "=" token2=<S_CHAR_LITERAL> { fileOption = new FileOption(token.image, new StringValue(token2.image)); }
1537+ | (
1538+ token=<K_ROW> token2=<K_SEPARATOR> "=" token3=<S_CHAR_LITERAL>
1539+ | token=<K_COLUMN> ( token2=<K_SEPARATOR> | token2=<K_DELIMITER> ) "=" token3=<S_CHAR_LITERAL>
1540+ )
1541+ { fileOption = new FileOption(token.image + " " + token2.image, new StringValue(token3.image)); }
1542+ | token=<K_DELIMIT> "=" ( token2=<K_ALWAYS> | token2=<K_NEVER> | token2=<K_AUTO> ) { fileOption = new FileOption(token.image, token2.image); }
1543+ )
1544+ {
1545+ return fileOption;
1546+ }
1547+ }
1548+
1549+ List<FileOption> FileDestinationOptionList(): {
1550+ List<FileOption> fileOptions = new ArrayList<FileOption>();
1551+ FileOption fileOption;
1552+ } {
1553+ ( LOOKAHEAD(2) fileOption = FileDestinationOption() { fileOptions.add(fileOption); } )+
1554+ {
1555+ return fileOptions;
1556+ }
1557+ }
1558+
13531559FileOption FileSourceOption(): {
13541560 FileOption fileOption;
13551561
@@ -1387,6 +1593,50 @@ List<FileOption> FileSourceOptionList(): {
13871593 }
13881594}
13891595
1596+ FileDestination FileDestination() #FileDestination: {
1597+ FileDestination fileDestination = new FileDestination();
1598+ FileType fileType;
1599+ List<ConnectionFileDefinition> connectionFileDefinitions;
1600+ List<StringValue> files;
1601+ List<CSVColumn> csvColumns;
1602+ List<FBVColumn> fbvColumns;
1603+ List<FileOption> fileOptions;
1604+ CertificateVerification certificateVerification;
1605+ } {
1606+ (
1607+ fileType = FileType() { fileDestination.setDestinationType(fileType); }
1608+ connectionFileDefinitions = ConnectionFileDefinitionList() { fileDestination.setConnectionFileDefinitions(connectionFileDefinitions); }
1609+ | <K_LOCAL> { fileDestination.setLocal(true); }
1610+ [<K_SECURE> { fileDestination.setSecure(true); }]
1611+
1612+ fileType = FileType() { fileDestination.setDestinationType(fileType); }
1613+ files = FileList()
1614+ {
1615+ connectionFileDefinitions = new ArrayList<ConnectionFileDefinition>();
1616+ connectionFileDefinitions.add(new ConnectionFileDefinition(files));
1617+ }
1618+ )
1619+ { fileDestination.setConnectionFileDefinitions(connectionFileDefinitions); }
1620+
1621+ [
1622+ LOOKAHEAD(2)
1623+ "("
1624+ (
1625+ csvColumns = CSVDestinationColumnList() { fileDestination.setCSVColumns(csvColumns); }
1626+ | fbvColumns = FBVDestinationColumnList() { fileDestination.setFBVColumns(fbvColumns); }
1627+ )
1628+ ")"
1629+ ]
1630+
1631+ [ LOOKAHEAD(2) fileOptions = FileDestinationOptionList() { fileDestination.setFileOptions(fileOptions); } ]
1632+
1633+ [ LOOKAHEAD(2) certificateVerification = CertificateVerification() { fileDestination.setCertificateVerification(certificateVerification); } ]
1634+
1635+ {
1636+ return fileDestination;
1637+ }
1638+ }
1639+
13901640FileSource FileSource() #FileSource: {
13911641 FileSource fileSource = new FileSource();
13921642 FileType fileType;
@@ -1396,10 +1646,6 @@ FileSource FileSource() #FileSource: {
13961646 List<FBVColumn> fbvColumns;
13971647 List<FileOption> fileOptions;
13981648 CertificateVerification certificateVerification;
1399-
1400- Token token = null;
1401- Token token2 = null;
1402- Token token3 = null;
14031649} {
14041650 (
14051651 fileType = FileType() { fileSource.setSourceType(fileType); }
@@ -1614,7 +1860,7 @@ RejectClause RejectClause(): {
16141860 | <K_UNLIMITED>
16151861 )
16161862
1617- [ <K_ERRORS> { rejectClause.setErrors(true); } ]
1863+ [ LOOKAHEAD(2) <K_ERRORS> { rejectClause.setErrors(true); } ]
16181864
16191865 {
16201866 return rejectClause;
0 commit comments