From: Federico Caselli Date: Tue, 1 Dec 2020 22:47:13 +0000 (+0100) Subject: Properly render ``cycle=False`` and ``order=False`` X-Git-Tag: rel_1_4_0b2~123^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=302e18eb75f29e651e67b18033487e40758d7c83;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Properly render ``cycle=False`` and ``order=False`` These get rendered as ``NO CYCLE`` and ``NO ORDER`` in :class:`_sql.Sequence` and :class:`_sql.Identity` objects. Fixes: #5738 Change-Id: Ia9ccb5481a104cb32d3b517e99efd5e730c84946 --- diff --git a/doc/build/changelog/unreleased_14/5738.rst b/doc/build/changelog/unreleased_14/5738.rst new file mode 100644 index 0000000000..653a6218b6 --- /dev/null +++ b/doc/build/changelog/unreleased_14/5738.rst @@ -0,0 +1,8 @@ +.. change:: + :tags: bug, sql + :tickets: 5722 + :versions: 1.4.0b2 + + Properly render ``cycle=False`` and ``order=False`` as ``NO CYCLE`` and + ``NO ORDER`` in :class:`_sql.Sequence` and :class:`_sql.Identity` + objects. \ No newline at end of file diff --git a/lib/sqlalchemy/dialects/oracle/base.py b/lib/sqlalchemy/dialects/oracle/base.py index c0f7aa5ce0..223c1db98d 100644 --- a/lib/sqlalchemy/dialects/oracle/base.py +++ b/lib/sqlalchemy/dialects/oracle/base.py @@ -1329,9 +1329,11 @@ class OracleDDLCompiler(compiler.DDLCompiler): text = super(OracleDDLCompiler, self).get_identity_options( identity_options ) - return text.replace("NO MINVALUE", "NOMINVALUE").replace( - "NO MAXVALUE", "NOMAXVALUE" - ) + text = text.replace("NO MINVALUE", "NOMINVALUE") + text = text.replace("NO MAXVALUE", "NOMAXVALUE") + text = text.replace("NO CYCLE", "NOCYCLE") + text = text.replace("NO ORDER", "NOORDER") + return text def visit_computed_column(self, generated): text = "GENERATED ALWAYS AS (%s)" % self.sql_compiler.process( diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index 9b90bf8684..d53fe01c2e 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -4050,10 +4050,10 @@ class DDLCompiler(Compiled): text.append("NO MAXVALUE") if identity_options.cache is not None: text.append("CACHE %d" % identity_options.cache) - if identity_options.order is True: - text.append("ORDER") + if identity_options.order is not None: + text.append("ORDER" if identity_options.order else "NO ORDER") if identity_options.cycle is not None: - text.append("CYCLE") + text.append("CYCLE" if identity_options.cycle else "NO CYCLE") return " ".join(text) def visit_create_sequence(self, create, prefix=None, **kw): diff --git a/test/dialect/oracle/test_compiler.py b/test/dialect/oracle/test_compiler.py index 20c579f64e..1b8b3fb89b 100644 --- a/test/dialect/oracle/test_compiler.py +++ b/test/dialect/oracle/test_compiler.py @@ -1286,13 +1286,16 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL): increment=7, nominvalue=True, nomaxvalue=True, + cycle=False, + order=False, ), ), ) self.assert_compile( schema.CreateTable(t), "CREATE TABLE t (y INTEGER GENERATED ALWAYS AS IDENTITY " - "(INCREMENT BY 7 START WITH 4 NOMINVALUE NOMAXVALUE))", + "(INCREMENT BY 7 START WITH 4 NOMINVALUE NOMAXVALUE " + "NOORDER NOCYCLE))", ) def test_column_identity_no_generated(self): diff --git a/test/sql/test_identity_column.py b/test/sql/test_identity_column.py index f99054d629..3ac97db92f 100644 --- a/test/sql/test_identity_column.py +++ b/test/sql/test_identity_column.py @@ -55,16 +55,21 @@ class _IdentityDDLFixture(testing.AssertsCompiledSQL): dict(always=False, cache=1000, order=True), "BY DEFAULT AS IDENTITY (CACHE 1000 ORDER)", ), - (dict(order=True), "BY DEFAULT AS IDENTITY (ORDER)"), + (dict(order=True, cycle=True), "BY DEFAULT AS IDENTITY (ORDER CYCLE)"), + ( + dict(order=False, cycle=False), + "BY DEFAULT AS IDENTITY (NO ORDER NO CYCLE)", + ), ) def test_create_ddl(self, identity_args, text): if getattr(self, "__dialect__", None) != "default" and testing.against( "oracle" ): - text = text.replace("NO MINVALUE", "NOMINVALUE").replace( - "NO MAXVALUE", "NOMAXVALUE" - ) + text = text.replace("NO MINVALUE", "NOMINVALUE") + text = text.replace("NO MAXVALUE", "NOMAXVALUE") + text = text.replace("NO CYCLE", "NOCYCLE") + text = text.replace("NO ORDER", "NOORDER") t = Table( "foo_table",