I am trying to upgrade sqlalchemy-exasol from 1.2.19 to 1.3.6.
With the new release, a number of new test cases have been added to the test suite. A quite large number of them fails, as during test setup a table is trying to be created that already exists. This happens before the test is run (I tried to stop in the debugger with the --trace option of py.test but the issue occurs earlier).
Most of the offending tests live in ComponentReflectionTest. Here is an SQL trace of test_varchar_reflection:
INFO sqlalchemy.engine.base.Engine:base.py:1305 SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1 FROM DUAL
INFO sqlalchemy.engine.base.Engine:base.py:1306 ()
INFO sqlalchemy.engine.base.Engine:base.py:1305 SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1 FROM DUAL
INFO sqlalchemy.engine.base.Engine:base.py:1306 ()
INFO sqlalchemy.engine.base.Engine:base.py:1209 SELECT table_name from SYS.EXA_ALL_TABLES WHERE table_name = ? AND table_schema = ?
INFO sqlalchemy.engine.base.Engine:base.py:1211 ('USERS', 'TEST_SCHEMA')
INFO sqlalchemy.engine.base.Engine:base.py:1209 SELECT table_name from SYS.EXA_ALL_TABLES WHERE table_name = ? AND table_schema = ?
INFO sqlalchemy.engine.base.Engine:base.py:1211 ('DINGALINGS', 'TEST_SCHEMA')
INFO sqlalchemy.engine.base.Engine:base.py:1209 SELECT table_name from SYS.EXA_ALL_TABLES WHERE table_name = ? AND table_schema = ?
INFO sqlalchemy.engine.base.Engine:base.py:1211 ('EMAIL_ADDRESSES', 'TEST_SCHEMA')
INFO sqlalchemy.engine.base.Engine:base.py:1209 SELECT table_name from SYS.EXA_ALL_TABLES WHERE table_name = ? AND table_schema = ?
INFO sqlalchemy.engine.base.Engine:base.py:1211 ('COMMENT_TEST', 'TEST_SCHEMA')
INFO sqlalchemy.engine.base.Engine:base.py:1209 SELECT table_name from SYS.EXA_ALL_TABLES WHERE table_name = ? AND table_schema = ?
INFO sqlalchemy.engine.base.Engine:base.py:1211 ('USERS', 'TEST_SCHEMA')
INFO sqlalchemy.engine.base.Engine:base.py:1209 SELECT table_name from SYS.EXA_ALL_TABLES WHERE table_name = ? AND table_schema = ?
INFO sqlalchemy.engine.base.Engine:base.py:1211 ('DINGALINGS', 'TEST_SCHEMA')
INFO sqlalchemy.engine.base.Engine:base.py:1209 SELECT table_name from SYS.EXA_ALL_TABLES WHERE table_name = ? AND table_schema = ?
INFO sqlalchemy.engine.base.Engine:base.py:1211 ('EMAIL_ADDRESSES', 'TEST_SCHEMA')
INFO sqlalchemy.engine.base.Engine:base.py:1209 SELECT table_name from SYS.EXA_ALL_TABLES WHERE table_name = ? AND table_schema = ?
INFO sqlalchemy.engine.base.Engine:base.py:1211 ('COMMENT_TEST', 'TEST_SCHEMA')
INFO sqlalchemy.engine.base.Engine:base.py:1209
user_id INTEGER IDENTITY NOT NULL,
INFO sqlalchemy.engine.base.Engine:base.py:1211 ()
INFO sqlalchemy.engine.base.Engine:base.py:759 COMMIT
INFO sqlalchemy.engine.base.Engine:base.py:1209 ALTER TABLE users ADD CONSTRAINT user_id_fk FOREIGN KEY(parent_user_id) REFERENCES users (user_id)
INFO sqlalchemy.engine.base.Engine:base.py:1211 ()
INFO sqlalchemy.engine.base.Engine:base.py:759 COMMIT
INFO sqlalchemy.engine.base.Engine:base.py:1209
CREATE TABLE comment_test (
id INTEGER IDENTITY NOT NULL,
INFO sqlalchemy.engine.base.Engine:base.py:1211 ()
INFO sqlalchemy.engine.base.Engine:base.py:759 COMMIT
INFO sqlalchemy.engine.base.Engine:base.py:1209
CREATE TABLE test_schema.users (
user_id INTEGER IDENTITY NOT NULL,
INFO sqlalchemy.engine.base.Engine:base.py:1211 ()
INFO sqlalchemy.engine.base.Engine:base.py:737 ROLLBACK
What I noticed is, that the first create for table USERS happens without schema name, the second with. In Exasol the default schema during tests is 'test_schema', so the second create conflicts and leads to this error:
sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42500', '[42500] [EXASOL][EXASolution driver]object USERS already exists (Session: 1641408017719985021) (-1) (SQLExecDirectW)')
[SQL:
CREATE TABLE test_schema.users (
user_id INTEGER IDENTITY NOT NULL,
test1 CHAR(5) NOT NULL,
test2 FLOAT NOT NULL,
parent_user_id INTEGER,
PRIMARY KEY (user_id)
)
I am a bit stuck as there seems to be quite some magic at work how tests are setup and prepared. Any help on where to look closer is greatly appreciated.