This command is similar to 'sqlite-execute' except that it
executes multiple statements in exchange for not accepting
any arguments. (Bug#70145)
* src/sqlite.c (Fsqlite_execute_batch): New function.
* test/src/sqlite-tests.el (sqlite-multiple-statements): Add
smoke test for 'sqlite-execute-batch'.
* etc/NEWS: Mention new command 'sqlite-execute-batch'.
* doc/lispref/text.texi (Database): Document the new command.
(cherry picked from commit
23ef989935d38fe5c2c105933ae5f4d692656c72)
@end defun
+@defun sqlite-execute-batch db statements
+Execute the @acronym{SQL} @var{statements}. @var{statements} is a
+string containing 0 or more @acronym{SQL} statements. This command
+might be useful when we want to execute multiple @acronym{DDL}
+statements.
+
+@end defun
+
@defun sqlite-select db query &optional values return-type
Select some data from @var{db} and return them. For instance:
its shebang line, Emacs will now skip over 'env -S' and deduce the
major mode based on the interpreter after 'env -S'.
++++
+** New command 'sqlite-execute-batch'.
+This command lets the user execute multiple SQL commands in one
+command. It is useful when the user wants to evaluate an entire SQL
+file.
+
++++
\f
* Editing Changes in Emacs 30.1
return Qt;
}
+DEFUN ("sqlite-execute-batch", Fsqlite_execute_batch, Ssqlite_execute_batch, 2, 2, 0,
+ doc: /* Execute multiple SQL statements in DB.
+Query is a string containing 0 or more SQL statements. */)
+ (Lisp_Object db, Lisp_Object query)
+{
+ check_sqlite (db, false);
+ CHECK_STRING (query);
+ Lisp_Object encoded = encode_string(query);
+ return sqlite_exec (XSQLITE (db)->db, SSDATA (encoded));
+}
+
DEFUN ("sqlite-transaction", Fsqlite_transaction, Ssqlite_transaction, 1, 1, 0,
doc: /* Start a transaction in DB. */)
(Lisp_Object db)
defsubr (&Ssqlite_close);
defsubr (&Ssqlite_execute);
defsubr (&Ssqlite_select);
+ defsubr (&Ssqlite_execute_batch);
defsubr (&Ssqlite_transaction);
defsubr (&Ssqlite_commit);
defsubr (&Ssqlite_rollback);
'("Joe" "Doe"))
'((1 "Joe")))))))
+(ert-deftest sqlite-multiple-statements ()
+ (skip-unless (sqlite-available-p))
+ (let ((db (sqlite-open nil))
+ (query (with-temp-buffer
+ (insert "-- -*- sql-product: sqlite -*-
+
+-- I 💘 emojis
+
+CREATE TABLE settings (
+ name TEXT NOT NULL,
+ value TEXT,
+ section TEXT NOT NULL,
+ PRIMARY KEY (section, name)
+);
+
+CREATE TABLE tags📎 (
+ name TEXT PRIMARY KEY NOT NULL
+);
+
+-- CREATE TABLE todo_states (id INTEGER PRIMARY KEY, name TEXT NOT NULL);
+")
+ (buffer-string))))
+ (sqlite-execute-batch db query)
+ (should (equal '(("settings") ("tags📎"))
+ (sqlite-select db "select name from sqlite_master where type = 'table' and name not like 'sqlite_%' order by name")))))
+
;;; sqlite-tests.el ends here