pgloader
pgloader copied to clipboard
Mssql: IDENTITY columns not detected in tables outside the default schema.
I noticed this while migrating a mssql databse with many custom schemas to Postgres. The resulting columns in Postgres weren't SERIAL
.
-
[x] pgloader --version
3.6.9 (this docker image because the db is on Azure), but I think I already know the cause which is still an issue in latest master.
-
[ ] did you test a fresh compile from the source tree?
No (first try failed because I'm on ARM), but as mentioned above can reproduce by running the query that is in master.
-
[X] did you search for other similar issues?
-
[x] how can I reproduce the bug?
- Set up a mssql instance (e.g. using docker:
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Secret123" -p 1433:1433 --name repro-mssql -d mcr.microsoft.com/mssql/server:2019-latest
) - Run these queries:
CREATE SCHEMA pg_loader_test;
CREATE TABLE pg_loader_test.MyTable ( id INT IDENTITY(1,1) PRIMARY KEY );
- Run the (simplified) "read" query from https://github.com/dimitri/pgloader/blob/2079646c81f565b5e9edba627d14cbf63af2dbdd/src/sources/mssql/sql/list-all-columns.sql#L33
select c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME, c.DATA_TYPE, c.IS_NULLABLE, COLUMNPROPERTY(object_id(c.TABLE_NAME), c.COLUMN_NAME, 'IsIdentity') AS IsIdentity from INFORMATION_SCHEMA.COLUMNS c join INFORMATION_SCHEMA.TABLES t on c.TABLE_SCHEMA = t.TABLE_SCHEMA and c.TABLE_NAME = t.TABLE_NAME where c.TABLE_SCHEMA = 'pg_loader_test'
- Set up a mssql instance (e.g. using docker:
=> IsIdentity is NULL
, but expected is 1.
Replacing the selection with COLUMNPROPERTY(OBJECT_ID(c.TABLE_SCHEMA + '.' + c.TABLE_NAME), c.COLUMN_NAME, 'IsIdentity') AS IsIdentity
seems to work as expected.