emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/emacsql 4206b17f39 134/427: Add support for AS with CREATE


From: ELPA Syncer
Subject: [nongnu] elpa/emacsql 4206b17f39 134/427: Add support for AS with CREATE TABLE.
Date: Tue, 13 Dec 2022 02:59:35 -0500 (EST)

branch: elpa/emacsql
commit 4206b17f3949dc4ebb80d77d2a943c6047996955
Author: Christopher Wellons <wellons@nullprogram.com>
Commit: Christopher Wellons <wellons@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 "



reply via email to

[Prev in Thread] Current Thread [Next in Thread]