From 503b986f112059bcbfac854d1820f8a077a0ab58 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 10 May 2013 12:49:51 +0200 Subject: [PATCH] [#2355] Add support for Postgres / HSQLDB's TRUNCATE [...] RESTART / CONTINUE IDENTITY --- .../jooq/test/_/testcases/TruncateTests.java | 55 +++++++++++++++++++ .../src/org/jooq/test/jOOQAbstractTest.java | 5 ++ .../java/org/jooq/TruncateIdentityStep.java | 16 ++++++ .../main/java/org/jooq/impl/TruncateImpl.java | 21 ++++++- 4 files changed, 96 insertions(+), 1 deletion(-) diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/TruncateTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/TruncateTests.java index 74a2642965..1d45856be9 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/TruncateTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/TruncateTests.java @@ -45,6 +45,7 @@ import static org.jooq.SQLDialect.SQLITE; import java.sql.Date; import java.util.Arrays; +import org.jooq.InsertResultStep; import org.jooq.Record1; import org.jooq.Record2; import org.jooq.Record3; @@ -105,7 +106,19 @@ extends BaseTest insert = + create().insertInto(TIdentity(), TIdentity_VAL()) + .values(1) + .returning(TIdentity_ID()); + int id1 = insert.fetchOne().getValue(TIdentity_ID()); + + + create().truncate(TIdentity()) + .continueIdentity() + .execute(); + int id2 = insert.fetchOne().getValue(TIdentity_ID()); + assertEquals(id1 + 1, id2); + + + create().truncate(TIdentity()) + .restartIdentity() + .execute(); + int id3 = insert.fetchOne().getValue(TIdentity_ID()); + assertEquals(1, id3); + } } diff --git a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java index 1f92b93b4a..991abb9b47 100644 --- a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java +++ b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java @@ -1035,6 +1035,11 @@ public abstract class jOOQAbstractTest< new TruncateTests(this).testTruncateCascade(); } + @Test + public void testTruncateRestartIdentity() throws Exception { + new TruncateTests(this).testTruncateRestartIdentity(); + } + @Test public void testMetaModel() throws Exception { new MetaDataTests(this).testMetaModel(); diff --git a/jOOQ/src/main/java/org/jooq/TruncateIdentityStep.java b/jOOQ/src/main/java/org/jooq/TruncateIdentityStep.java index e00fac3cc1..cf86dfc0d2 100644 --- a/jOOQ/src/main/java/org/jooq/TruncateIdentityStep.java +++ b/jOOQ/src/main/java/org/jooq/TruncateIdentityStep.java @@ -35,6 +35,9 @@ */ package org.jooq; +import static org.jooq.SQLDialect.HSQLDB; +import static org.jooq.SQLDialect.POSTGRES; + /** * A {@link Query} that can truncate a table in the database. * @@ -42,4 +45,17 @@ package org.jooq; */ public interface TruncateIdentityStep extends TruncateCascadeStep { + /** + * Add the RESTART IDENTITY clause to the TRUNCATE + * statement. + */ + @Support({ HSQLDB, POSTGRES }) + TruncateCascadeStep restartIdentity(); + + /** + * Add the CONTINUE IDENTITY clause to the + * TRUNCATE statement. + */ + @Support({ HSQLDB, POSTGRES }) + TruncateCascadeStep continueIdentity(); } diff --git a/jOOQ/src/main/java/org/jooq/impl/TruncateImpl.java b/jOOQ/src/main/java/org/jooq/impl/TruncateImpl.java index 9b74fc10bb..d78984eba8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TruncateImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TruncateImpl.java @@ -41,6 +41,7 @@ import org.jooq.Record; import org.jooq.RenderContext; import org.jooq.SQLDialect; import org.jooq.Table; +import org.jooq.TruncateCascadeStep; import org.jooq.TruncateFinalStep; import org.jooq.TruncateIdentityStep; @@ -59,6 +60,7 @@ class TruncateImpl extends AbstractQuery implements private final Table table; private Boolean cascade; + private Boolean restartIdentity; public TruncateImpl(Configuration configuration, Table table) { super(configuration); @@ -78,6 +80,18 @@ class TruncateImpl extends AbstractQuery implements return this; } + @Override + public final TruncateCascadeStep restartIdentity() { + restartIdentity = true; + return this; + } + + @Override + public final TruncateCascadeStep continueIdentity() { + restartIdentity = false; + return this; + } + @Override public final void toSQL(RenderContext context) { switch (context.configuration().dialect()) { @@ -103,8 +117,13 @@ class TruncateImpl extends AbstractQuery implements } } + if (restartIdentity != null) { + context.formatSeparator() + .keyword(restartIdentity ? "restart identity" : "continue identity"); + } + if (cascade != null) { - context.sql(" ") + context.formatSeparator() .keyword(cascade ? "cascade" : "restrict"); } }