From 3b4af49e22f6d746ffb0be2f5165b902a41772c6 Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Sun, 14 May 2017 20:47:01 +0200 Subject: [PATCH] Implement ALTER SCHEMA and ALTER TABLE for SQLite. It turns out we forgot to add support for internal catalog munging clauses to SQLite support. The catalogs being normalized means there's no extra work here other than allowing the parser to accept those clauses and then pass them over to our generic `copy-database' method implementation. It is to be noted that SQLite has no support for schemas as per the standard and PostgreSQL, so that when we inspect the database schema we create a nil entry here. It's then not possible to ALTER SCHEMA nil RENAME TO 'target'; unfortunately, but it's easy enough to SET search_path to 'target' anyway, as shown in the modified test case. Fix #552. --- src/parsers/command-sqlite.lisp | 11 ++++++++++- test/sqlite-chinook.load | 9 ++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/parsers/command-sqlite.lisp b/src/parsers/command-sqlite.lisp index d3d8f68..f684ec6 100644 --- a/src/parsers/command-sqlite.lisp +++ b/src/parsers/command-sqlite.lisp @@ -74,6 +74,8 @@ load database (defrule load-sqlite-optional-clauses (* (or sqlite-options gucs casts + alter-table + alter-schema including-like excluding-like before-load @@ -96,6 +98,7 @@ load database (defun lisp-code-for-loading-from-sqlite (sqlite-db-conn pg-db-conn &key gucs casts before after options + alter-table alter-schema ((:including incl)) ((:excluding excl))) `(lambda () @@ -113,6 +116,8 @@ load database ,(sql-code-block pg-db-conn :pre before "before load") (pgloader.sqlite:copy-database source + :alter-table ',alter-table + :alter-schema ',alter-schema :set-table-oids t :including ',incl :excluding ',excl @@ -125,7 +130,9 @@ load database (destructuring-bind (sqlite-uri pg-db-uri &key - gucs casts before after options including excluding) + gucs casts before after options + alter-table alter-schema + including excluding) source (cond (*dry-run* (lisp-code-for-sqlite-dry-run sqlite-uri pg-db-uri)) @@ -136,6 +143,8 @@ load database :before before :after after :options options + :alter-table alter-table + :alter-schema alter-schema :including including :excluding excluding)))))) diff --git a/test/sqlite-chinook.load b/test/sqlite-chinook.load index eaff160..5bc1631 100644 --- a/test/sqlite-chinook.load +++ b/test/sqlite-chinook.load @@ -8,4 +8,11 @@ load database concurrency = 2, include drop, create tables, create indexes, reset sequences, foreign keys - set work_mem to '16MB', maintenance_work_mem to '512 MB'; \ No newline at end of file + -- alter table names matching ~/./ set schema 'chinook' + alter table names matching 'Employee' rename to 'staff' + + set work_mem to '16MB', maintenance_work_mem to '512 MB', + search_path to 'chinook' + + before load do + $$ create schema if not exists chinook; $$; \ No newline at end of file