From 6195a73b62ba76c8a4344f8f73b740c0b4a9c1bc Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 25 Sep 2024 15:13:26 +0200 Subject: [PATCH] [jOOQ/jOOQ#9574] Add org.jooq.Synonym This includes: - Add QOM API - Add CREATE SYNONYM support - Add DROP SYNONYM support - Add parser support --- jOOQ/src/main/java/org/jooq/DSLContext.java | 248 +++++++++++ jOOQ/src/main/java/org/jooq/impl/DSL.java | 417 ++++++++++++++++++ .../java/org/jooq/impl/DefaultDSLContext.java | 153 +++++++ .../src/main/java/org/jooq/impl/Keywords.java | 1 + .../main/java/org/jooq/impl/ParserImpl.java | 110 ++++- jOOQ/src/main/java/org/jooq/impl/QOM.java | 50 +++ 6 files changed, 976 insertions(+), 3 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/DSLContext.java b/jOOQ/src/main/java/org/jooq/DSLContext.java index aaeb707888..60792f7c3c 100644 --- a/jOOQ/src/main/java/org/jooq/DSLContext.java +++ b/jOOQ/src/main/java/org/jooq/DSLContext.java @@ -10878,6 +10878,130 @@ public interface DSLContext extends Scope { @Support({ DUCKDB, FIREBIRD, H2, HSQLDB, MARIADB, POSTGRES, YUGABYTEDB }) CreateSequenceAsStep createSequenceIfNotExists(Sequence sequence); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /** * The DROP DATABASE statement. * @@ -11236,6 +11360,130 @@ public interface DSLContext extends Scope { @Support({ CUBRID, DUCKDB, FIREBIRD, H2, HSQLDB, MARIADB, POSTGRES, YUGABYTEDB }) DropSequenceFinalStep dropSequenceIfExists(Sequence sequence); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /** * The DROP TABLE statement. * diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index b6a814c970..8ba3eb9443 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -392,6 +392,7 @@ import org.jooq.Spatial; import org.jooq.Statement; import org.jooq.Stringly; import org.jooq.Support; +// ... import org.jooq.Table; import org.jooq.TableLike; // ... @@ -9783,6 +9784,202 @@ public class DSL { return dsl().createSequenceIfNotExists(sequence); } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /** * The DROP DATABASE statement. *

@@ -10369,6 +10566,202 @@ public class DSL { return dsl().dropSequenceIfExists(sequence); } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /** * The DROP TABLE statement. *

@@ -13716,6 +14109,30 @@ public class DSL { ); } + + + + + + + + + + + + + + + + + + + + + + + + /** * Create a qualified type, given its type name. */ diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java index 5428dbab93..f67bf0e94a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java @@ -226,6 +226,7 @@ import org.jooq.Sequence; import org.jooq.Source; import org.jooq.Statement; import org.jooq.Stringly; +// ... import org.jooq.Table; import org.jooq.TableField; import org.jooq.TableLike; @@ -3758,6 +3759,82 @@ public class DefaultDSLContext extends AbstractScope implements DSLContext, Seri return new CreateSequenceImpl(configuration(), sequence, true); } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @Override public org.jooq.DropDatabaseFinalStep dropDatabase(@Stringly.Name String database) { return new DropDatabaseImpl(configuration(), DSL.catalog(DSL.name(database)), false); @@ -3964,6 +4041,82 @@ public class DefaultDSLContext extends AbstractScope implements DSLContext, Seri return new DropSequenceImpl(configuration(), sequence, true); } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @Override public org.jooq.DropTableStep dropTable(@Stringly.Name String table) { return new DropTableImpl(configuration(), false, DSL.table(DSL.name(table)), false); diff --git a/jOOQ/src/main/java/org/jooq/impl/Keywords.java b/jOOQ/src/main/java/org/jooq/impl/Keywords.java index 6d45d295b9..964da1c161 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Keywords.java +++ b/jOOQ/src/main/java/org/jooq/impl/Keywords.java @@ -415,6 +415,7 @@ final class Keywords { static final Keyword K_STORED = keyword("stored"); static final Keyword K_STORING = keyword("storing"); static final Keyword K_STRUCT = keyword("struct"); + static final Keyword K_SYNONYM = keyword("synonym"); static final Keyword K_SWITCH = keyword("switch"); static final Keyword K_SYMMETRIC = keyword("symmetric"); static final Keyword K_SYSTEM = keyword("system"); diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 124c92214a..1a89a963b6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -393,6 +393,7 @@ import static org.jooq.impl.DSL.stddevSamp; import static org.jooq.impl.DSL.sum; import static org.jooq.impl.DSL.sumDistinct; // ... +// ... import static org.jooq.impl.DSL.systemName; import static org.jooq.impl.DSL.table; import static org.jooq.impl.DSL.tan; @@ -595,6 +596,7 @@ import org.jooq.CreateIndexWhereStep; // ... import org.jooq.CreateSequenceAsStep; import org.jooq.CreateSequenceFlagsStep; +// ... import org.jooq.CreateTableAsStep; import org.jooq.CreateTableCommentStep; import org.jooq.CreateTableElementListStep; @@ -715,6 +717,7 @@ import org.jooq.Sequence; import org.jooq.SortField; import org.jooq.SortOrder; import org.jooq.Statement; +// ... import org.jooq.Table; import org.jooq.TableElement; import org.jooq.TableField; @@ -773,6 +776,8 @@ import org.jooq.types.Interval; import org.jooq.types.YearToMonth; import org.jooq.types.YearToSecond; +import org.jetbrains.annotations.NotNull; + /** * @author Lukas Eder */ @@ -2876,6 +2881,14 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { parseKeyword("CREATE"); switch (characterUpper()) { + case 'A': + if (parseProKeywordIf("ALIAS")) + + + + ; + break; + case 'C': if (parseKeywordIf("CACHED TABLE")) return parseCreateTable(false); @@ -2957,9 +2970,19 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { + ; + else if (parseProKeywordIf("PUBLIC SYNONYM", "PUBLIC ALIAS")) + + + + ; + else if (parseProKeywordIf("SYNONYM", "ALIAS")) + + + ; else - throw expected("FUNCTION", "PACKAGE", "PROCEDURE", "TRIGGER", "VIEW"); + throw expected("FUNCTION", "PACKAGE", "PROCEDURE", "PUBLIC SYNONYM", "SYNONYM", "TRIGGER", "VIEW"); } break; @@ -2971,6 +2994,11 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { + ; + else if (parseProKeywordIf("PUBLIC SYNONYM", "PUBLIC ALIAS")) + + + ; break; @@ -2988,8 +3016,11 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { return parseCreateSequence(); else if (parseKeywordIf("SPATIAL INDEX") && requireUnsupportedSyntax()) return parseCreateIndex(false); - else if (parseKeywordIf("SYNONYM")) - throw notImplemented("CREATE SYNONYM", "https://github.com/jOOQ/jOOQ/issues/9574"); + else if (parseProKeywordIf("SYNONYM")) + + + + ; break; @@ -3028,6 +3059,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { } throw expected( + "ALIAS", "FUNCTION", "GENERATOR", "GLOBAL TEMPORARY TABLE", @@ -3035,8 +3067,11 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { "OR ALTER", "OR REPLACE", "PROCEDURE", + "PUBLIC ALIAS", + "PUBLIC SYNONYM", "SCHEMA", "SEQUENCE", + "SYNONYM", "TABLE", "TEMPORARY TABLE", "TRIGGER", @@ -3139,6 +3174,14 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { parseKeyword("DROP"); switch (characterUpper()) { + case 'A': + if (parseProKeywordIf("ALIAS")) + + + + ; + break; + case 'D': if (parseKeywordIf("DATABASE")) return parseDropDatabase(); @@ -3191,6 +3234,11 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { + ; + else if (parseProKeywordIf("PUBLIC ALIAS", "PUBLIC SYNONYM")) + + + ; break; @@ -3210,6 +3258,11 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { DropSchemaStep::cascade, DropSchemaStep::restrict ); + else if (parseProKeywordIf("SYNONYM")) + + + + ; break; @@ -3264,12 +3317,16 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { } throw expected( + "ALIAS", "GENERATOR", "FUNCTION", "INDEX", "PROCEDURE", + "PUBLIC ALIAS", + "PUBLIC SYNONYM", "SCHEMA", "SEQUENCE", + "SYNONYM", "TABLE", "TEMPORARY TABLE", "TRIGGER", @@ -4427,6 +4484,25 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { return s; } + + + + + + + + + + + + + + + + + + + private final DDLQuery parseAlterSequence() { boolean ifExists = parseKeywordIf("IF EXISTS"); Sequence sequenceName = parseSequenceName(); @@ -4568,6 +4644,25 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { : dsl.dropSequence(sequenceName); } + + + + + + + + + + + + + + + + + + + private final DDLQuery parseCreateTable(boolean temporary) { boolean ifNotExists = parseKeywordIf("IF NOT EXISTS"); Table tableName = DSL.table(parseTableName().getQualifiedName()); @@ -13255,6 +13350,15 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { return sequence(parseName()); } + + + + + + + + + private final Name parseIndexName() { Name result = parseNameIf(); diff --git a/jOOQ/src/main/java/org/jooq/impl/QOM.java b/jOOQ/src/main/java/org/jooq/impl/QOM.java index 6478bedc33..a0aff71b41 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QOM.java +++ b/jOOQ/src/main/java/org/jooq/impl/QOM.java @@ -132,6 +132,7 @@ import org.jooq.Sequence; import org.jooq.SortField; import org.jooq.Spatial; import org.jooq.Statement; +// ... import org.jooq.Table; import org.jooq.TableElement; import org.jooq.TableLike; @@ -2307,6 +2308,32 @@ public final class QOM { @NotNull CreateSequence $noCache(boolean noCache); } + + + + + + + + + + + + + + + + + + + + + + + + + + /** * The DROP DATABASE statement. */ @@ -2444,6 +2471,29 @@ public final class QOM { @NotNull DropSequence $ifExists(boolean ifExists); } + + + + + + + + + + + + + + + + + + + + + + + /** * The DROP TABLE statement. */