From 4fed8c5ecab46e57138abb2e365d8d6498a62560 Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Sat, 17 Feb 2018 00:25:33 +0100 Subject: [PATCH] Fix support for newid() from MS SQL. Several places in the code are involved to deal with the default values from MS SQL. The catalog query is dealing with strange quoting rules on the source side and used to fill in directly the PostgreSQL expected value. But then the quoting of a function call wasn't properly handled. Rather than coping with the quoting rules here, have the catalog query return a pgloader specific placeholder "GENERATE_UUID". Then the MS SQL specific code can normalize that to the symbol :generate_uuid. Then the generic PostgreSQL DDL code can implement the proper replacement for that symbol, not having to know where it comes from. Fix #742. --- src/pgsql/pgsql-ddl.lisp | 2 +- src/sources/mssql/mssql-cast-rules.lisp | 3 ++- src/sources/mssql/sql/list-all-columns.sql | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/pgsql/pgsql-ddl.lisp b/src/pgsql/pgsql-ddl.lisp index d3a4802..fa29e27 100644 --- a/src/pgsql/pgsql-ddl.lisp +++ b/src/pgsql/pgsql-ddl.lisp @@ -122,7 +122,7 @@ '((:null . "NULL") (:current-date . "CURRENT_DATE") (:current-timestamp . "CURRENT_TIMESTAMP") - (:generate-uuid . "uuid_generate_v1()")) + (:generate-uuid . "uuid_generate_v4()")) "Common normalized default values and their PostgreSQL spelling.") (defmethod format-default-value ((column column) &key (stream nil)) diff --git a/src/sources/mssql/mssql-cast-rules.lisp b/src/sources/mssql/mssql-cast-rules.lisp index 55e72b0..d25d029 100644 --- a/src/sources/mssql/mssql-cast-rules.lisp +++ b/src/sources/mssql/mssql-cast-rules.lisp @@ -159,7 +159,8 @@ ((and (stringp default) (or (string= "newid()" default) - (string= "newsequentialid()" default))) + (string= "newsequentialid()" default) + (string= "GENERATE_UUID" default))) :generate-uuid) (t (column-default pgcol))))) diff --git a/src/sources/mssql/sql/list-all-columns.sql b/src/sources/mssql/sql/list-all-columns.sql index c1b8445..fbba28e 100644 --- a/src/sources/mssql/sql/list-all-columns.sql +++ b/src/sources/mssql/sql/list-all-columns.sql @@ -11,7 +11,7 @@ CASE WHEN c.COLUMN_DEFAULT LIKE '((%' AND c.COLUMN_DEFAULT LIKE '%))' THEN CASE - WHEN SUBSTRING(c.COLUMN_DEFAULT,3,len(c.COLUMN_DEFAULT)-4) = 'newid()' THEN 'generate_uuid_v4()' + WHEN SUBSTRING(c.COLUMN_DEFAULT,3,len(c.COLUMN_DEFAULT)-4) = 'newid()' THEN 'GENERATE_UUID' WHEN SUBSTRING(c.COLUMN_DEFAULT,3,len(c.COLUMN_DEFAULT)-4) LIKE 'convert(%varchar%,getdate(),%)' THEN 'today' WHEN SUBSTRING(c.COLUMN_DEFAULT,3,len(c.COLUMN_DEFAULT)-4) = 'getdate()' THEN 'CURRENT_TIMESTAMP' WHEN SUBSTRING(c.COLUMN_DEFAULT,3,len(c.COLUMN_DEFAULT)-4) LIKE '''%''' THEN SUBSTRING(c.COLUMN_DEFAULT,4,len(c.COLUMN_DEFAULT)-6) @@ -19,7 +19,7 @@ END WHEN c.COLUMN_DEFAULT LIKE '(%' AND c.COLUMN_DEFAULT LIKE '%)' THEN CASE - WHEN SUBSTRING(c.COLUMN_DEFAULT,2,len(c.COLUMN_DEFAULT)-2) = 'newid()' THEN 'generate_uuid_v4()' + WHEN SUBSTRING(c.COLUMN_DEFAULT,2,len(c.COLUMN_DEFAULT)-2) = 'newid()' THEN 'GENERATE_UUID' WHEN SUBSTRING(c.COLUMN_DEFAULT,2,len(c.COLUMN_DEFAULT)-2) LIKE 'convert(%varchar%,getdate(),%)' THEN 'today' WHEN SUBSTRING(c.COLUMN_DEFAULT,2,len(c.COLUMN_DEFAULT)-2) = 'getdate()' THEN 'CURRENT_TIMESTAMP' WHEN SUBSTRING(c.COLUMN_DEFAULT,2,len(c.COLUMN_DEFAULT)-2) LIKE '''%''' THEN SUBSTRING(c.COLUMN_DEFAULT,3,len(c.COLUMN_DEFAULT)-4)