branch: elpa/emacsql commit 4206b17f3949dc4ebb80d77d2a943c6047996955 Author: Christopher Wellons <well...@nullprogram.com> Commit: Christopher Wellons <well...@nullprogram.com>
Add support for AS with CREATE TABLE. --- README.md | 6 ++++-- emacsql-tests.el | 4 ++++ emacsql.el | 11 +++++++---- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 65c61f7310..9a9c7764be 100644 --- a/README.md +++ b/README.md @@ -119,13 +119,15 @@ When multiple keywords appear in sequence, Emacsql will generally concatenate them with a dash, e.g. `CREATE TABLE` becomes `:create-table`. -#### :create-table `<table>` `<schema>` +#### :create-table `<table>` `<schema|select>` -Provides `CREATE TABLE`. +Provides `CREATE TABLE`. A selection can be used in place of a schema, +which will create a `CREATE TABLE ... AS` statement. ```el [:create-table employees [name (id integer :primary) (salary float)]] [:create-table (:temporary :if-not-exists employees) ...] +[:create-table names [:select name :from employees]] ``` #### :drop-table `<table>` diff --git a/emacsql-tests.el b/emacsql-tests.el index ac622c12b9..5277eb0629 100644 --- a/emacsql-tests.el +++ b/emacsql-tests.el @@ -94,6 +94,9 @@ "CREATE TABLE foo (a, b, c PRIMARY KEY);") ([:create-table foo [a b (c :default $1)]] '("FOO") "CREATE TABLE foo (a, b, c DEFAULT '\"FOO\"');") + ;; From select + ([:create-table $1 [:select name :from $2]] '(names people) + "CREATE TABLE names AS (SELECT name FROM people);") ;; Table constraints ([:create-table foo ([a b c] :primary [a c])] '() "CREATE TABLE foo (a, b, c, PRIMARY KEY (a, c));") @@ -101,6 +104,7 @@ "CREATE TABLE foo (a, b, c, UNIQUE (a, b, c));") ([:create-table foo ([a b] :check (< a b)) ] '() "CREATE TABLE foo (a, b, CHECK (a < b));") + ;; Drop table ([:drop-table $1] '(foo) "DROP TABLE foo;"))) diff --git a/emacsql.el b/emacsql.el index af2d0d7aea..60c65a1a3d 100644 --- a/emacsql.el +++ b/emacsql.el @@ -605,10 +605,13 @@ definitions for return from a `emacsql-defexpander'." (otherwise (setf name (var item :identifier))))) (let* ((items (list temporary "TABLE" if-not-exists name)) (spec (cl-remove-if-not #'identity items))) - (format "%s (%s)" (mapconcat #'identity spec " ") - (if (symbolp schema) - (var schema :schema) - (combine (emacsql--schema-to-string schema)))))))) + (format "%s %s" (mapconcat #'identity spec " ") + (cond ((symbolp schema) + (format "(%s)" (var schema :schema))) + ((eq :select (elt schema 0)) + (concat "AS " (subsql schema))) + ((let ((compiled (emacsql--schema-to-string schema))) + (format "(%s)" (combine compiled)))))))))) (emacsql-defexpander :drop-table (table) (emacsql-with-vars "DROP TABLE "