From b8e8cf7d183d6beb81b84fc70c34834ac279a047 Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Fri, 28 Dec 2018 10:53:01 +0100 Subject: [PATCH] Fix bugs in the recent extended support for materialized views. Materialized views without an explicit schema name are supported, but then would raise an error when trying to use destructuring-bind on a string rather than the (cons schema-name table-name). This patch fixes that. --- src/parsers/command-materialize-views.lisp | 5 ++++- src/sources/mssql/mssql-schema.lisp | 4 ++-- src/sources/pgsql/pgsql-schema.lisp | 4 ++-- test/pgsql-source.load | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/parsers/command-materialize-views.lisp b/src/parsers/command-materialize-views.lisp index e963858..9c75a92 100644 --- a/src/parsers/command-materialize-views.lisp +++ b/src/parsers/command-materialize-views.lisp @@ -7,7 +7,10 @@ (in-package #:pgloader.parser) (defrule view-name (or qualified-table-name maybe-quoted-namestring) - (:identity t)) + (:lambda (vn) + (etypecase vn + (cons vn) + (string (cons nil vn))))) (defrule view-sql (and kw-as dollar-quoted) (:destructure (as sql) (declare (ignore as)) sql)) diff --git a/src/sources/mssql/mssql-schema.lisp b/src/sources/mssql/mssql-schema.lisp index 9f83c86..7286ff6 100644 --- a/src/sources/mssql/mssql-schema.lisp +++ b/src/sources/mssql/mssql-schema.lisp @@ -229,7 +229,7 @@ (loop :for (name . def) :in views :for sql := (destructuring-bind (schema . v-name) name (format nil - "CREATE VIEW ~s.~s AS ~a" + "CREATE VIEW ~@[~s~].~s AS ~a" schema v-name def)) :do (progn (log-message :info "MS SQL: ~a" sql) @@ -249,7 +249,7 @@ :do (destructuring-bind (name . def) view-definition (declare (ignore def)) (format sql - "~@[, ~]~s.~s" + "~@[, ~]~@[~s.~]~s" (not (zerop i)) (car name) (cdr name))))))) (log-message :info "PostgreSQL Source: ~a" sql) (mssql-query sql)))))) diff --git a/src/sources/pgsql/pgsql-schema.lisp b/src/sources/pgsql/pgsql-schema.lisp index 2654e45..c96178a 100644 --- a/src/sources/pgsql/pgsql-schema.lisp +++ b/src/sources/pgsql/pgsql-schema.lisp @@ -10,7 +10,7 @@ (loop :for (name . def) :in views :for sql := (destructuring-bind (schema . v-name) name (format nil - "CREATE VIEW ~s.~s AS ~a" + "CREATE VIEW ~@[~s.~]~s AS ~a" schema v-name def)) :do (progn (log-message :info "PostgreSQL Source: ~a" sql) @@ -44,7 +44,7 @@ :do (destructuring-bind (name . def) view-definition (declare (ignore def)) (format sql - "~@[, ~]~s.~s" + "~@[, ~]~@[~s.~]~s" (not (zerop i)) (car name) (cdr name))))))) (log-message :info "PostgreSQL Source: ~a" sql) (pgsql-execute sql)))))) diff --git a/test/pgsql-source.load b/test/pgsql-source.load index 6e767df..69bb292 100644 --- a/test/pgsql-source.load +++ b/test/pgsql-source.load @@ -5,7 +5,7 @@ load database -- including only table names matching 'bits', ~/utilisateur/ in schema 'mysql' including only table names matching ~/geolocations/ in schema 'public' - materialize views public.some_usps + materialize views some_usps as $$ select usps, geoid, aland, awater, aland_sqmi, awater_sqmi, location from districts