summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/testing
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2021-04-13 10:52:00 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2021-04-14 12:51:58 -0400
commit94a1c523984e2082bb16d784cf8615061ba9d49a (patch)
tree73892187edabbfa4a371631c3407510cfdea9313 /lib/sqlalchemy/testing
parentde7f14104d5278987fa72d6866fa39569e56077e (diff)
downloadsqlalchemy-94a1c523984e2082bb16d784cf8615061ba9d49a.tar.gz
Support DEFAULT VALUES and VALUES(DEFAULT) individually
Fixed regression where the introduction of the INSERT syntax "INSERT... VALUES (DEFAULT)" was not supported on some backends that do however support "INSERT..DEFAULT VALUES", including SQLite. The two syntaxes are now each individually supported or non-supported for each dialect, for example MySQL supports "VALUES (DEFAULT)" but not "DEFAULT VALUES". Support for Oracle is still not enabled as there are unresolved issues in using RETURNING at the same time. Fixes: #6254 Change-Id: I47959bc826e3d9d2396ccfa290eb084841b02e77
Diffstat (limited to 'lib/sqlalchemy/testing')
-rw-r--r--lib/sqlalchemy/testing/assertions.py3
-rw-r--r--lib/sqlalchemy/testing/assertsql.py6
-rw-r--r--lib/sqlalchemy/testing/requirements.py10
-rw-r--r--lib/sqlalchemy/testing/suite/test_insert.py15
4 files changed, 31 insertions, 3 deletions
diff --git a/lib/sqlalchemy/testing/assertions.py b/lib/sqlalchemy/testing/assertions.py
index 02137474b..9ff2f76eb 100644
--- a/lib/sqlalchemy/testing/assertions.py
+++ b/lib/sqlalchemy/testing/assertions.py
@@ -400,6 +400,7 @@ class AssertsCompiledSQL(object):
use_default_dialect=False,
allow_dialect_select=False,
supports_default_values=True,
+ supports_default_metavalue=True,
literal_binds=False,
render_postcompile=False,
schema_translate_map=None,
@@ -410,6 +411,7 @@ class AssertsCompiledSQL(object):
if use_default_dialect:
dialect = default.DefaultDialect()
dialect.supports_default_values = supports_default_values
+ dialect.supports_default_metavalue = supports_default_metavalue
elif allow_dialect_select:
dialect = None
else:
@@ -421,6 +423,7 @@ class AssertsCompiledSQL(object):
elif dialect == "default":
dialect = default.DefaultDialect()
dialect.supports_default_values = supports_default_values
+ dialect.supports_default_metavalue = supports_default_metavalue
elif dialect == "default_enhanced":
dialect = default.StrCompileDialect()
elif isinstance(dialect, util.string_types):
diff --git a/lib/sqlalchemy/testing/assertsql.py b/lib/sqlalchemy/testing/assertsql.py
index 1bdd11585..98261a374 100644
--- a/lib/sqlalchemy/testing/assertsql.py
+++ b/lib/sqlalchemy/testing/assertsql.py
@@ -76,7 +76,11 @@ class CompiledSQL(SQLMatchRule):
def _compile_dialect(self, execute_observed):
if self.dialect == "default":
- return DefaultDialect()
+ dialect = DefaultDialect()
+ # this is currently what tests are expecting
+ # dialect.supports_default_values = True
+ dialect.supports_default_metavalue = True
+ return dialect
else:
# ugh
if self.dialect == "postgresql":
diff --git a/lib/sqlalchemy/testing/requirements.py b/lib/sqlalchemy/testing/requirements.py
index f82d5f065..8a70cc692 100644
--- a/lib/sqlalchemy/testing/requirements.py
+++ b/lib/sqlalchemy/testing/requirements.py
@@ -335,11 +335,19 @@ class SuiteRequirements(Requirements):
return exclusions.only_if(
lambda config: config.db.dialect.supports_empty_insert
- or config.db.dialect.supports_default_values,
+ or config.db.dialect.supports_default_values
+ or config.db.dialect.supports_default_metavalue,
"empty inserts not supported",
)
@property
+ def empty_inserts_executemany(self):
+ """target platform supports INSERT with no values, i.e.
+ INSERT DEFAULT VALUES or equivalent, within executemany()"""
+
+ return self.empty_inserts
+
+ @property
def insert_from_select(self):
"""target platform supports INSERT from a SELECT."""
diff --git a/lib/sqlalchemy/testing/suite/test_insert.py b/lib/sqlalchemy/testing/suite/test_insert.py
index 35f3315c7..3c033a774 100644
--- a/lib/sqlalchemy/testing/suite/test_insert.py
+++ b/lib/sqlalchemy/testing/suite/test_insert.py
@@ -167,8 +167,21 @@ class InsertBehaviorTest(fixtures.TablesTest):
self.tables.autoinc_pk.c.id != None
)
)
+ eq_(len(r.all()), 1)
- assert len(r.fetchall())
+ @requirements.empty_inserts_executemany
+ def test_empty_insert_multiple(self, connection):
+ r = connection.execute(self.tables.autoinc_pk.insert(), [{}, {}, {}])
+ assert r._soft_closed
+ assert not r.closed
+
+ r = connection.execute(
+ self.tables.autoinc_pk.select().where(
+ self.tables.autoinc_pk.c.id != None
+ )
+ )
+
+ eq_(len(r.all()), 3)
@requirements.insert_from_select
def test_insert_from_select_autoinc(self, connection):