(x_set_frame_parameters): Remember requested value for
[emacs.git] / lisp / progmodes / sql.el
blob2e5dea59605880d569a9c84fa8d2e967a48766ac
1 ;;; sql.el --- specialized comint.el for SQL interpreters
3 ;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
4 ;; 2007, 2008, 2009 Free Software Foundation, Inc.
6 ;; Author: Alex Schroeder <alex@gnu.org>
7 ;; Maintainer: Michael Mauger <mmaug@yahoo.com>
8 ;; Version: 2.0.2
9 ;; Keywords: comm languages processes
10 ;; URL: http://savannah.gnu.org/cgi-bin/viewcvs/emacs/emacs/lisp/progmodes/sql.el
11 ;; URL: http://www.emacswiki.org/cgi-bin/wiki.pl?SqlMode
13 ;; This file is part of GNU Emacs.
15 ;; GNU Emacs is free software: you can redistribute it and/or modify
16 ;; it under the terms of the GNU General Public License as published by
17 ;; the Free Software Foundation, either version 3 of the License, or
18 ;; (at your option) any later version.
20 ;; GNU Emacs is distributed in the hope that it will be useful,
21 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
22 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 ;; GNU General Public License for more details.
25 ;; You should have received a copy of the GNU General Public License
26 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
28 ;;; Commentary:
30 ;; Please send bug reports and bug fixes to the mailing list at
31 ;; help-gnu-emacs@gnu.org. If you want to subscribe to the mailing
32 ;; list, see the web page at
33 ;; http://lists.gnu.org/mailman/listinfo/help-gnu-emacs for
34 ;; instructions. I monitor this list actively. If you send an e-mail
35 ;; to Alex Schroeder it usually makes it to me when Alex has a chance
36 ;; to forward them along (Thanks, Alex).
38 ;; This file provides a sql-mode and a sql-interactive-mode. The
39 ;; original goals were two simple modes providing syntactic
40 ;; highlighting. The interactive mode had to provide a command-line
41 ;; history; the other mode had to provide "send region/buffer to SQL
42 ;; interpreter" functions. "simple" in this context means easy to
43 ;; use, easy to maintain and little or no bells and whistles. This
44 ;; has changed somewhat as experience with the mode has accumulated.
46 ;; Support for different flavors of SQL and command interpreters was
47 ;; available in early versions of sql.el. This support has been
48 ;; extended and formalized in later versions. Part of the impetus for
49 ;; the improved support of SQL flavors was borne out of the current
50 ;; maintainer's consulting experience. In the past fifteen years, I
51 ;; have used Oracle, Sybase, Informix, MySQL, Postgres, and SQLServer.
52 ;; On some assignments, I have used two or more of these concurrently.
54 ;; If anybody feels like extending this sql mode, take a look at the
55 ;; above mentioned modes and write a sqlx-mode on top of this one. If
56 ;; this proves to be difficult, please suggest changes that will
57 ;; facilitate your plans. Facilities have been provided to add
58 ;; products and product-specific configuration.
60 ;; sql-interactive-mode is used to interact with a SQL interpreter
61 ;; process in a SQLi buffer (usually called `*SQL*'). The SQLi buffer
62 ;; is created by calling a SQL interpreter-specific entry function or
63 ;; sql-product-interactive. Do *not* call sql-interactive-mode by
64 ;; itself.
66 ;; The list of currently supported interpreters and the corresponding
67 ;; entry function used to create the SQLi buffers is shown with
68 ;; `sql-help' (M-x sql-help).
70 ;; Since sql-interactive-mode is built on top of the general
71 ;; command-interpreter-in-a-buffer mode (comint mode), it shares a
72 ;; common base functionality, and a common set of bindings, with all
73 ;; modes derived from comint mode. This makes these modes easier to
74 ;; use.
76 ;; sql-mode can be used to keep editing SQL statements. The SQL
77 ;; statements can be sent to the SQL process in the SQLi buffer.
79 ;; For documentation on the functionality provided by comint mode, and
80 ;; the hooks available for customizing it, see the file `comint.el'.
82 ;; Hint for newbies: take a look at `dabbrev-expand', `abbrev-mode', and
83 ;; `imenu-add-menubar-index'.
85 ;;; Requirements for Emacs 19.34:
87 ;; If you are using Emacs 19.34, you will have to get and install
88 ;; the file regexp-opt.el
89 ;; <URL:ftp://ftp.ifi.uio.no/pub/emacs/emacs-20.3/lisp/emacs-lisp/regexp-opt.el>
90 ;; and the custom package
91 ;; <URL:http://www.dina.kvl.dk/~abraham/custom/>.
93 ;;; Bugs:
95 ;; sql-ms now uses osql instead of isql. Osql flushes its error
96 ;; stream more frequently than isql so that error messages are
97 ;; available. There is no prompt and some output still is buffered.
98 ;; This improves the interaction under Emacs but it still is somewhat
99 ;; awkward.
101 ;; Quoted identifiers are not supported for hilighting. Most
102 ;; databases support the use of double quoted strings in place of
103 ;; identifiers; ms (Microsoft SQLServer) also supports identifiers
104 ;; enclosed within brackets [].
106 ;; ChangeLog available on request.
108 ;;; Product Support:
110 ;; To add support for additional SQL products the following steps
111 ;; must be followed ("xyz" is the name of the product in the examples
112 ;; below):
114 ;; 1) Add the product to `sql-product' choice list.
116 ;; (const :tag "XyzDB" xyz)
118 ;; 2) Add an entry to the `sql-product-alist' list.
120 ;; (xyz
121 ;; :font-lock sql-mode-xyz-font-lock-keywords
122 ;; :sqli-login (user password server database)
123 ;; :sqli-connect sql-connect-xyz
124 ;; :sqli-prompt-regexp "^xyzdb> "
125 ;; :sqli-prompt-length 7
126 ;; :sqli-input-sender nil
127 ;; :syntax-alist ((?# . "w")))
129 ;; 3) Add customizable values for the product interpreter and options.
131 ;; ;; Customization for XyzDB
133 ;; (defcustom sql-xyz-program "ixyz"
134 ;; "*Command to start ixyz by XyzDB."
135 ;; :type 'file
136 ;; :group 'SQL)
138 ;; (defcustom sql-xyz-options '("-X" "-Y" "-Z")
139 ;; "*List of additional options for `sql-xyz-program'."
140 ;; :type '(repeat string)
141 ;; :group 'SQL)
143 ;; 4) Add an entry to SQL->Product submenu.
145 ;; ["XyzDB" sql-highlight-xyz-keywords
146 ;; :style radio
147 ;; :selected (eq sql-product 'xyz)]
149 ;; 5) Add the font-lock specifications. At a minimum, default to
150 ;; using ANSI keywords. See sql-mode-oracle-font-lock-keywords for
151 ;; a more complex example.
153 ;; (defvar sql-mode-xyz-font-lock-keywords nil
154 ;; "XyzDB SQL keywords used by font-lock.")
156 ;; 6) Add a product highlighting function.
158 ;; (defun sql-highlight-xyz-keywords ()
159 ;; "Highlight XyzDB keywords."
160 ;; (interactive)
161 ;; (sql-set-product 'xyz))
163 ;; 7) Add an autoloaded SQLi function.
165 ;; ;;;###autoload
166 ;; (defun sql-xyz ()
167 ;; "Run ixyz by XyzDB as an inferior process."
168 ;; (interactive)
169 ;; (sql-product-interactive 'xyz))
171 ;; 8) Add a connect function which formats the command line arguments
172 ;; and starts the product interpreter in a comint buffer. See the
173 ;; existing connect functions for examples of the types of
174 ;; processing available.
176 ;; (defun sql-connect-xyz ()
177 ;; "Create comint buffer and connect to XyzDB using the login
178 ;; parameters and command options."
180 ;; ;; Do something with `sql-user', `sql-password',
181 ;; ;; `sql-database', and `sql-server'.
182 ;; (let ((params sql-xyz-options))
183 ;; (if (not (string= "" sql-server))
184 ;; (setq params (append (list "-S" sql-server) params)))
185 ;; (if (not (string= "" sql-database))
186 ;; (setq params (append (list "-D" sql-database) params)))
187 ;; (if (not (string= "" sql-password))
188 ;; (setq params (append (list "-P" sql-password) params)))
189 ;; (if (not (string= "" sql-user))
190 ;; (setq params (append (list "-U" sql-user) params)))
191 ;; (set-buffer (apply 'make-comint "SQL" sql-xyz-program
192 ;; nil params))))
194 ;; 9) Save and compile sql.el.
196 ;;; To Do:
198 ;; Add better hilight support for other brands; there is a bias towards
199 ;; Oracle because that's what I use at work. Anybody else just send in
200 ;; your lists of reserved words, keywords and builtin functions! As
201 ;; long as I don't receive any feedback, everything is hilighted with
202 ;; ANSI keywords only. I received the list of ANSI keywords from a
203 ;; user; if you know of any changes, let me know.
205 ;; Add different hilighting levels.
207 ;;; Thanks to all the people who helped me out:
209 ;; Alex Schroeder <alex@gnu.org>
210 ;; Kai Blauberg <kai.blauberg@metla.fi>
211 ;; <ibalaban@dalet.com>
212 ;; Yair Friedman <yfriedma@JohnBryce.Co.Il>
213 ;; Gregor Zych <zych@pool.informatik.rwth-aachen.de>
214 ;; nino <nino@inform.dk>
215 ;; Berend de Boer <berend@pobox.com>
216 ;; Adam Jenkins <adam@thejenkins.org>
217 ;; Michael Mauger <mmaug@yahoo.com> -- improved product support
218 ;; Drew Adams <drew.adams@oracle.com> -- Emacs 20 support
219 ;; Harald Maier <maierh@myself.com> -- sql-send-string
220 ;; Stefan Monnier <monnier@iro.umontreal.ca> -- font-lock corrections
224 ;;; Code:
226 (require 'comint)
227 ;; Need the following to allow GNU Emacs 19 to compile the file.
228 (eval-when-compile
229 (require 'regexp-opt))
230 (require 'custom)
231 (eval-when-compile ;; needed in Emacs 19, 20
232 (setq max-specpdl-size 2000))
234 (defvar font-lock-keyword-face)
235 (defvar font-lock-set-defaults)
236 (defvar font-lock-string-face)
238 ;;; Allow customization
240 (defgroup SQL nil
241 "Running a SQL interpreter from within Emacs buffers."
242 :version "20.4"
243 :group 'processes)
245 ;; These four variables will be used as defaults, if set.
247 (defcustom sql-user ""
248 "*Default username."
249 :type 'string
250 :group 'SQL)
252 (defcustom sql-password ""
253 "*Default password.
255 Storing your password in a textfile such as ~/.emacs could be dangerous.
256 Customizing your password will store it in your ~/.emacs file."
257 :type 'string
258 :group 'SQL)
260 (defcustom sql-database ""
261 "*Default database."
262 :type 'string
263 :group 'SQL)
265 (defcustom sql-server ""
266 "*Default server or host."
267 :type 'string
268 :group 'SQL)
270 ;; SQL Product support
271 (defcustom sql-product 'ansi
272 "*Select the SQL database product used so that buffers can be
273 highlighted properly when you open them."
274 :type '(choice (const :tag "ANSI" ansi)
275 (const :tag "DB2" db2)
276 (const :tag "Informix" informix)
277 (const :tag "Ingres" ingres)
278 (const :tag "Interbase" interbase)
279 (const :tag "Linter" linter)
280 (const :tag "Microsoft" ms)
281 (const :tag "MySQL" mysql)
282 (const :tag "Oracle" oracle)
283 (const :tag "PostGres" postgres)
284 (const :tag "Solid" solid)
285 (const :tag "SQLite" sqlite)
286 (const :tag "Sybase" sybase))
287 :group 'SQL)
289 (defvar sql-interactive-product nil
290 "Product under `sql-interactive-mode'.")
292 (defvar sql-product-alist
293 '((ansi
294 :font-lock sql-mode-ansi-font-lock-keywords)
295 (db2
296 :font-lock sql-mode-db2-font-lock-keywords
297 :sqli-login nil
298 :sqli-connect sql-connect-db2
299 :sqli-prompt-regexp "^db2 => "
300 :sqli-prompt-length 7)
301 (informix
302 :font-lock sql-mode-informix-font-lock-keywords
303 :sqli-login (database)
304 :sqli-connect sql-connect-informix
305 :sqli-prompt-regexp "^SQL> "
306 :sqli-prompt-length 5)
307 (ingres
308 :font-lock sql-mode-ingres-font-lock-keywords
309 :sqli-login (database)
310 :sqli-connect sql-connect-ingres
311 :sqli-prompt-regexp "^\* "
312 :sqli-prompt-length 2)
313 (interbase
314 :font-lock sql-mode-interbase-font-lock-keywords
315 :sqli-login (user password database)
316 :sqli-connect sql-connect-interbase
317 :sqli-prompt-regexp "^SQL> "
318 :sqli-prompt-length 5)
319 (linter
320 :font-lock sql-mode-linter-font-lock-keywords
321 :sqli-login (user password database server)
322 :sqli-connect sql-connect-linter
323 :sqli-prompt-regexp "^SQL>"
324 :sqli-prompt-length 4)
326 :font-lock sql-mode-ms-font-lock-keywords
327 :sqli-login (user password server database)
328 :sqli-connect sql-connect-ms
329 :sqli-prompt-regexp "^[0-9]*>"
330 :sqli-prompt-length 5
331 :syntax-alist ((?@ . "w")))
332 (mysql
333 :font-lock sql-mode-mysql-font-lock-keywords
334 :sqli-login (user password database server)
335 :sqli-connect sql-connect-mysql
336 :sqli-prompt-regexp "^mysql> "
337 :sqli-prompt-length 6)
338 (oracle
339 :font-lock sql-mode-oracle-font-lock-keywords
340 :sqli-login (user password database)
341 :sqli-connect sql-connect-oracle
342 :sqli-prompt-regexp "^SQL> "
343 :sqli-prompt-length 5
344 :syntax-alist ((?$ . "w") (?# . "w")))
345 (postgres
346 :font-lock sql-mode-postgres-font-lock-keywords
347 :sqli-login (user database server)
348 :sqli-connect sql-connect-postgres
349 :sqli-prompt-regexp "^.*[#>] *"
350 :sqli-prompt-length 5)
351 (solid
352 :font-lock sql-mode-solid-font-lock-keywords
353 :sqli-login (user password server)
354 :sqli-connect sql-connect-solid
355 :sqli-prompt-regexp "^"
356 :sqli-prompt-length 0)
357 (sqlite
358 :font-lock sql-mode-sqlite-font-lock-keywords
359 :sqli-login (user password server database)
360 :sqli-connect sql-connect-sqlite
361 :sqli-prompt-regexp "^sqlite> "
362 :sqli-prompt-length 8)
363 (sybase
364 :font-lock sql-mode-sybase-font-lock-keywords
365 :sqli-login (server user password database)
366 :sqli-connect sql-connect-sybase
367 :sqli-prompt-regexp "^SQL> "
368 :sqli-prompt-length 5
369 :syntax-alist ((?@ . "w")))
371 "This variable contains a list of product features for each of the
372 SQL products handled by `sql-mode'. Without an entry in this list a
373 product will not be properly highlighted and will not support
374 `sql-interactive-mode'.
376 Each element in the list is in the following format:
378 \(PRODUCT FEATURE VALUE ...)
380 where PRODUCT is the appropriate value of `sql-product'. The product
381 name is then followed by FEATURE-VALUE pairs. If a FEATURE is not
382 specified, its VALUE is treated as nil. FEATURE must be one of the
383 following:
385 :font-lock name of the variable containing the product
386 specific font lock highlighting patterns.
388 :sqli-login a list of login parameters (i.e., user,
389 password, database and server) needed to
390 connect to the database.
392 :sqli-connect the name of a function which accepts no
393 parameters that will use the values of
394 `sql-user', `sql-password',
395 `sql-database' and `sql-server' to open a
396 comint buffer and connect to the
397 database. Do product specific
398 configuration of comint in this function.
400 :sqli-prompt-regexp a regular expression string that matches
401 the prompt issued by the product
402 interpreter. (Not needed in 21.3+)
404 :sqli-prompt-length the length of the prompt on the line.(Not
405 needed in 21.3+)
407 :syntax-alist an alist of syntax table entries to enable
408 special character treatment by font-lock and
409 imenu. ")
411 ;; misc customization of sql.el behavior
413 (defcustom sql-electric-stuff nil
414 "Treat some input as electric.
415 If set to the symbol `semicolon', then hitting `;' will send current
416 input in the SQLi buffer to the process.
417 If set to the symbol `go', then hitting `go' on a line by itself will
418 send current input in the SQLi buffer to the process.
419 If set to nil, then you must use \\[comint-send-input] in order to send
420 current input in the SQLi buffer to the process."
421 :type '(choice (const :tag "Nothing" nil)
422 (const :tag "The semikolon `;'" semicolon)
423 (const :tag "The string `go' by itself" go))
424 :version "20.8"
425 :group 'SQL)
427 (defcustom sql-pop-to-buffer-after-send-region nil
428 "*If t, pop to the buffer SQL statements are sent to.
430 After a call to `sql-send-region' or `sql-send-buffer',
431 the window is split and the SQLi buffer is shown. If this
432 variable is not nil, that buffer's window will be selected
433 by calling `pop-to-buffer'. If this variable is nil, that
434 buffer is shown using `display-buffer'."
435 :type 'boolean
436 :group 'SQL)
438 ;; imenu support for sql-mode.
440 (defvar sql-imenu-generic-expression
441 ;; Items are in reverse order because they are rendered in reverse.
442 '(("Rules/Defaults" "^\\s-*create\\s-+\\(\\w+\\s-+\\)*\\(rule\\|default\\)\\s-+\\(\\w+\\)" 3)
443 ("Sequences" "^\\s-*create\\s-+\\(\\w+\\s-+\\)*sequence\\s-+\\(\\w+\\)" 2)
444 ("Triggers" "^\\s-*create\\s-+\\(\\w+\\s-+\\)*trigger\\s-+\\(\\w+\\)" 2)
445 ("Functions" "^\\s-*\\(create\\s-+\\(\\w+\\s-+\\)*\\)?function\\s-+\\(\\w+\\)" 3)
446 ("Procedures" "^\\s-*\\(create\\s-+\\(\\w+\\s-+\\)*\\)?proc\\(edure\\)?\\s-+\\(\\w+\\)" 4)
447 ("Packages" "^\\s-*create\\s-+\\(\\w+\\s-+\\)*package\\s-+\\(body\\s-+\\)?\\(\\w+\\)" 3)
448 ("Indexes" "^\\s-*create\\s-+\\(\\w+\\s-+\\)*index\\s-+\\(\\w+\\)" 2)
449 ("Tables/Views" "^\\s-*create\\s-+\\(\\w+\\s-+\\)*\\(table\\|view\\)\\s-+\\(\\w+\\)" 3))
450 "Define interesting points in the SQL buffer for `imenu'.
452 This is used to set `imenu-generic-expression' when SQL mode is
453 entered. Subsequent changes to sql-imenu-generic-expression will not
454 affect existing SQL buffers because imenu-generic-expression is a
455 local variable.")
457 ;; history file
459 (defcustom sql-input-ring-file-name nil
460 "*If non-nil, name of the file to read/write input history.
462 You have to set this variable if you want the history of your commands
463 saved from one Emacs session to the next. If this variable is set,
464 exiting the SQL interpreter in an SQLi buffer will write the input
465 history to the specified file. Starting a new process in a SQLi buffer
466 will read the input history from the specified file.
468 This is used to initialize `comint-input-ring-file-name'.
470 Note that the size of the input history is determined by the variable
471 `comint-input-ring-size'."
472 :type '(choice (const :tag "none" nil)
473 (file))
474 :group 'SQL)
476 (defcustom sql-input-ring-separator "\n--\n"
477 "*Separator between commands in the history file.
479 If set to \"\\n\", each line in the history file will be interpreted as
480 one command. Multi-line commands are split into several commands when
481 the input ring is initialized from a history file.
483 This variable used to initialize `comint-input-ring-separator'.
484 `comint-input-ring-separator' is part of Emacs 21; if your Emacs
485 does not have it, setting `sql-input-ring-separator' will have no
486 effect. In that case multiline commands will be split into several
487 commands when the input history is read, as if you had set
488 `sql-input-ring-separator' to \"\\n\"."
489 :type 'string
490 :group 'SQL)
492 ;; The usual hooks
494 (defcustom sql-interactive-mode-hook '()
495 "*Hook for customizing `sql-interactive-mode'."
496 :type 'hook
497 :group 'SQL)
499 (defcustom sql-mode-hook '()
500 "*Hook for customizing `sql-mode'."
501 :type 'hook
502 :group 'SQL)
504 (defcustom sql-set-sqli-hook '()
505 "*Hook for reacting to changes of `sql-buffer'.
507 This is called by `sql-set-sqli-buffer' when the value of `sql-buffer'
508 is changed."
509 :type 'hook
510 :group 'SQL)
512 ;; Customization for Oracle
514 (defcustom sql-oracle-program "sqlplus"
515 "*Command to start sqlplus by Oracle.
517 Starts `sql-interactive-mode' after doing some setup.
519 Under NT, \"sqlplus\" usually starts the sqlplus \"GUI\". In order to
520 start the sqlplus console, use \"plus33\" or something similar. You
521 will find the file in your Orant\\bin directory.
523 The program can also specify a TCP connection. See `make-comint'."
524 :type 'file
525 :group 'SQL)
527 (defcustom sql-oracle-options nil
528 "*List of additional options for `sql-oracle-program'."
529 :type '(repeat string)
530 :version "20.8"
531 :group 'SQL)
533 ;; Customization for SQLite
535 (defcustom sql-sqlite-program "sqlite"
536 "*Command to start SQLite.
538 Starts `sql-interactive-mode' after doing some setup.
540 The program can also specify a TCP connection. See `make-comint'."
541 :type 'file
542 :group 'SQL)
544 (defcustom sql-sqlite-options nil
545 "*List of additional options for `sql-sqlite-program'.
546 The following list of options is reported to make things work
547 on Windows: \"-C\" \"-t\" \"-f\" \"-n\"."
548 :type '(repeat string)
549 :version "20.8"
550 :group 'SQL)
552 ;; Customization for MySql
554 (defcustom sql-mysql-program "mysql"
555 "*Command to start mysql by TcX.
557 Starts `sql-interactive-mode' after doing some setup.
559 The program can also specify a TCP connection. See `make-comint'."
560 :type 'file
561 :group 'SQL)
563 (defcustom sql-mysql-options nil
564 "*List of additional options for `sql-mysql-program'.
565 The following list of options is reported to make things work
566 on Windows: \"-C\" \"-t\" \"-f\" \"-n\"."
567 :type '(repeat string)
568 :version "20.8"
569 :group 'SQL)
571 ;; Customization for Solid
573 (defcustom sql-solid-program "solsql"
574 "*Command to start SOLID SQL Editor.
576 Starts `sql-interactive-mode' after doing some setup.
578 The program can also specify a TCP connection. See `make-comint'."
579 :type 'file
580 :group 'SQL)
582 ;; Customization for SyBase
584 (defcustom sql-sybase-program "isql"
585 "*Command to start isql by SyBase.
587 Starts `sql-interactive-mode' after doing some setup.
589 The program can also specify a TCP connection. See `make-comint'."
590 :type 'file
591 :group 'SQL)
593 (defcustom sql-sybase-options nil
594 "*List of additional options for `sql-sybase-program'.
595 Some versions of isql might require the -n option in order to work."
596 :type '(repeat string)
597 :version "20.8"
598 :group 'SQL)
600 ;; Customization for Informix
602 (defcustom sql-informix-program "dbaccess"
603 "*Command to start dbaccess by Informix.
605 Starts `sql-interactive-mode' after doing some setup.
607 The program can also specify a TCP connection. See `make-comint'."
608 :type 'file
609 :group 'SQL)
611 ;; Customization for Ingres
613 (defcustom sql-ingres-program "sql"
614 "*Command to start sql by Ingres.
616 Starts `sql-interactive-mode' after doing some setup.
618 The program can also specify a TCP connection. See `make-comint'."
619 :type 'file
620 :group 'SQL)
622 ;; Customization for Microsoft
624 (defcustom sql-ms-program "osql"
625 "*Command to start osql by Microsoft.
627 Starts `sql-interactive-mode' after doing some setup.
629 The program can also specify a TCP connection. See `make-comint'."
630 :type 'file
631 :group 'SQL)
633 (defcustom sql-ms-options '("-w" "300" "-n")
634 ;; -w is the linesize
635 "*List of additional options for `sql-ms-program'."
636 :type '(repeat string)
637 :version "22.1"
638 :group 'SQL)
640 ;; Customization for Postgres
642 (defcustom sql-postgres-program "psql"
643 "Command to start psql by Postgres.
645 Starts `sql-interactive-mode' after doing some setup.
647 The program can also specify a TCP connection. See `make-comint'."
648 :type 'file
649 :group 'SQL)
651 (defcustom sql-postgres-options '("-P" "pager=off")
652 "*List of additional options for `sql-postgres-program'.
653 The default setting includes the -P option which breaks older versions
654 of the psql client (such as version 6.5.3). The -P option is equivalent
655 to the --pset option. If you want the psql to prompt you for a user
656 name, add the string \"-u\" to the list of options. If you want to
657 provide a user name on the command line (newer versions such as 7.1),
658 add your name with a \"-U\" prefix (such as \"-Umark\") to the list."
659 :type '(repeat string)
660 :version "20.8"
661 :group 'SQL)
663 ;; Customization for Interbase
665 (defcustom sql-interbase-program "isql"
666 "*Command to start isql by Interbase.
668 Starts `sql-interactive-mode' after doing some setup.
670 The program can also specify a TCP connection. See `make-comint'."
671 :type 'file
672 :group 'SQL)
674 (defcustom sql-interbase-options nil
675 "*List of additional options for `sql-interbase-program'."
676 :type '(repeat string)
677 :version "20.8"
678 :group 'SQL)
680 ;; Customization for DB2
682 (defcustom sql-db2-program "db2"
683 "*Command to start db2 by IBM.
685 Starts `sql-interactive-mode' after doing some setup.
687 The program can also specify a TCP connection. See `make-comint'."
688 :type 'file
689 :group 'SQL)
691 (defcustom sql-db2-options nil
692 "*List of additional options for `sql-db2-program'."
693 :type '(repeat string)
694 :version "20.8"
695 :group 'SQL)
697 ;; Customization for Linter
699 (defcustom sql-linter-program "inl"
700 "*Command to start inl by RELEX.
702 Starts `sql-interactive-mode' after doing some setup."
703 :type 'file
704 :group 'SQL)
706 (defcustom sql-linter-options nil
707 "*List of additional options for `sql-linter-program'."
708 :type '(repeat string)
709 :version "21.3"
710 :group 'SQL)
714 ;;; Variables which do not need customization
716 (defvar sql-user-history nil
717 "History of usernames used.")
719 (defvar sql-database-history nil
720 "History of databases used.")
722 (defvar sql-server-history nil
723 "History of servers used.")
725 ;; Passwords are not kept in a history.
727 (defvar sql-buffer nil
728 "Current SQLi buffer.
730 The global value of sql-buffer is the name of the latest SQLi buffer
731 created. Any SQL buffer created will make a local copy of this value.
732 See `sql-interactive-mode' for more on multiple sessions. If you want
733 to change the SQLi buffer a SQL mode sends its SQL strings to, change
734 the local value of `sql-buffer' using \\[sql-set-sqli-buffer].")
736 (defvar sql-prompt-regexp nil
737 "Prompt used to initialize `comint-prompt-regexp'.
739 You can change `sql-prompt-regexp' on `sql-interactive-mode-hook'.")
741 (defvar sql-prompt-length 0
742 "Prompt used to set `left-margin' in `sql-interactive-mode'.
744 You can change `sql-prompt-length' on `sql-interactive-mode-hook'.")
746 (defvar sql-alternate-buffer-name nil
747 "Buffer-local string used to possibly rename the SQLi buffer.
749 Used by `sql-rename-buffer'.")
751 ;; Keymap for sql-interactive-mode.
753 (defvar sql-interactive-mode-map
754 (let ((map (make-sparse-keymap)))
755 (if (fboundp 'set-keymap-parent)
756 (set-keymap-parent map comint-mode-map); Emacs
757 (if (fboundp 'set-keymap-parents)
758 (set-keymap-parents map (list comint-mode-map)))); XEmacs
759 (if (fboundp 'set-keymap-name)
760 (set-keymap-name map 'sql-interactive-mode-map)); XEmacs
761 (define-key map (kbd "C-j") 'sql-accumulate-and-indent)
762 (define-key map (kbd "C-c C-w") 'sql-copy-column)
763 (define-key map (kbd "O") 'sql-magic-go)
764 (define-key map (kbd "o") 'sql-magic-go)
765 (define-key map (kbd ";") 'sql-magic-semicolon)
766 map)
767 "Mode map used for `sql-interactive-mode'.
768 Based on `comint-mode-map'.")
770 ;; Keymap for sql-mode.
772 (defvar sql-mode-map
773 (let ((map (make-sparse-keymap)))
774 (define-key map (kbd "C-c C-c") 'sql-send-paragraph)
775 (define-key map (kbd "C-c C-r") 'sql-send-region)
776 (define-key map (kbd "C-c C-s") 'sql-send-string)
777 (define-key map (kbd "C-c C-b") 'sql-send-buffer)
778 map)
779 "Mode map used for `sql-mode'.")
781 ;; easy menu for sql-mode.
783 (easy-menu-define
784 sql-mode-menu sql-mode-map
785 "Menu for `sql-mode'."
786 '("SQL"
787 ["Send Paragraph" sql-send-paragraph (and (buffer-live-p sql-buffer)
788 (get-buffer-process sql-buffer))]
789 ["Send Region" sql-send-region (and (or (and (boundp 'mark-active); Emacs
790 mark-active)
791 (mark t)); XEmacs
792 (buffer-live-p sql-buffer)
793 (get-buffer-process sql-buffer))]
794 ["Send Buffer" sql-send-buffer (and (buffer-live-p sql-buffer)
795 (get-buffer-process sql-buffer))]
796 ["Send String" sql-send-string t]
797 ["--" nil nil]
798 ["Start SQLi session" sql-product-interactive (sql-product-feature :sqli-connect)]
799 ["Show SQLi buffer" sql-show-sqli-buffer t]
800 ["Set SQLi buffer" sql-set-sqli-buffer t]
801 ["Pop to SQLi buffer after send"
802 sql-toggle-pop-to-buffer-after-send-region
803 :style toggle
804 :selected sql-pop-to-buffer-after-send-region]
805 ["--" nil nil]
806 ("Product"
807 ["ANSI" sql-highlight-ansi-keywords
808 :style radio
809 :selected (eq sql-product 'ansi)]
810 ["DB2" sql-highlight-db2-keywords
811 :style radio
812 :selected (eq sql-product 'db2)]
813 ["Informix" sql-highlight-informix-keywords
814 :style radio
815 :selected (eq sql-product 'informix)]
816 ["Ingres" sql-highlight-ingres-keywords
817 :style radio
818 :selected (eq sql-product 'ingres)]
819 ["Interbase" sql-highlight-interbase-keywords
820 :style radio
821 :selected (eq sql-product 'interbase)]
822 ["Linter" sql-highlight-linter-keywords
823 :style radio
824 :selected (eq sql-product 'linter)]
825 ["MS SQLServer" sql-highlight-ms-keywords
826 :style radio
827 :selected (eq sql-product 'ms)]
828 ["MySQL" sql-highlight-mysql-keywords
829 :style radio
830 :selected (eq sql-product 'mysql)]
831 ["Oracle" sql-highlight-oracle-keywords
832 :style radio
833 :selected (eq sql-product 'oracle)]
834 ["Postgres" sql-highlight-postgres-keywords
835 :style radio
836 :selected (eq sql-product 'postgres)]
837 ["Solid" sql-highlight-solid-keywords
838 :style radio
839 :selected (eq sql-product 'solid)]
840 ["SQLite" sql-highlight-sqlite-keywords
841 :style radio
842 :selected (eq sql-product 'sqlite)]
843 ["Sybase" sql-highlight-sybase-keywords
844 :style radio
845 :selected (eq sql-product 'sybase)]
848 ;; easy menu for sql-interactive-mode.
850 (easy-menu-define
851 sql-interactive-mode-menu sql-interactive-mode-map
852 "Menu for `sql-interactive-mode'."
853 '("SQL"
854 ["Rename Buffer" sql-rename-buffer t]))
856 ;; Abbreviations -- if you want more of them, define them in your
857 ;; ~/.emacs file. Abbrevs have to be enabled in your ~/.emacs, too.
859 (defvar sql-mode-abbrev-table nil
860 "Abbrev table used in `sql-mode' and `sql-interactive-mode'.")
861 (unless sql-mode-abbrev-table
862 (define-abbrev-table 'sql-mode-abbrev-table nil))
864 (mapc
865 ;; In Emacs 22+, provide SYSTEM-FLAG to define-abbrev.
866 '(lambda (abbrev)
867 (let ((name (car abbrev))
868 (expansion (cdr abbrev)))
869 (condition-case nil
870 (define-abbrev sql-mode-abbrev-table name expansion nil 0 t)
871 (error
872 (define-abbrev sql-mode-abbrev-table name expansion)))))
873 '(("ins" . "insert")
874 ("upd" . "update")
875 ("del" . "delete")
876 ("sel" . "select")
877 ("proc" . "procedure")
878 ("func" . "function")
879 ("cr" . "create")))
881 ;; Syntax Table
883 (defvar sql-mode-syntax-table
884 (let ((table (make-syntax-table)))
885 ;; C-style comments /**/ (see elisp manual "Syntax Flags"))
886 (modify-syntax-entry ?/ ". 14" table)
887 (modify-syntax-entry ?* ". 23" table)
888 ;; double-dash starts comments
889 (modify-syntax-entry ?- ". 12b" table)
890 ;; newline and formfeed end comments
891 (modify-syntax-entry ?\n "> b" table)
892 (modify-syntax-entry ?\f "> b" table)
893 ;; single quotes (') delimit strings
894 (modify-syntax-entry ?' "\"" table)
895 ;; double quotes (") don't delimit strings
896 (modify-syntax-entry ?\" "." table)
897 ;; backslash is no escape character
898 (modify-syntax-entry ?\\ "." table)
899 table)
900 "Syntax table used in `sql-mode' and `sql-interactive-mode'.")
902 ;; Font lock support
904 (defvar sql-mode-font-lock-object-name
905 (eval-when-compile
906 (list (concat "^\\s-*\\(?:create\\|drop\\|alter\\)\\s-+" ;; lead off with CREATE, DROP or ALTER
907 "\\(?:\\w+\\s-+\\)*" ;; optional intervening keywords
908 "\\(?:table\\|view\\|\\(?:package\\|type\\)\\(?:\\s-+body\\)?\\|proc\\(?:edure\\)?"
909 "\\|function\\|trigger\\|sequence\\|rule\\|default\\)\\s-+"
910 "\\(\\w+\\)")
911 1 'font-lock-function-name-face))
913 "Pattern to match the names of top-level objects.
915 The pattern matches the name in a CREATE, DROP or ALTER
916 statement. The format of variable should be a valid
917 `font-lock-keywords' entry.")
919 (defmacro sql-keywords-re (&rest keywords)
920 "Compile-time generation of regexp matching any one of KEYWORDS."
921 `(eval-when-compile
922 (concat "\\b"
923 (regexp-opt ',keywords t)
924 "\\b")))
926 (defvar sql-mode-ansi-font-lock-keywords
927 (let ((ansi-funcs (sql-keywords-re
928 "abs" "avg" "bit_length" "cardinality" "cast" "char_length"
929 "character_length" "coalesce" "convert" "count" "current_date"
930 "current_path" "current_role" "current_time" "current_timestamp"
931 "current_user" "extract" "localtime" "localtimestamp" "lower" "max"
932 "min" "mod" "nullif" "octet_length" "overlay" "placing" "session_user"
933 "substring" "sum" "system_user" "translate" "treat" "trim" "upper"
934 "user"
937 (ansi-non-reserved (sql-keywords-re
938 "ada" "asensitive" "assignment" "asymmetric" "atomic" "between"
939 "bitvar" "called" "catalog_name" "chain" "character_set_catalog"
940 "character_set_name" "character_set_schema" "checked" "class_origin"
941 "cobol" "collation_catalog" "collation_name" "collation_schema"
942 "column_name" "command_function" "command_function_code" "committed"
943 "condition_number" "connection_name" "constraint_catalog"
944 "constraint_name" "constraint_schema" "contains" "cursor_name"
945 "datetime_interval_code" "datetime_interval_precision" "defined"
946 "definer" "dispatch" "dynamic_function" "dynamic_function_code"
947 "existing" "exists" "final" "fortran" "generated" "granted"
948 "hierarchy" "hold" "implementation" "infix" "insensitive" "instance"
949 "instantiable" "invoker" "key_member" "key_type" "length" "m"
950 "message_length" "message_octet_length" "message_text" "method" "more"
951 "mumps" "name" "nullable" "number" "options" "overlaps" "overriding"
952 "parameter_mode" "parameter_name" "parameter_ordinal_position"
953 "parameter_specific_catalog" "parameter_specific_name"
954 "parameter_specific_schema" "pascal" "pli" "position" "repeatable"
955 "returned_length" "returned_octet_length" "returned_sqlstate"
956 "routine_catalog" "routine_name" "routine_schema" "row_count" "scale"
957 "schema_name" "security" "self" "sensitive" "serializable"
958 "server_name" "similar" "simple" "source" "specific_name" "style"
959 "subclass_origin" "sublist" "symmetric" "system" "table_name"
960 "transaction_active" "transactions_committed"
961 "transactions_rolled_back" "transform" "transforms" "trigger_catalog"
962 "trigger_name" "trigger_schema" "type" "uncommitted" "unnamed"
963 "user_defined_type_catalog" "user_defined_type_name"
964 "user_defined_type_schema"
967 (ansi-reserved (sql-keywords-re
968 "absolute" "action" "add" "admin" "after" "aggregate" "alias" "all"
969 "allocate" "alter" "and" "any" "are" "as" "asc" "assertion" "at"
970 "authorization" "before" "begin" "both" "breadth" "by" "call"
971 "cascade" "cascaded" "case" "catalog" "check" "class" "close"
972 "collate" "collation" "column" "commit" "completion" "connect"
973 "connection" "constraint" "constraints" "constructor" "continue"
974 "corresponding" "create" "cross" "cube" "current" "cursor" "cycle"
975 "data" "day" "deallocate" "declare" "default" "deferrable" "deferred"
976 "delete" "depth" "deref" "desc" "describe" "descriptor" "destroy"
977 "destructor" "deterministic" "diagnostics" "dictionary" "disconnect"
978 "distinct" "domain" "drop" "dynamic" "each" "else" "end" "equals"
979 "escape" "every" "except" "exception" "exec" "execute" "external"
980 "false" "fetch" "first" "for" "foreign" "found" "free" "from" "full"
981 "function" "general" "get" "global" "go" "goto" "grant" "group"
982 "grouping" "having" "host" "hour" "identity" "ignore" "immediate" "in"
983 "indicator" "initialize" "initially" "inner" "inout" "input" "insert"
984 "intersect" "into" "is" "isolation" "iterate" "join" "key" "language"
985 "last" "lateral" "leading" "left" "less" "level" "like" "limit"
986 "local" "locator" "map" "match" "minute" "modifies" "modify" "module"
987 "month" "names" "natural" "new" "next" "no" "none" "not" "null" "of"
988 "off" "old" "on" "only" "open" "operation" "option" "or" "order"
989 "ordinality" "out" "outer" "output" "pad" "parameter" "parameters"
990 "partial" "path" "postfix" "prefix" "preorder" "prepare" "preserve"
991 "primary" "prior" "privileges" "procedure" "public" "read" "reads"
992 "recursive" "references" "referencing" "relative" "restrict" "result"
993 "return" "returns" "revoke" "right" "role" "rollback" "rollup"
994 "routine" "rows" "savepoint" "schema" "scroll" "search" "second"
995 "section" "select" "sequence" "session" "set" "sets" "size" "some"
996 "space" "specific" "specifictype" "sql" "sqlexception" "sqlstate"
997 "sqlwarning" "start" "state" "statement" "static" "structure" "table"
998 "temporary" "terminate" "than" "then" "timezone_hour"
999 "timezone_minute" "to" "trailing" "transaction" "translation"
1000 "trigger" "true" "under" "union" "unique" "unknown" "unnest" "update"
1001 "usage" "using" "value" "values" "variable" "view" "when" "whenever"
1002 "where" "with" "without" "work" "write" "year"
1005 (ansi-types (sql-keywords-re
1006 "array" "binary" "bit" "blob" "boolean" "char" "character" "clob"
1007 "date" "dec" "decimal" "double" "float" "int" "integer" "interval"
1008 "large" "national" "nchar" "nclob" "numeric" "object" "precision"
1009 "real" "ref" "row" "scope" "smallint" "time" "timestamp" "varchar"
1010 "varying" "zone"
1013 `((,ansi-non-reserved . font-lock-keyword-face)
1014 (,ansi-reserved . font-lock-keyword-face)
1015 (,ansi-funcs . font-lock-builtin-face)
1016 (,ansi-types . font-lock-type-face)))
1018 "ANSI SQL keywords used by font-lock.
1020 This variable is used by `sql-mode' and `sql-interactive-mode'. The
1021 regular expressions are created during compilation by calling the
1022 function `regexp-opt'. Therefore, take a look at the source before
1023 you define your own sql-mode-ansi-font-lock-keywords. You may want to
1024 add functions and PL/SQL keywords.")
1026 (defvar sql-mode-oracle-font-lock-keywords
1027 (let ((oracle-functions (sql-keywords-re
1028 "abs" "acos" "add_months" "ascii" "asciistr" "asin" "atan" "atan2"
1029 "avg" "bfilename" "bin_to_num" "bitand" "cast" "ceil" "chartorowid"
1030 "chr" "coalesce" "compose" "concat" "convert" "corr" "cos" "cosh"
1031 "count" "covar_pop" "covar_samp" "cume_dist" "current_date"
1032 "current_timestamp" "current_user" "dbtimezone" "decode" "decompose"
1033 "dense_rank" "depth" "deref" "dump" "empty_clob" "existsnode" "exp"
1034 "extract" "extractvalue" "first" "first_value" "floor" "following"
1035 "from_tz" "greatest" "group_id" "grouping_id" "hextoraw" "initcap"
1036 "instr" "lag" "last" "last_day" "last_value" "lead" "least" "length"
1037 "ln" "localtimestamp" "lower" "lpad" "ltrim" "make_ref" "max" "min"
1038 "mod" "months_between" "new_time" "next_day" "nls_charset_decl_len"
1039 "nls_charset_id" "nls_charset_name" "nls_initcap" "nls_lower"
1040 "nls_upper" "nlssort" "ntile" "nullif" "numtodsinterval"
1041 "numtoyminterval" "nvl" "nvl2" "over" "path" "percent_rank"
1042 "percentile_cont" "percentile_disc" "power" "preceding" "rank"
1043 "ratio_to_report" "rawtohex" "rawtonhex" "reftohex" "regr_"
1044 "regr_avgx" "regr_avgy" "regr_count" "regr_intercept" "regr_r2"
1045 "regr_slope" "regr_sxx" "regr_sxy" "regr_syy" "replace" "round"
1046 "row_number" "rowidtochar" "rowidtonchar" "rpad" "rtrim"
1047 "sessiontimezone" "sign" "sin" "sinh" "soundex" "sqrt" "stddev"
1048 "stddev_pop" "stddev_samp" "substr" "sum" "sys_connect_by_path"
1049 "sys_context" "sys_dburigen" "sys_extract_utc" "sys_guid" "sys_typeid"
1050 "sys_xmlagg" "sys_xmlgen" "sysdate" "systimestamp" "tan" "tanh"
1051 "to_char" "to_clob" "to_date" "to_dsinterval" "to_lob" "to_multi_byte"
1052 "to_nchar" "to_nclob" "to_number" "to_single_byte" "to_timestamp"
1053 "to_timestamp_tz" "to_yminterval" "translate" "treat" "trim" "trunc"
1054 "tz_offset" "uid" "unbounded" "unistr" "updatexml" "upper" "user"
1055 "userenv" "var_pop" "var_samp" "variance" "vsize" "width_bucket" "xml"
1056 "xmlagg" "xmlattribute" "xmlcolattval" "xmlconcat" "xmlelement"
1057 "xmlforest" "xmlsequence" "xmltransform"
1060 (oracle-keywords (sql-keywords-re
1061 "abort" "access" "accessed" "account" "activate" "add" "admin"
1062 "advise" "after" "agent" "aggregate" "all" "allocate" "allow" "alter"
1063 "always" "analyze" "ancillary" "and" "any" "apply" "archive"
1064 "archivelog" "array" "as" "asc" "associate" "at" "attribute"
1065 "attributes" "audit" "authenticated" "authid" "authorization" "auto"
1066 "autoallocate" "automatic" "availability" "backup" "before" "begin"
1067 "behalf" "between" "binding" "bitmap" "block" "blocksize" "body"
1068 "both" "buffer_pool" "build" "by" "cache" "call" "cancel"
1069 "cascade" "case" "category" "certificate" "chained" "change" "check"
1070 "checkpoint" "child" "chunk" "class" "clear" "clone" "close" "cluster"
1071 "column" "column_value" "columns" "comment" "commit" "committed"
1072 "compatibility" "compile" "complete" "composite_limit" "compress"
1073 "compute" "connect" "connect_time" "consider" "consistent"
1074 "constraint" "constraints" "constructor" "contents" "context"
1075 "continue" "controlfile" "corruption" "cost" "cpu_per_call"
1076 "cpu_per_session" "create" "cross" "cube" "current" "currval" "cycle"
1077 "dangling" "data" "database" "datafile" "datafiles" "day" "ddl"
1078 "deallocate" "debug" "default" "deferrable" "deferred" "definer"
1079 "delay" "delete" "demand" "desc" "determines" "deterministic"
1080 "dictionary" "dimension" "directory" "disable" "disassociate"
1081 "disconnect" "distinct" "distinguished" "distributed" "dml" "drop"
1082 "each" "element" "else" "enable" "end" "equals_path" "escape"
1083 "estimate" "except" "exceptions" "exchange" "excluding" "exists"
1084 "expire" "explain" "extent" "external" "externally"
1085 "failed_login_attempts" "fast" "file" "final" "finish" "flush" "for"
1086 "force" "foreign" "freelist" "freelists" "freepools" "fresh" "from"
1087 "full" "function" "functions" "generated" "global" "global_name"
1088 "globally" "grant" "group" "grouping" "groups" "guard" "hash"
1089 "hashkeys" "having" "heap" "hierarchy" "id" "identified" "identifier"
1090 "idle_time" "immediate" "in" "including" "increment" "index" "indexed"
1091 "indexes" "indextype" "indextypes" "indicator" "initial" "initialized"
1092 "initially" "initrans" "inner" "insert" "instance" "instantiable"
1093 "instead" "intersect" "into" "invalidate" "is" "isolation" "java"
1094 "join" "keep" "key" "kill" "language" "left" "less" "level"
1095 "levels" "library" "like" "like2" "like4" "likec" "limit" "link"
1096 "list" "lob" "local" "location" "locator" "lock" "log" "logfile"
1097 "logging" "logical" "logical_reads_per_call"
1098 "logical_reads_per_session" "managed" "management" "manual" "map"
1099 "mapping" "master" "matched" "materialized" "maxdatafiles"
1100 "maxextents" "maximize" "maxinstances" "maxlogfiles" "maxloghistory"
1101 "maxlogmembers" "maxsize" "maxtrans" "maxvalue" "member" "memory"
1102 "merge" "migrate" "minextents" "minimize" "minimum" "minus" "minvalue"
1103 "mode" "modify" "monitoring" "month" "mount" "move" "movement" "name"
1104 "named" "natural" "nested" "never" "new" "next" "nextval" "no"
1105 "noarchivelog" "noaudit" "nocache" "nocompress" "nocopy" "nocycle"
1106 "nodelay" "noforce" "nologging" "nomapping" "nomaxvalue" "nominimize"
1107 "nominvalue" "nomonitoring" "none" "noorder" "noparallel" "norely"
1108 "noresetlogs" "noreverse" "normal" "norowdependencies" "nosort"
1109 "noswitch" "not" "nothing" "notimeout" "novalidate" "nowait" "null"
1110 "nulls" "object" "of" "off" "offline" "oidindex" "old" "on" "online"
1111 "only" "open" "operator" "optimal" "option" "or" "order"
1112 "organization" "out" "outer" "outline" "overflow" "overriding"
1113 "package" "packages" "parallel" "parallel_enable" "parameters"
1114 "parent" "partition" "partitions" "password" "password_grace_time"
1115 "password_life_time" "password_lock_time" "password_reuse_max"
1116 "password_reuse_time" "password_verify_function" "pctfree"
1117 "pctincrease" "pctthreshold" "pctused" "pctversion" "percent"
1118 "performance" "permanent" "pfile" "physical" "pipelined" "plan"
1119 "post_transaction" "pragma" "prebuilt" "preserve" "primary" "private"
1120 "private_sga" "privileges" "procedure" "profile" "protection" "public"
1121 "purge" "query" "quiesce" "quota" "range" "read" "reads" "rebuild"
1122 "records_per_block" "recover" "recovery" "recycle" "reduced" "ref"
1123 "references" "referencing" "refresh" "register" "reject" "relational"
1124 "rely" "rename" "reset" "resetlogs" "resize" "resolve" "resolver"
1125 "resource" "restrict" "restrict_references" "restricted" "result"
1126 "resumable" "resume" "retention" "return" "returning" "reuse"
1127 "reverse" "revoke" "rewrite" "right" "rnds" "rnps" "role" "roles"
1128 "rollback" "rollup" "row" "rowdependencies" "rownum" "rows" "sample"
1129 "savepoint" "scan" "schema" "scn" "scope" "segment" "select"
1130 "selectivity" "self" "sequence" "serializable" "session"
1131 "sessions_per_user" "set" "sets" "settings" "shared" "shared_pool"
1132 "shrink" "shutdown" "siblings" "sid" "single" "size" "skip" "some"
1133 "sort" "source" "space" "specification" "spfile" "split" "standby"
1134 "start" "statement_id" "static" "statistics" "stop" "storage" "store"
1135 "structure" "subpartition" "subpartitions" "substitutable"
1136 "successful" "supplemental" "suspend" "switch" "switchover" "synonym"
1137 "sys" "system" "table" "tables" "tablespace" "tempfile" "template"
1138 "temporary" "test" "than" "then" "thread" "through" "time_zone"
1139 "timeout" "to" "trace" "transaction" "trigger" "triggers" "truncate"
1140 "trust" "type" "types" "unarchived" "under" "under_path" "undo"
1141 "uniform" "union" "unique" "unlimited" "unlock" "unquiesce"
1142 "unrecoverable" "until" "unusable" "unused" "update" "upgrade" "usage"
1143 "use" "using" "validate" "validation" "value" "values" "variable"
1144 "varray" "version" "view" "wait" "when" "whenever" "where" "with"
1145 "without" "wnds" "wnps" "work" "write" "xmldata" "xmlschema" "xmltype"
1148 (oracle-types (sql-keywords-re
1149 "bfile" "blob" "byte" "char" "character" "clob" "date" "dec" "decimal"
1150 "double" "float" "int" "integer" "interval" "long" "national" "nchar"
1151 "nclob" "number" "numeric" "nvarchar2" "precision" "raw" "real"
1152 "rowid" "second" "smallint" "time" "timestamp" "urowid" "varchar"
1153 "varchar2" "varying" "year" "zone"
1156 (plsql-functions (sql-keywords-re
1157 "%bulk_rowcount" "%found" "%isopen" "%notfound" "%rowcount" "%rowtype"
1158 "%type" "extend" "prior"
1161 (plsql-keywords (sql-keywords-re
1162 "autonomous_transaction" "bulk" "char_base" "collect" "constant"
1163 "cursor" "declare" "do" "elsif" "exception_init" "execute" "exit"
1164 "extends" "false" "fetch" "forall" "goto" "hour" "if" "interface"
1165 "loop" "minute" "number_base" "ocirowid" "opaque" "others" "rowtype"
1166 "separate" "serially_reusable" "sql" "sqlcode" "sqlerrm" "subtype"
1167 "the" "timezone_abbr" "timezone_hour" "timezone_minute"
1168 "timezone_region" "true" "varrying" "while"
1171 (plsql-type (sql-keywords-re
1172 "binary_integer" "boolean" "naturaln" "pls_integer" "positive"
1173 "positiven" "record" "signtype" "string"
1176 (plsql-warning (sql-keywords-re
1177 "access_into_null" "case_not_found" "collection_is_null"
1178 "cursor_already_open" "dup_val_on_index" "invalid_cursor"
1179 "invalid_number" "login_denied" "no_data_found" "not_logged_on"
1180 "program_error" "rowtype_mismatch" "self_is_null" "storage_error"
1181 "subscript_beyond_count" "subscript_outside_limit" "sys_invalid_rowid"
1182 "timeout_on_resource" "too_many_rows" "value_error" "zero_divide"
1183 "exception" "notfound"
1186 (sqlplus-commands
1187 (eval-when-compile (concat "^\\(\\("
1188 (regexp-opt '(
1189 "@" "@@" "accept" "append" "archive" "attribute" "break"
1190 "btitle" "change" "clear" "column" "connect" "copy" "define"
1191 "del" "describe" "disconnect" "edit" "execute" "exit" "get" "help"
1192 "host" "input" "list" "password" "pause" "print" "prompt" "recover"
1193 "remark" "repfooter" "repheader" "run" "save" "show" "shutdown"
1194 "spool" "start" "startup" "store" "timing" "ttitle" "undefine"
1195 "variable" "whenever"
1197 ) t)
1199 "\\)\\|"
1200 "\\(compute\\s-+\\(avg\\|cou\\|min\\|max\\|num\\|sum\\|std\\|var\\)\\)\\|"
1201 "\\(set\\s-+\\(appi\\(nfo\\)?\\|array\\(size\\)?\\|"
1202 "auto\\(commit\\)?\\|autop\\(rint\\)?\\|autorecovery\\|"
1203 "autot\\(race\\)?\\|blo\\(ckterminator\\)?\\|cmds\\(ep\\)?\\|"
1204 "colsep\\|com\\(patibility\\)?\\|con\\(cat\\)?\\|"
1205 "copyc\\(ommit\\)?\\|copytypecheck\\|def\\(ine\\)?\\|"
1206 "describe\\|echo\\|editf\\(ile\\)?\\|emb\\(edded\\)?\\|"
1207 "esc\\(ape\\)?\\|feed\\(back\\)?\\|flagger\\|"
1208 "flu\\(sh\\)?\\|hea\\(ding\\)?\\|heads\\(ep\\)?\\|"
1209 "instance\\|lin\\(esize\\)?\\|lobof\\(fset\\)?\\|"
1210 "logsource\\|long\\|longc\\(hunksize\\)?\\|mark\\(up\\)?\\|"
1211 "newp\\(age\\)?\\|null\\|numf\\(ormat\\)?\\|"
1212 "num\\(width\\)?\\|pages\\(ize\\)?\\|pau\\(se\\)?\\|"
1213 "recsep\\|recsepchar\\|serverout\\(put\\)?\\|"
1214 "shift\\(inout\\)?\\|show\\(mode\\)?\\|"
1215 "sqlbl\\(anklines\\)?\\|sqlc\\(ase\\)?\\|"
1216 "sqlco\\(ntinue\\)?\\|sqln\\(umber\\)?\\|"
1217 "sqlpluscompat\\(ibility\\)?\\|sqlpre\\(fix\\)?\\|"
1218 "sqlp\\(rompt\\)?\\|sqlt\\(erminator\\)?\\|"
1219 "suf\\(fix\\)?\\|tab\\|term\\(out\\)?\\|ti\\(me\\)?\\|"
1220 "timi\\(ng\\)?\\|trim\\(out\\)?\\|trims\\(pool\\)?\\|"
1221 "und\\(erline\\)?\\|ver\\(ify\\)?\\|wra\\(p\\)?\\)\\)\\)"
1222 "\\b.*$"
1223 ))))
1225 `((,sqlplus-commands . font-lock-doc-face)
1226 (,oracle-functions . font-lock-builtin-face)
1227 (,oracle-keywords . font-lock-keyword-face)
1228 (,oracle-types . font-lock-type-face)
1229 (,plsql-functions . font-lock-builtin-face)
1230 (,plsql-keywords . font-lock-keyword-face)
1231 (,plsql-type . font-lock-type-face)
1232 (,plsql-warning . font-lock-warning-face)))
1234 "Oracle SQL keywords used by font-lock.
1236 This variable is used by `sql-mode' and `sql-interactive-mode'. The
1237 regular expressions are created during compilation by calling the
1238 function `regexp-opt'. Therefore, take a look at the source before
1239 you define your own sql-mode-oracle-font-lock-keywords. You may want
1240 to add functions and PL/SQL keywords.")
1242 (defvar sql-mode-postgres-font-lock-keywords
1243 (let ((pg-funcs (sql-keywords-re
1244 "abbrev" "abs" "acos" "age" "area" "ascii" "asin" "atab2" "atan"
1245 "atan2" "avg" "bit_length" "both" "broadcast" "btrim" "cbrt" "ceil"
1246 "center" "char_length" "chr" "coalesce" "col_description" "convert"
1247 "cos" "cot" "count" "current_database" "current_date" "current_schema"
1248 "current_schemas" "current_setting" "current_time" "current_timestamp"
1249 "current_user" "currval" "date_part" "date_trunc" "decode" "degrees"
1250 "diameter" "encode" "exp" "extract" "floor" "get_bit" "get_byte"
1251 "has_database_privilege" "has_function_privilege"
1252 "has_language_privilege" "has_schema_privilege" "has_table_privilege"
1253 "height" "host" "initcap" "isclosed" "isfinite" "isopen" "leading"
1254 "length" "ln" "localtime" "localtimestamp" "log" "lower" "lpad"
1255 "ltrim" "masklen" "max" "min" "mod" "netmask" "network" "nextval"
1256 "now" "npoints" "nullif" "obj_description" "octet_length" "overlay"
1257 "pclose" "pg_client_encoding" "pg_function_is_visible"
1258 "pg_get_constraintdef" "pg_get_indexdef" "pg_get_ruledef"
1259 "pg_get_userbyid" "pg_get_viewdef" "pg_opclass_is_visible"
1260 "pg_operator_is_visible" "pg_table_is_visible" "pg_type_is_visible"
1261 "pi" "popen" "position" "pow" "quote_ident" "quote_literal" "radians"
1262 "radius" "random" "repeat" "replace" "round" "rpad" "rtrim"
1263 "session_user" "set_bit" "set_byte" "set_config" "set_masklen"
1264 "setval" "sign" "sin" "split_part" "sqrt" "stddev" "strpos" "substr"
1265 "substring" "sum" "tan" "timeofday" "to_ascii" "to_char" "to_date"
1266 "to_hex" "to_number" "to_timestamp" "trailing" "translate" "trim"
1267 "trunc" "upper" "variance" "version" "width"
1270 (pg-reserved (sql-keywords-re
1271 "abort" "access" "add" "after" "aggregate" "alignment" "all" "alter"
1272 "analyze" "and" "any" "as" "asc" "assignment" "authorization"
1273 "backward" "basetype" "before" "begin" "between" "binary" "by" "cache"
1274 "called" "cascade" "case" "cast" "characteristics" "check"
1275 "checkpoint" "class" "close" "cluster" "column" "comment" "commit"
1276 "committed" "commutator" "constraint" "constraints" "conversion"
1277 "copy" "create" "createdb" "createuser" "cursor" "cycle" "database"
1278 "deallocate" "declare" "default" "deferrable" "deferred" "definer"
1279 "delete" "delimiter" "desc" "distinct" "do" "domain" "drop" "each"
1280 "element" "else" "encoding" "encrypted" "end" "escape" "except"
1281 "exclusive" "execute" "exists" "explain" "extended" "external" "false"
1282 "fetch" "finalfunc" "for" "force" "foreign" "forward" "freeze" "from"
1283 "full" "function" "grant" "group" "gtcmp" "handler" "hashes" "having"
1284 "immediate" "immutable" "implicit" "in" "increment" "index" "inherits"
1285 "initcond" "initially" "input" "insensitive" "insert" "instead"
1286 "internallength" "intersect" "into" "invoker" "is" "isnull"
1287 "isolation" "join" "key" "language" "leftarg" "level" "like" "limit"
1288 "listen" "load" "local" "location" "lock" "ltcmp" "main" "match"
1289 "maxvalue" "merges" "minvalue" "mode" "move" "natural" "negator"
1290 "next" "nocreatedb" "nocreateuser" "none" "not" "nothing" "notify"
1291 "notnull" "null" "of" "offset" "oids" "on" "only" "operator" "or"
1292 "order" "output" "owner" "partial" "passedbyvalue" "password" "plain"
1293 "prepare" "primary" "prior" "privileges" "procedural" "procedure"
1294 "public" "read" "recheck" "references" "reindex" "relative" "rename"
1295 "reset" "restrict" "returns" "revoke" "rightarg" "rollback" "row"
1296 "rule" "schema" "scroll" "security" "select" "sequence" "serializable"
1297 "session" "set" "sfunc" "share" "show" "similar" "some" "sort1"
1298 "sort2" "stable" "start" "statement" "statistics" "storage" "strict"
1299 "stype" "sysid" "table" "temp" "template" "temporary" "then" "to"
1300 "transaction" "trigger" "true" "truncate" "trusted" "type"
1301 "unencrypted" "union" "unique" "unknown" "unlisten" "until" "update"
1302 "usage" "user" "using" "vacuum" "valid" "validator" "values"
1303 "variable" "verbose" "view" "volatile" "when" "where" "with" "without"
1304 "work"
1307 (pg-types (sql-keywords-re
1308 "anyarray" "bigint" "bigserial" "bit" "boolean" "box" "bytea" "char"
1309 "character" "cidr" "circle" "cstring" "date" "decimal" "double"
1310 "float4" "float8" "inet" "int2" "int4" "int8" "integer" "internal"
1311 "interval" "language_handler" "line" "lseg" "macaddr" "money"
1312 "numeric" "oid" "opaque" "path" "point" "polygon" "precision" "real"
1313 "record" "regclass" "regoper" "regoperator" "regproc" "regprocedure"
1314 "regtype" "serial" "serial4" "serial8" "smallint" "text" "time"
1315 "timestamp" "varchar" "varying" "void" "zone"
1318 `((,pg-funcs . font-lock-builtin-face)
1319 (,pg-reserved . font-lock-keyword-face)
1320 (,pg-types . font-lock-type-face)))
1322 "Postgres SQL keywords used by font-lock.
1324 This variable is used by `sql-mode' and `sql-interactive-mode'. The
1325 regular expressions are created during compilation by calling the
1326 function `regexp-opt'. Therefore, take a look at the source before
1327 you define your own sql-mode-postgres-font-lock-keywords.")
1329 (defvar sql-mode-linter-font-lock-keywords
1330 (let ((linter-keywords (sql-keywords-re
1331 "autocommit" "autoinc" "autorowid" "cancel" "cascade" "channel"
1332 "committed" "count" "countblob" "cross" "current" "data" "database"
1333 "datafile" "datafiles" "datesplit" "dba" "dbname" "default" "deferred"
1334 "denied" "description" "device" "difference" "directory" "error"
1335 "escape" "euc" "exclusive" "external" "extfile" "false" "file"
1336 "filename" "filesize" "filetime" "filter" "findblob" "first" "foreign"
1337 "full" "fuzzy" "global" "granted" "ignore" "immediate" "increment"
1338 "indexes" "indexfile" "indexfiles" "indextime" "initial" "integrity"
1339 "internal" "key" "last_autoinc" "last_rowid" "limit" "linter"
1340 "linter_file_device" "linter_file_size" "linter_name_length" "ln"
1341 "local" "login" "maxisn" "maxrow" "maxrowid" "maxvalue" "message"
1342 "minvalue" "module" "names" "national" "natural" "new" "new_table"
1343 "no" "node" "noneuc" "nulliferror" "numbers" "off" "old" "old_table"
1344 "only" "operation" "optimistic" "option" "page" "partially" "password"
1345 "phrase" "plan" "precision" "primary" "priority" "privileges"
1346 "proc_info_size" "proc_par_name_len" "protocol" "quant" "range" "raw"
1347 "read" "record" "records" "references" "remote" "rename" "replication"
1348 "restart" "rewrite" "root" "row" "rule" "savepoint" "security"
1349 "sensitive" "sequence" "serializable" "server" "since" "size" "some"
1350 "startup" "statement" "station" "success" "sys_guid" "tables" "test"
1351 "timeout" "trace" "transaction" "translation" "trigger"
1352 "trigger_info_size" "true" "trunc" "uncommitted" "unicode" "unknown"
1353 "unlimited" "unlisted" "user" "utf8" "value" "varying" "volumes"
1354 "wait" "windows_code" "workspace" "write" "xml"
1357 (linter-reserved (sql-keywords-re
1358 "access" "action" "add" "address" "after" "all" "alter" "always" "and"
1359 "any" "append" "as" "asc" "ascic" "async" "at_begin" "at_end" "audit"
1360 "aud_obj_name_len" "backup" "base" "before" "between" "blobfile"
1361 "blobfiles" "blobpct" "brief" "browse" "by" "case" "cast" "check"
1362 "clear" "close" "column" "comment" "commit" "connect" "contains"
1363 "correct" "create" "delete" "desc" "disable" "disconnect" "distinct"
1364 "drop" "each" "ef" "else" "enable" "end" "event" "except" "exclude"
1365 "execute" "exists" "extract" "fetch" "finish" "for" "from" "get"
1366 "grant" "group" "having" "identified" "in" "index" "inner" "insert"
1367 "instead" "intersect" "into" "is" "isolation" "join" "left" "level"
1368 "like" "lock" "mode" "modify" "not" "nowait" "null" "of" "on" "open"
1369 "or" "order" "outer" "owner" "press" "prior" "procedure" "public"
1370 "purge" "rebuild" "resource" "restrict" "revoke" "right" "role"
1371 "rollback" "rownum" "select" "session" "set" "share" "shutdown"
1372 "start" "stop" "sync" "synchronize" "synonym" "sysdate" "table" "then"
1373 "to" "union" "unique" "unlock" "until" "update" "using" "values"
1374 "view" "when" "where" "with" "without"
1377 (linter-types (sql-keywords-re
1378 "bigint" "bitmap" "blob" "boolean" "char" "character" "date"
1379 "datetime" "dec" "decimal" "double" "float" "int" "integer" "nchar"
1380 "number" "numeric" "real" "smallint" "varbyte" "varchar" "byte"
1381 "cursor" "long"
1384 (linter-functions (sql-keywords-re
1385 "abs" "acos" "asin" "atan" "atan2" "avg" "ceil" "cos" "cosh" "divtime"
1386 "exp" "floor" "getbits" "getblob" "getbyte" "getlong" "getraw"
1387 "getstr" "gettext" "getword" "hextoraw" "lenblob" "length" "log"
1388 "lower" "lpad" "ltrim" "max" "min" "mod" "monthname" "nvl"
1389 "octet_length" "power" "rand" "rawtohex" "repeat_string"
1390 "right_substr" "round" "rpad" "rtrim" "sign" "sin" "sinh" "soundex"
1391 "sqrt" "sum" "tan" "tanh" "timeint_to_days" "to_char" "to_date"
1392 "to_gmtime" "to_localtime" "to_number" "trim" "upper" "decode"
1393 "substr" "substring" "chr" "dayname" "days" "greatest" "hex" "initcap"
1394 "instr" "least" "multime" "replace" "width"
1397 `((,linter-keywords . font-lock-keyword-face)
1398 (,linter-reserved . font-lock-keyword-face)
1399 (,linter-functions . font-lock-builtin-face)
1400 (,linter-types . font-lock-type-face)))
1402 "Linter SQL keywords used by font-lock.
1404 This variable is used by `sql-mode' and `sql-interactive-mode'. The
1405 regular expressions are created during compilation by calling the
1406 function `regexp-opt'.")
1408 (defvar sql-mode-ms-font-lock-keywords
1409 (let ((ms-reserved (sql-keywords-re
1410 "absolute" "add" "all" "alter" "and" "any" "as" "asc" "authorization"
1411 "avg" "backup" "begin" "between" "break" "browse" "bulk" "by"
1412 "cascade" "case" "check" "checkpoint" "close" "clustered" "coalesce"
1413 "column" "commit" "committed" "compute" "confirm" "constraint"
1414 "contains" "containstable" "continue" "controlrow" "convert" "count"
1415 "create" "cross" "current" "current_date" "current_time"
1416 "current_timestamp" "current_user" "database" "deallocate" "declare"
1417 "default" "delete" "deny" "desc" "disk" "distinct" "distributed"
1418 "double" "drop" "dummy" "dump" "else" "end" "errlvl" "errorexit"
1419 "escape" "except" "exec" "execute" "exists" "exit" "fetch" "file"
1420 "fillfactor" "first" "floppy" "for" "foreign" "freetext"
1421 "freetexttable" "from" "full" "goto" "grant" "group" "having"
1422 "holdlock" "identity" "identity_insert" "identitycol" "if" "in"
1423 "index" "inner" "insert" "intersect" "into" "is" "isolation" "join"
1424 "key" "kill" "last" "left" "level" "like" "lineno" "load" "max" "min"
1425 "mirrorexit" "national" "next" "nocheck" "nolock" "nonclustered" "not"
1426 "null" "nullif" "of" "off" "offsets" "on" "once" "only" "open"
1427 "opendatasource" "openquery" "openrowset" "option" "or" "order"
1428 "outer" "output" "over" "paglock" "percent" "perm" "permanent" "pipe"
1429 "plan" "precision" "prepare" "primary" "print" "prior" "privileges"
1430 "proc" "procedure" "processexit" "public" "raiserror" "read"
1431 "readcommitted" "readpast" "readtext" "readuncommitted" "reconfigure"
1432 "references" "relative" "repeatable" "repeatableread" "replication"
1433 "restore" "restrict" "return" "revoke" "right" "rollback" "rowcount"
1434 "rowguidcol" "rowlock" "rule" "save" "schema" "select" "serializable"
1435 "session_user" "set" "shutdown" "some" "statistics" "sum"
1436 "system_user" "table" "tablock" "tablockx" "tape" "temp" "temporary"
1437 "textsize" "then" "to" "top" "tran" "transaction" "trigger" "truncate"
1438 "tsequal" "uncommitted" "union" "unique" "update" "updatetext"
1439 "updlock" "use" "user" "values" "view" "waitfor" "when" "where"
1440 "while" "with" "work" "writetext" "collate" "function" "openxml"
1441 "returns"
1444 (ms-types (sql-keywords-re
1445 "binary" "bit" "char" "character" "cursor" "datetime" "dec" "decimal"
1446 "double" "float" "image" "int" "integer" "money" "national" "nchar"
1447 "ntext" "numeric" "numeric" "nvarchar" "precision" "real"
1448 "smalldatetime" "smallint" "smallmoney" "text" "timestamp" "tinyint"
1449 "uniqueidentifier" "varbinary" "varchar" "varying"
1452 (ms-vars "\\b@[a-zA-Z0-9_]*\\b")
1454 (ms-functions (sql-keywords-re
1455 "@@connections" "@@cpu_busy" "@@cursor_rows" "@@datefirst" "@@dbts"
1456 "@@error" "@@fetch_status" "@@identity" "@@idle" "@@io_busy"
1457 "@@langid" "@@language" "@@lock_timeout" "@@max_connections"
1458 "@@max_precision" "@@nestlevel" "@@options" "@@pack_received"
1459 "@@pack_sent" "@@packet_errors" "@@procid" "@@remserver" "@@rowcount"
1460 "@@servername" "@@servicename" "@@spid" "@@textsize" "@@timeticks"
1461 "@@total_errors" "@@total_read" "@@total_write" "@@trancount"
1462 "@@version" "abs" "acos" "and" "app_name" "ascii" "asin" "atan" "atn2"
1463 "avg" "case" "cast" "ceiling" "char" "charindex" "coalesce"
1464 "col_length" "col_name" "columnproperty" "containstable" "convert"
1465 "cos" "cot" "count" "current_timestamp" "current_user" "cursor_status"
1466 "databaseproperty" "datalength" "dateadd" "datediff" "datename"
1467 "datepart" "day" "db_id" "db_name" "degrees" "difference" "exp"
1468 "file_id" "file_name" "filegroup_id" "filegroup_name"
1469 "filegroupproperty" "fileproperty" "floor" "formatmessage"
1470 "freetexttable" "fulltextcatalogproperty" "fulltextserviceproperty"
1471 "getansinull" "getdate" "grouping" "host_id" "host_name" "ident_incr"
1472 "ident_seed" "identity" "index_col" "indexproperty" "is_member"
1473 "is_srvrolemember" "isdate" "isnull" "isnumeric" "left" "len" "log"
1474 "log10" "lower" "ltrim" "max" "min" "month" "nchar" "newid" "nullif"
1475 "object_id" "object_name" "objectproperty" "openquery" "openrowset"
1476 "parsename" "patindex" "patindex" "permissions" "pi" "power"
1477 "quotename" "radians" "rand" "replace" "replicate" "reverse" "right"
1478 "round" "rtrim" "session_user" "sign" "sin" "soundex" "space" "sqrt"
1479 "square" "stats_date" "stdev" "stdevp" "str" "stuff" "substring" "sum"
1480 "suser_id" "suser_name" "suser_sid" "suser_sname" "system_user" "tan"
1481 "textptr" "textvalid" "typeproperty" "unicode" "upper" "user"
1482 "user_id" "user_name" "var" "varp" "year"
1485 (ms-commands
1486 (eval-when-compile
1487 (concat "^\\(\\(set\\s-+\\("
1488 (regexp-opt '(
1489 "datefirst" "dateformat" "deadlock_priority" "lock_timeout"
1490 "concat_null_yields_null" "cursor_close_on_commit"
1491 "disable_def_cnst_chk" "fips_flagger" "identity_insert" "language"
1492 "offsets" "quoted_identifier" "arithabort" "arithignore" "fmtonly"
1493 "nocount" "noexec" "numeric_roundabort" "parseonly"
1494 "query_governor_cost_limit" "rowcount" "textsize" "ansi_defaults"
1495 "ansi_null_dflt_off" "ansi_null_dflt_on" "ansi_nulls" "ansi_padding"
1496 "ansi_warnings" "forceplan" "showplan_all" "showplan_text"
1497 "statistics" "implicit_transactions" "remote_proc_transactions"
1498 "transaction" "xact_abort"
1499 ) t)
1500 "\\)\\)\\|go\\s-*\\|use\\s-+\\|setuser\\s-+\\|dbcc\\s-+\\).*$"))))
1502 `((,ms-commands . font-lock-doc-face)
1503 (,ms-reserved . font-lock-keyword-face)
1504 (,ms-functions . font-lock-builtin-face)
1505 (,ms-vars . font-lock-variable-name-face)
1506 (,ms-types . font-lock-type-face)))
1508 "Microsoft SQLServer SQL keywords used by font-lock.
1510 This variable is used by `sql-mode' and `sql-interactive-mode'. The
1511 regular expressions are created during compilation by calling the
1512 function `regexp-opt'. Therefore, take a look at the source before
1513 you define your own sql-mode-ms-font-lock-keywords.")
1515 (defvar sql-mode-sybase-font-lock-keywords nil
1516 "Sybase SQL keywords used by font-lock.
1518 This variable is used by `sql-mode' and `sql-interactive-mode'. The
1519 regular expressions are created during compilation by calling the
1520 function `regexp-opt'. Therefore, take a look at the source before
1521 you define your own sql-mode-sybase-font-lock-keywords.")
1523 (defvar sql-mode-informix-font-lock-keywords nil
1524 "Informix SQL keywords used by font-lock.
1526 This variable is used by `sql-mode' and `sql-interactive-mode'. The
1527 regular expressions are created during compilation by calling the
1528 function `regexp-opt'. Therefore, take a look at the source before
1529 you define your own sql-mode-informix-font-lock-keywords.")
1531 (defvar sql-mode-interbase-font-lock-keywords nil
1532 "Interbase SQL keywords used by font-lock.
1534 This variable is used by `sql-mode' and `sql-interactive-mode'. The
1535 regular expressions are created during compilation by calling the
1536 function `regexp-opt'. Therefore, take a look at the source before
1537 you define your own sql-mode-interbase-font-lock-keywords.")
1539 (defvar sql-mode-ingres-font-lock-keywords nil
1540 "Ingres SQL keywords used by font-lock.
1542 This variable is used by `sql-mode' and `sql-interactive-mode'. The
1543 regular expressions are created during compilation by calling the
1544 function `regexp-opt'. Therefore, take a look at the source before
1545 you define your own sql-mode-interbase-font-lock-keywords.")
1547 (defvar sql-mode-solid-font-lock-keywords nil
1548 "Solid SQL keywords used by font-lock.
1550 This variable is used by `sql-mode' and `sql-interactive-mode'. The
1551 regular expressions are created during compilation by calling the
1552 function `regexp-opt'. Therefore, take a look at the source before
1553 you define your own sql-mode-solid-font-lock-keywords.")
1555 (defvar sql-mode-mysql-font-lock-keywords
1556 (let ((mysql-funcs (sql-keywords-re
1557 "ascii" "avg" "bdmpolyfromtext" "bdmpolyfromwkb" "bdpolyfromtext"
1558 "bdpolyfromwkb" "benchmark" "bin" "bit_and" "bit_length" "bit_or"
1559 "bit_xor" "both" "cast" "char_length" "character_length" "coalesce"
1560 "concat" "concat_ws" "connection_id" "conv" "convert" "count"
1561 "curdate" "current_date" "current_time" "current_timestamp" "curtime"
1562 "elt" "encrypt" "export_set" "field" "find_in_set" "found_rows" "from"
1563 "geomcollfromtext" "geomcollfromwkb" "geometrycollectionfromtext"
1564 "geometrycollectionfromwkb" "geometryfromtext" "geometryfromwkb"
1565 "geomfromtext" "geomfromwkb" "get_lock" "group_concat" "hex" "ifnull"
1566 "instr" "interval" "isnull" "last_insert_id" "lcase" "leading"
1567 "length" "linefromtext" "linefromwkb" "linestringfromtext"
1568 "linestringfromwkb" "load_file" "locate" "lower" "lpad" "ltrim"
1569 "make_set" "master_pos_wait" "max" "mid" "min" "mlinefromtext"
1570 "mlinefromwkb" "mpointfromtext" "mpointfromwkb" "mpolyfromtext"
1571 "mpolyfromwkb" "multilinestringfromtext" "multilinestringfromwkb"
1572 "multipointfromtext" "multipointfromwkb" "multipolygonfromtext"
1573 "multipolygonfromwkb" "now" "nullif" "oct" "octet_length" "ord"
1574 "pointfromtext" "pointfromwkb" "polyfromtext" "polyfromwkb"
1575 "polygonfromtext" "polygonfromwkb" "position" "quote" "rand"
1576 "release_lock" "repeat" "replace" "reverse" "rpad" "rtrim" "soundex"
1577 "space" "std" "stddev" "substring" "substring_index" "sum" "sysdate"
1578 "trailing" "trim" "ucase" "unix_timestamp" "upper" "user" "variance"
1581 (mysql-keywords (sql-keywords-re
1582 "action" "add" "after" "against" "all" "alter" "and" "as" "asc"
1583 "auto_increment" "avg_row_length" "bdb" "between" "by" "cascade"
1584 "case" "change" "character" "check" "checksum" "close" "collate"
1585 "collation" "column" "columns" "comment" "committed" "concurrent"
1586 "constraint" "create" "cross" "data" "database" "default"
1587 "delay_key_write" "delayed" "delete" "desc" "directory" "disable"
1588 "distinct" "distinctrow" "do" "drop" "dumpfile" "duplicate" "else"
1589 "enable" "enclosed" "end" "escaped" "exists" "fields" "first" "for"
1590 "force" "foreign" "from" "full" "fulltext" "global" "group" "handler"
1591 "having" "heap" "high_priority" "if" "ignore" "in" "index" "infile"
1592 "inner" "insert" "insert_method" "into" "is" "isam" "isolation" "join"
1593 "key" "keys" "last" "left" "level" "like" "limit" "lines" "load"
1594 "local" "lock" "low_priority" "match" "max_rows" "merge" "min_rows"
1595 "mode" "modify" "mrg_myisam" "myisam" "natural" "next" "no" "not"
1596 "null" "offset" "oj" "on" "open" "optionally" "or" "order" "outer"
1597 "outfile" "pack_keys" "partial" "password" "prev" "primary"
1598 "procedure" "quick" "raid0" "raid_type" "read" "references" "rename"
1599 "repeatable" "restrict" "right" "rollback" "rollup" "row_format"
1600 "savepoint" "select" "separator" "serializable" "session" "set"
1601 "share" "show" "sql_big_result" "sql_buffer_result" "sql_cache"
1602 "sql_calc_found_rows" "sql_no_cache" "sql_small_result" "starting"
1603 "straight_join" "striped" "table" "tables" "temporary" "terminated"
1604 "then" "to" "transaction" "truncate" "type" "uncommitted" "union"
1605 "unique" "unlock" "update" "use" "using" "values" "when" "where"
1606 "with" "write" "xor"
1609 (mysql-types (sql-keywords-re
1610 "bigint" "binary" "bit" "blob" "bool" "boolean" "char" "curve" "date"
1611 "datetime" "dec" "decimal" "double" "enum" "fixed" "float" "geometry"
1612 "geometrycollection" "int" "integer" "line" "linearring" "linestring"
1613 "longblob" "longtext" "mediumblob" "mediumint" "mediumtext"
1614 "multicurve" "multilinestring" "multipoint" "multipolygon"
1615 "multisurface" "national" "numeric" "point" "polygon" "precision"
1616 "real" "smallint" "surface" "text" "time" "timestamp" "tinyblob"
1617 "tinyint" "tinytext" "unsigned" "varchar" "year" "year2" "year4"
1618 "zerofill"
1621 `((,mysql-funcs . font-lock-builtin-face)
1622 (,mysql-keywords . font-lock-keyword-face)
1623 (,mysql-types . font-lock-type-face)))
1625 "MySQL SQL keywords used by font-lock.
1627 This variable is used by `sql-mode' and `sql-interactive-mode'. The
1628 regular expressions are created during compilation by calling the
1629 function `regexp-opt'. Therefore, take a look at the source before
1630 you define your own sql-mode-mysql-font-lock-keywords.")
1632 (defvar sql-mode-sqlite-font-lock-keywords nil
1633 "SQLite SQL keywords used by font-lock.
1635 This variable is used by `sql-mode' and `sql-interactive-mode'. The
1636 regular expressions are created during compilation by calling the
1637 function `regexp-opt'. Therefore, take a look at the source before
1638 you define your own sql-mode-sqlite-font-lock-keywords.")
1640 (defvar sql-mode-db2-font-lock-keywords nil
1641 "DB2 SQL keywords used by font-lock.
1643 This variable is used by `sql-mode' and `sql-interactive-mode'. The
1644 regular expressions are created during compilation by calling the
1645 function `regexp-opt'. Therefore, take a look at the source before
1646 you define your own sql-mode-db2-font-lock-keywords.")
1648 (defvar sql-mode-font-lock-keywords nil
1649 "SQL keywords used by font-lock.
1651 Setting this variable directly no longer has any affect. Use
1652 `sql-product' and `sql-add-product-keywords' to control the
1653 highlighting rules in sql-mode.")
1657 ;;; SQL Product support functions
1659 (defun sql-product-feature (feature &optional product)
1660 "Lookup `feature' needed to support the current SQL product.
1662 See \[sql-product-alist] for a list of products and supported features."
1663 (plist-get
1664 (cdr (assoc (or product sql-product)
1665 sql-product-alist))
1666 feature))
1668 (defun sql-product-font-lock (keywords-only imenu)
1669 "Sets `font-lock-defaults' and `font-lock-keywords' based on
1670 the product-specific keywords and syntax-alists defined in
1671 `sql-product-alist'."
1672 (let
1673 ;; Get the product-specific syntax-alist.
1674 ((syntax-alist
1675 (append
1676 (sql-product-feature :syntax-alist)
1677 '((?_ . "w") (?. . "w")))))
1679 ;; Get the product-specific keywords.
1680 (setq sql-mode-font-lock-keywords
1681 (append
1682 (unless (eq sql-product 'ansi)
1683 (eval (sql-product-feature :font-lock)))
1684 ;; Always highlight ANSI keywords
1685 (eval (sql-product-feature :font-lock 'ansi))
1686 ;; Fontify object names in CREATE, DROP and ALTER DDL
1687 ;; statements
1688 (list sql-mode-font-lock-object-name)))
1690 ;; Setup font-lock. Force re-parsing of `font-lock-defaults'.
1691 (set (make-local-variable 'font-lock-set-defaults) nil)
1692 (setq font-lock-defaults (list 'sql-mode-font-lock-keywords
1693 keywords-only t syntax-alist))
1695 ;; Force font lock to reinitialize if it is already on
1696 ;; Otherwise, we can wait until it can be started.
1697 (when (and (fboundp 'font-lock-mode)
1698 font-lock-mode)
1699 (font-lock-mode-internal nil)
1700 (font-lock-mode-internal t))
1702 (add-hook 'font-lock-mode-hook
1703 (lambda ()
1704 ;; Provide defaults for new font-lock faces.
1705 (defvar font-lock-builtin-face
1706 (if (boundp 'font-lock-preprocessor-face)
1707 font-lock-preprocessor-face
1708 font-lock-keyword-face))
1709 (defvar font-lock-doc-face font-lock-string-face))
1710 nil t)
1712 ;; Setup imenu; it needs the same syntax-alist.
1713 (when imenu
1714 (setq imenu-syntax-alist syntax-alist))))
1716 ;;;###autoload
1717 (defun sql-add-product-keywords (product keywords &optional append)
1718 "Add highlighting KEYWORDS for SQL PRODUCT.
1720 PRODUCT should be a symbol, the name of a sql product, such as
1721 `oracle'. KEYWORDS should be a list; see the variable
1722 `font-lock-keywords'. By default they are added at the beginning
1723 of the current highlighting list. If optional argument APPEND is
1724 `set', they are used to replace the current highlighting list.
1725 If APPEND is any other non-nil value, they are added at the end
1726 of the current highlighting list.
1728 For example:
1730 (sql-add-product-keywords 'ms
1731 '((\"\\\\b\\\\w+_t\\\\b\" . font-lock-type-face)))
1733 adds a fontification pattern to fontify identifiers ending in
1734 `_t' as data types."
1736 (let ((font-lock (sql-product-feature :font-lock product))
1737 old)
1738 (setq old (eval font-lock))
1739 (set font-lock
1740 (if (eq append 'set)
1741 keywords
1742 (if append
1743 (append old keywords)
1744 (append keywords old))))))
1748 ;;; Functions to switch highlighting
1750 (defun sql-highlight-product ()
1751 "Turns on the appropriate font highlighting for the SQL product
1752 selected."
1754 (when (eq major-mode 'sql-mode)
1755 ;; Setup font-lock
1756 (sql-product-font-lock nil t)
1758 ;; Set the mode name to include the product.
1759 (setq mode-name (concat "SQL[" (prin1-to-string sql-product) "]"))))
1761 (defun sql-set-product (product)
1762 "Set `sql-product' to product and enable appropriate
1763 highlighting."
1764 (interactive "SEnter SQL product: ")
1765 (when (not (assoc product sql-product-alist))
1766 (error "SQL product %s is not supported; treated as ANSI" product)
1767 (setq product 'ansi))
1769 ;; Save product setting and fontify.
1770 (setq sql-product product)
1771 (sql-highlight-product))
1773 (defun sql-highlight-oracle-keywords ()
1774 "Highlight Oracle keywords."
1775 (interactive)
1776 (sql-set-product 'oracle))
1778 (defun sql-highlight-postgres-keywords ()
1779 "Highlight Postgres keywords."
1780 (interactive)
1781 (sql-set-product 'postgres))
1783 (defun sql-highlight-linter-keywords ()
1784 "Highlight LINTER keywords."
1785 (interactive)
1786 (sql-set-product 'linter))
1788 (defun sql-highlight-ms-keywords ()
1789 "Highlight Microsoft SQLServer keywords."
1790 (interactive)
1791 (sql-set-product 'ms))
1793 (defun sql-highlight-ansi-keywords ()
1794 "Highlight ANSI SQL keywords."
1795 (interactive)
1796 (sql-set-product 'ansi))
1798 (defun sql-highlight-sybase-keywords ()
1799 "Highlight Sybase SQL keywords."
1800 (interactive)
1801 (sql-set-product 'sybase))
1803 (defun sql-highlight-informix-keywords ()
1804 "Highlight Informix SQL keywords."
1805 (interactive)
1806 (sql-set-product 'informix))
1808 (defun sql-highlight-interbase-keywords ()
1809 "Highlight Interbase SQL keywords."
1810 (interactive)
1811 (sql-set-product 'interbase))
1813 (defun sql-highlight-ingres-keywords ()
1814 "Highlight Ingres SQL keywords."
1815 (interactive)
1816 (sql-set-product 'ingres))
1818 (defun sql-highlight-solid-keywords ()
1819 "Highlight Solid SQL keywords."
1820 (interactive)
1821 (sql-set-product 'solid))
1823 (defun sql-highlight-mysql-keywords ()
1824 "Highlight MySQL SQL keywords."
1825 (interactive)
1826 (sql-set-product 'mysql))
1828 (defun sql-highlight-sqlite-keywords ()
1829 "Highlight SQLite SQL keywords."
1830 (interactive)
1831 (sql-set-product 'sqlite))
1833 (defun sql-highlight-db2-keywords ()
1834 "Highlight DB2 SQL keywords."
1835 (interactive)
1836 (sql-set-product 'db2))
1840 ;;; Compatibility functions
1842 (if (not (fboundp 'comint-line-beginning-position))
1843 ;; comint-line-beginning-position is defined in Emacs 21
1844 (defun comint-line-beginning-position ()
1845 "Returns the buffer position of the beginning of the line, after any prompt.
1846 The prompt is assumed to be any text at the beginning of the line matching
1847 the regular expression `comint-prompt-regexp', a buffer local variable."
1848 (save-excursion (comint-bol nil) (point))))
1852 ;;; Small functions
1854 (defun sql-magic-go (arg)
1855 "Insert \"o\" and call `comint-send-input'.
1856 `sql-electric-stuff' must be the symbol `go'."
1857 (interactive "P")
1858 (self-insert-command (prefix-numeric-value arg))
1859 (if (and (equal sql-electric-stuff 'go)
1860 (save-excursion
1861 (comint-bol nil)
1862 (looking-at "go\\b")))
1863 (comint-send-input)))
1865 (defun sql-magic-semicolon (arg)
1866 "Insert semicolon and call `comint-send-input'.
1867 `sql-electric-stuff' must be the symbol `semicolon'."
1868 (interactive "P")
1869 (self-insert-command (prefix-numeric-value arg))
1870 (if (equal sql-electric-stuff 'semicolon)
1871 (comint-send-input)))
1873 (defun sql-accumulate-and-indent ()
1874 "Continue SQL statement on the next line."
1875 (interactive)
1876 (if (fboundp 'comint-accumulate)
1877 (comint-accumulate)
1878 (newline))
1879 (indent-according-to-mode))
1881 ;;;###autoload
1882 (defun sql-help ()
1883 "Show short help for the SQL modes.
1885 Use an entry function to open an interactive SQL buffer. This buffer is
1886 usually named `*SQL*'. The name of the major mode is SQLi.
1888 Use the following commands to start a specific SQL interpreter:
1890 PostGres: \\[sql-postgres]
1891 MySQL: \\[sql-mysql]
1892 SQLite: \\[sql-sqlite]
1894 Other non-free SQL implementations are also supported:
1896 Solid: \\[sql-solid]
1897 Oracle: \\[sql-oracle]
1898 Informix: \\[sql-informix]
1899 Sybase: \\[sql-sybase]
1900 Ingres: \\[sql-ingres]
1901 Microsoft: \\[sql-ms]
1902 DB2: \\[sql-db2]
1903 Interbase: \\[sql-interbase]
1904 Linter: \\[sql-linter]
1906 But we urge you to choose a free implementation instead of these.
1908 Once you have the SQLi buffer, you can enter SQL statements in the
1909 buffer. The output generated is appended to the buffer and a new prompt
1910 is generated. See the In/Out menu in the SQLi buffer for some functions
1911 that help you navigate through the buffer, the input history, etc.
1913 If you have a really complex SQL statement or if you are writing a
1914 procedure, you can do this in a separate buffer. Put the new buffer in
1915 `sql-mode' by calling \\[sql-mode]. The name of this buffer can be
1916 anything. The name of the major mode is SQL.
1918 In this SQL buffer (SQL mode), you can send the region or the entire
1919 buffer to the interactive SQL buffer (SQLi mode). The results are
1920 appended to the SQLi buffer without disturbing your SQL buffer."
1921 (interactive)
1922 (describe-function 'sql-help))
1924 (defun sql-read-passwd (prompt &optional default)
1925 "Read a password using PROMPT. Optional DEFAULT is password to start with."
1926 (read-passwd prompt nil default))
1928 (defun sql-get-login (&rest what)
1929 "Get username, password and database from the user.
1931 The variables `sql-user', `sql-password', `sql-server', and
1932 `sql-database' can be customized. They are used as the default values.
1933 Usernames, servers and databases are stored in `sql-user-history',
1934 `sql-server-history' and `database-history'. Passwords are not stored
1935 in a history.
1937 Parameter WHAT is a list of the arguments passed to this function.
1938 The function asks for the username if WHAT contains symbol `user', for
1939 the password if it contains symbol `password', for the server if it
1940 contains symbol `server', and for the database if it contains symbol
1941 `database'. The members of WHAT are processed in the order in which
1942 they are provided.
1944 In order to ask the user for username, password and database, call the
1945 function like this: (sql-get-login 'user 'password 'database)."
1946 (interactive)
1947 (while what
1948 (cond
1949 ((eq (car what) 'user) ; user
1950 (setq sql-user
1951 (read-from-minibuffer "User: " sql-user nil nil
1952 sql-user-history)))
1953 ((eq (car what) 'password) ; password
1954 (setq sql-password
1955 (sql-read-passwd "Password: " sql-password)))
1956 ((eq (car what) 'server) ; server
1957 (setq sql-server
1958 (read-from-minibuffer "Server: " sql-server nil nil
1959 sql-server-history)))
1960 ((eq (car what) 'database) ; database
1961 (setq sql-database
1962 (read-from-minibuffer "Database: " sql-database nil nil
1963 sql-database-history))))
1964 (setq what (cdr what))))
1966 (defun sql-find-sqli-buffer ()
1967 "Return the current default SQLi buffer or nil.
1968 In order to qualify, the SQLi buffer must be alive,
1969 be in `sql-interactive-mode' and have a process."
1970 (let ((default-buffer (default-value 'sql-buffer)))
1971 (if (and (buffer-live-p default-buffer)
1972 (get-buffer-process default-buffer))
1973 default-buffer
1974 (save-excursion
1975 (let ((buflist (buffer-list))
1976 (found))
1977 (while (not (or (null buflist)
1978 found))
1979 (let ((candidate (car buflist)))
1980 (set-buffer candidate)
1981 (if (and (equal major-mode 'sql-interactive-mode)
1982 (get-buffer-process candidate))
1983 (setq found candidate))
1984 (setq buflist (cdr buflist))))
1985 found)))))
1987 (defun sql-set-sqli-buffer-generally ()
1988 "Set SQLi buffer for all SQL buffers that have none.
1989 This function checks all SQL buffers for their SQLi buffer. If their
1990 SQLi buffer is nonexistent or has no process, it is set to the current
1991 default SQLi buffer. The current default SQLi buffer is determined
1992 using `sql-find-sqli-buffer'. If `sql-buffer' is set,
1993 `sql-set-sqli-hook' is run."
1994 (interactive)
1995 (save-excursion
1996 (let ((buflist (buffer-list))
1997 (default-sqli-buffer (sql-find-sqli-buffer)))
1998 (setq-default sql-buffer default-sqli-buffer)
1999 (while (not (null buflist))
2000 (let ((candidate (car buflist)))
2001 (set-buffer candidate)
2002 (if (and (equal major-mode 'sql-mode)
2003 (not (buffer-live-p sql-buffer)))
2004 (progn
2005 (setq sql-buffer default-sqli-buffer)
2006 (run-hooks 'sql-set-sqli-hook))))
2007 (setq buflist (cdr buflist))))))
2009 (defun sql-set-sqli-buffer ()
2010 "Set the SQLi buffer SQL strings are sent to.
2012 Call this function in a SQL buffer in order to set the SQLi buffer SQL
2013 strings are sent to. Calling this function sets `sql-buffer' and runs
2014 `sql-set-sqli-hook'.
2016 If you call it from a SQL buffer, this sets the local copy of
2017 `sql-buffer'.
2019 If you call it from anywhere else, it sets the global copy of
2020 `sql-buffer'."
2021 (interactive)
2022 (let ((default-buffer (sql-find-sqli-buffer)))
2023 (if (null default-buffer)
2024 (error "There is no suitable SQLi buffer"))
2025 (let ((new-buffer
2026 (get-buffer
2027 (read-buffer "New SQLi buffer: " default-buffer t))))
2028 (if (null (get-buffer-process new-buffer))
2029 (error "Buffer %s has no process" (buffer-name new-buffer)))
2030 (if (null (save-excursion
2031 (set-buffer new-buffer)
2032 (equal major-mode 'sql-interactive-mode)))
2033 (error "Buffer %s is no SQLi buffer" (buffer-name new-buffer)))
2034 (if new-buffer
2035 (progn
2036 (setq sql-buffer new-buffer)
2037 (run-hooks 'sql-set-sqli-hook))))))
2039 (defun sql-show-sqli-buffer ()
2040 "Show the name of current SQLi buffer.
2042 This is the buffer SQL strings are sent to. It is stored in the
2043 variable `sql-buffer'. See `sql-help' on how to create such a buffer."
2044 (interactive)
2045 (if (null (buffer-live-p sql-buffer))
2046 (message "%s has no SQLi buffer set." (buffer-name (current-buffer)))
2047 (if (null (get-buffer-process sql-buffer))
2048 (message "Buffer %s has no process." (buffer-name sql-buffer))
2049 (message "Current SQLi buffer is %s." (buffer-name sql-buffer)))))
2051 (defun sql-make-alternate-buffer-name ()
2052 "Return a string that can be used to rename a SQLi buffer.
2054 This is used to set `sql-alternate-buffer-name' within
2055 `sql-interactive-mode'."
2056 (concat (if (string= "" sql-user)
2057 (if (string= "" (user-login-name))
2059 (concat (user-login-name) "/"))
2060 (concat sql-user "/"))
2061 (if (string= "" sql-database)
2062 (if (string= "" sql-server)
2063 (system-name)
2064 sql-server)
2065 sql-database)))
2067 (defun sql-rename-buffer ()
2068 "Renames a SQLi buffer."
2069 (interactive)
2070 (rename-buffer (format "*SQL: %s*" sql-alternate-buffer-name) t))
2072 (defun sql-copy-column ()
2073 "Copy current column to the end of buffer.
2074 Inserts SELECT or commas if appropriate."
2075 (interactive)
2076 (let ((column))
2077 (save-excursion
2078 (setq column (buffer-substring
2079 (progn (forward-char 1) (backward-sexp 1) (point))
2080 (progn (forward-sexp 1) (point))))
2081 (goto-char (point-max))
2082 (let ((bol (comint-line-beginning-position)))
2083 (cond
2084 ;; if empty command line, insert SELECT
2085 ((= bol (point))
2086 (insert "SELECT "))
2087 ;; else if appending to INTO .* (, SELECT or ORDER BY, insert a comma
2088 ((save-excursion
2089 (re-search-backward "\\b\\(\\(into\\s-+\\S-+\\s-+(\\)\\|select\\|order by\\) .+"
2090 bol t))
2091 (insert ", "))
2092 ;; else insert a space
2094 (if (eq (preceding-char) ?\s)
2096 (insert " ")))))
2097 ;; in any case, insert the column
2098 (insert column)
2099 (message "%s" column))))
2101 ;; On NT, SQL*Plus for Oracle turns on full buffering for stdout if it
2102 ;; is not attached to a character device; therefore placeholder
2103 ;; replacement by SQL*Plus is fully buffered. The workaround lets
2104 ;; Emacs query for the placeholders.
2106 (defvar sql-placeholder-history nil
2107 "History of placeholder values used.")
2109 (defun sql-query-placeholders-and-send (proc string)
2110 "Send to PROC input STRING, maybe replacing placeholders.
2111 Placeholders are words starting with and ampersand like &this.
2112 This function is used for `comint-input-sender' if using `sql-oracle' on NT."
2113 (while (string-match "&\\(\\sw+\\)" string)
2114 (setq string (replace-match
2115 (read-from-minibuffer
2116 (format "Enter value for %s: " (match-string 1 string))
2117 nil nil nil sql-placeholder-history)
2118 t t string)))
2119 (comint-send-string proc string)
2120 (if comint-input-sender-no-newline
2121 (if (not (string-equal string ""))
2122 (process-send-eof))
2123 (comint-send-string proc "\n")))
2125 ;; Using DB2 interactively, newlines must be escaped with " \".
2126 ;; The space before the backslash is relevant.
2127 (defun sql-escape-newlines-and-send (proc string)
2128 "Send to PROC input STRING, escaping newlines if necessary.
2129 Every newline in STRING will be preceded with a space and a backslash."
2130 (let ((result "") (start 0) mb me)
2131 (while (string-match "\n" string start)
2132 (setq mb (match-beginning 0)
2133 me (match-end 0))
2134 (if (and (> mb 1)
2135 (string-equal " \\" (substring string (- mb 2) mb)))
2136 (setq result (concat result (substring string start me)))
2137 (setq result (concat result (substring string start mb) " \\\n")))
2138 (setq start me))
2139 (setq result (concat result (substring string start)))
2140 (comint-send-string proc result)
2141 (if comint-input-sender-no-newline
2142 (if (not (string-equal string ""))
2143 (process-send-eof))
2144 (comint-send-string proc "\n"))))
2148 ;;; Sending the region to the SQLi buffer.
2150 (defun sql-send-region (start end)
2151 "Send a region to the SQL process."
2152 (interactive "r")
2153 (if (buffer-live-p sql-buffer)
2154 (save-excursion
2155 (comint-send-region sql-buffer start end)
2156 (if (string-match "\n$" (buffer-substring start end))
2158 (comint-send-string sql-buffer "\n"))
2159 (message "Sent string to buffer %s." (buffer-name sql-buffer))
2160 (if sql-pop-to-buffer-after-send-region
2161 (pop-to-buffer sql-buffer)
2162 (display-buffer sql-buffer)))
2163 (message "No SQL process started.")))
2165 (defun sql-send-paragraph ()
2166 "Send the current paragraph to the SQL process."
2167 (interactive)
2168 (let ((start (save-excursion
2169 (backward-paragraph)
2170 (point)))
2171 (end (save-excursion
2172 (forward-paragraph)
2173 (point))))
2174 (sql-send-region start end)))
2176 (defun sql-send-buffer ()
2177 "Send the buffer contents to the SQL process."
2178 (interactive)
2179 (sql-send-region (point-min) (point-max)))
2181 (defun sql-send-string (str)
2182 "Send a string to the SQL process."
2183 (interactive "sSQL Text: ")
2184 (if (buffer-live-p sql-buffer)
2185 (save-excursion
2186 (comint-send-string sql-buffer str)
2187 (comint-send-string sql-buffer "\n")
2188 (message "Sent string to buffer %s." (buffer-name sql-buffer))
2189 (if sql-pop-to-buffer-after-send-region
2190 (pop-to-buffer sql-buffer)
2191 (display-buffer sql-buffer)))
2192 (message "No SQL process started.")))
2194 (defun sql-toggle-pop-to-buffer-after-send-region (&optional value)
2195 "Toggle `sql-pop-to-buffer-after-send-region'.
2197 If given the optional parameter VALUE, sets
2198 sql-toggle-pop-to-buffer-after-send-region to VALUE."
2199 (interactive "P")
2200 (if value
2201 (setq sql-pop-to-buffer-after-send-region value)
2202 (setq sql-pop-to-buffer-after-send-region
2203 (null sql-pop-to-buffer-after-send-region ))))
2207 ;;; SQL mode -- uses SQL interactive mode
2209 ;;;###autoload
2210 (defun sql-mode ()
2211 "Major mode to edit SQL.
2213 You can send SQL statements to the SQLi buffer using
2214 \\[sql-send-region]. Such a buffer must exist before you can do this.
2215 See `sql-help' on how to create SQLi buffers.
2217 \\{sql-mode-map}
2218 Customization: Entry to this mode runs the `sql-mode-hook'.
2220 When you put a buffer in SQL mode, the buffer stores the last SQLi
2221 buffer created as its destination in the variable `sql-buffer'. This
2222 will be the buffer \\[sql-send-region] sends the region to. If this
2223 SQLi buffer is killed, \\[sql-send-region] is no longer able to
2224 determine where the strings should be sent to. You can set the
2225 value of `sql-buffer' using \\[sql-set-sqli-buffer].
2227 For information on how to create multiple SQLi buffers, see
2228 `sql-interactive-mode'.
2230 Note that SQL doesn't have an escape character unless you specify
2231 one. If you specify backslash as escape character in SQL,
2232 you must tell Emacs. Here's how to do that in your `~/.emacs' file:
2234 \(add-hook 'sql-mode-hook
2235 (lambda ()
2236 (modify-syntax-entry ?\\\\ \".\" sql-mode-syntax-table)))"
2237 (interactive)
2238 (kill-all-local-variables)
2239 (setq major-mode 'sql-mode)
2240 (setq mode-name "SQL")
2241 (use-local-map sql-mode-map)
2242 (if sql-mode-menu
2243 (easy-menu-add sql-mode-menu)); XEmacs
2244 (set-syntax-table sql-mode-syntax-table)
2245 (make-local-variable 'font-lock-defaults)
2246 (make-local-variable 'sql-mode-font-lock-keywords)
2247 (make-local-variable 'comment-start)
2248 (setq comment-start "--")
2249 ;; Make each buffer in sql-mode remember the "current" SQLi buffer.
2250 (make-local-variable 'sql-buffer)
2251 ;; Add imenu support for sql-mode. Note that imenu-generic-expression
2252 ;; is buffer-local, so we don't need a local-variable for it. SQL is
2253 ;; case-insensitive, that's why we have to set imenu-case-fold-search.
2254 (setq imenu-generic-expression sql-imenu-generic-expression
2255 imenu-case-fold-search t)
2256 ;; Make `sql-send-paragraph' work on paragraphs that contain indented
2257 ;; lines.
2258 (make-local-variable 'paragraph-separate)
2259 (make-local-variable 'paragraph-start)
2260 (setq paragraph-separate "[\f]*$"
2261 paragraph-start "[\n\f]")
2262 ;; Abbrevs
2263 (setq local-abbrev-table sql-mode-abbrev-table)
2264 (setq abbrev-all-caps 1)
2265 ;; Run hook
2266 (run-mode-hooks 'sql-mode-hook)
2267 ;; Catch changes to sql-product and highlight accordingly
2268 (sql-highlight-product)
2269 (add-hook 'hack-local-variables-hook 'sql-highlight-product t t))
2273 ;;; SQL interactive mode
2275 (put 'sql-interactive-mode 'mode-class 'special)
2277 (defun sql-interactive-mode ()
2278 "Major mode to use a SQL interpreter interactively.
2280 Do not call this function by yourself. The environment must be
2281 initialized by an entry function specific for the SQL interpreter. See
2282 `sql-help' for a list of available entry functions.
2284 \\[comint-send-input] after the end of the process' output sends the
2285 text from the end of process to the end of the current line.
2286 \\[comint-send-input] before end of process output copies the current
2287 line minus the prompt to the end of the buffer and sends it.
2288 \\[comint-copy-old-input] just copies the current line.
2289 Use \\[sql-accumulate-and-indent] to enter multi-line statements.
2291 If you want to make multiple SQL buffers, rename the `*SQL*' buffer
2292 using \\[rename-buffer] or \\[rename-uniquely] and start a new process.
2293 See `sql-help' for a list of available entry functions. The last buffer
2294 created by such an entry function is the current SQLi buffer. SQL
2295 buffers will send strings to the SQLi buffer current at the time of
2296 their creation. See `sql-mode' for details.
2298 Sample session using two connections:
2300 1. Create first SQLi buffer by calling an entry function.
2301 2. Rename buffer \"*SQL*\" to \"*Connection 1*\".
2302 3. Create a SQL buffer \"test1.sql\".
2303 4. Create second SQLi buffer by calling an entry function.
2304 5. Rename buffer \"*SQL*\" to \"*Connection 2*\".
2305 6. Create a SQL buffer \"test2.sql\".
2307 Now \\[sql-send-region] in buffer \"test1.sql\" will send the region to
2308 buffer \"*Connection 1*\", \\[sql-send-region] in buffer \"test2.sql\"
2309 will send the region to buffer \"*Connection 2*\".
2311 If you accidentally suspend your process, use \\[comint-continue-subjob]
2312 to continue it. On some operating systems, this will not work because
2313 the signals are not supported.
2315 \\{sql-interactive-mode-map}
2316 Customization: Entry to this mode runs the hooks on `comint-mode-hook'
2317 and `sql-interactive-mode-hook' (in that order). Before each input, the
2318 hooks on `comint-input-filter-functions' are run. After each SQL
2319 interpreter output, the hooks on `comint-output-filter-functions' are
2320 run.
2322 Variable `sql-input-ring-file-name' controls the initialization of the
2323 input ring history.
2325 Variables `comint-output-filter-functions', a hook, and
2326 `comint-scroll-to-bottom-on-input' and
2327 `comint-scroll-to-bottom-on-output' control whether input and output
2328 cause the window to scroll to the end of the buffer.
2330 If you want to make SQL buffers limited in length, add the function
2331 `comint-truncate-buffer' to `comint-output-filter-functions'.
2333 Here is an example for your .emacs file. It keeps the SQLi buffer a
2334 certain length.
2336 \(add-hook 'sql-interactive-mode-hook
2337 \(function (lambda ()
2338 \(setq comint-output-filter-functions 'comint-truncate-buffer))))
2340 Here is another example. It will always put point back to the statement
2341 you entered, right above the output it created.
2343 \(setq comint-output-filter-functions
2344 \(function (lambda (STR) (comint-show-output))))"
2345 (delay-mode-hooks (comint-mode))
2346 ;; Get the `sql-product' for this interactive session.
2347 (set (make-local-variable 'sql-product)
2348 (or sql-interactive-product
2349 sql-product))
2350 ;; Setup the mode.
2351 (setq major-mode 'sql-interactive-mode)
2352 (setq mode-name (concat "SQLi[" (prin1-to-string sql-product) "]"))
2353 (use-local-map sql-interactive-mode-map)
2354 (if sql-interactive-mode-menu
2355 (easy-menu-add sql-interactive-mode-menu)) ; XEmacs
2356 (set-syntax-table sql-mode-syntax-table)
2357 (make-local-variable 'sql-mode-font-lock-keywords)
2358 (make-local-variable 'font-lock-defaults)
2359 ;; Note that making KEYWORDS-ONLY nil will cause havoc if you try
2360 ;; SELECT 'x' FROM DUAL with SQL*Plus, because the title of the column
2361 ;; will have just one quote. Therefore syntactic hilighting is
2362 ;; disabled for interactive buffers. No imenu support.
2363 (sql-product-font-lock t nil)
2364 ;; Enable commenting and uncommenting of the region.
2365 (make-local-variable 'comment-start)
2366 (setq comment-start "--")
2367 ;; Abbreviation table init and case-insensitive. It is not activated
2368 ;; by default.
2369 (setq local-abbrev-table sql-mode-abbrev-table)
2370 (setq abbrev-all-caps 1)
2371 ;; Exiting the process will call sql-stop.
2372 (set-process-sentinel (get-buffer-process sql-buffer) 'sql-stop)
2373 ;; Create a usefull name for renaming this buffer later.
2374 (make-local-variable 'sql-alternate-buffer-name)
2375 (setq sql-alternate-buffer-name (sql-make-alternate-buffer-name))
2376 ;; User stuff. Initialize before the hook.
2377 (set (make-local-variable 'sql-prompt-regexp)
2378 (sql-product-feature :sqli-prompt-regexp))
2379 (set (make-local-variable 'sql-prompt-length)
2380 (sql-product-feature :sqli-prompt-length))
2381 (make-local-variable 'sql-input-ring-separator)
2382 (make-local-variable 'sql-input-ring-file-name)
2383 ;; Run hook.
2384 (run-mode-hooks 'sql-interactive-mode-hook)
2385 ;; Set comint based on user overrides.
2386 (setq comint-prompt-regexp sql-prompt-regexp)
2387 (setq left-margin sql-prompt-length)
2388 ;; People wanting a different history file for each
2389 ;; buffer/process/client/whatever can change separator and file-name
2390 ;; on the sql-interactive-mode-hook.
2391 (setq comint-input-ring-separator sql-input-ring-separator
2392 comint-input-ring-file-name sql-input-ring-file-name)
2393 ;; Calling the hook before calling comint-read-input-ring allows users
2394 ;; to set comint-input-ring-file-name in sql-interactive-mode-hook.
2395 (comint-read-input-ring t))
2397 (defun sql-stop (process event)
2398 "Called when the SQL process is stopped.
2400 Writes the input history to a history file using
2401 `comint-write-input-ring' and inserts a short message in the SQL buffer.
2403 This function is a sentinel watching the SQL interpreter process.
2404 Sentinels will always get the two parameters PROCESS and EVENT."
2405 (comint-write-input-ring)
2406 (if (and (eq (current-buffer) sql-buffer)
2407 (not buffer-read-only))
2408 (insert (format "\nProcess %s %s\n" process event))
2409 (message "Process %s %s" process event)))
2413 ;;; Entry functions for different SQL interpreters.
2415 ;;;###autoload
2416 (defun sql-product-interactive (&optional product)
2417 "Run product interpreter as an inferior process.
2419 If buffer `*SQL*' exists but no process is running, make a new process.
2420 If buffer exists and a process is running, just switch to buffer
2421 `*SQL*'.
2423 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
2424 (interactive)
2425 (setq product (or product sql-product))
2426 (when (sql-product-feature :sqli-connect product)
2427 (if (comint-check-proc "*SQL*")
2428 (pop-to-buffer "*SQL*")
2429 ;; Get credentials.
2430 (apply 'sql-get-login (sql-product-feature :sqli-login product))
2431 ;; Connect to database.
2432 (message "Login...")
2433 (funcall (sql-product-feature :sqli-connect product))
2434 ;; Set SQLi mode.
2435 (setq sql-interactive-product product)
2436 (setq sql-buffer (current-buffer))
2437 (sql-interactive-mode)
2438 ;; All done.
2439 (message "Login...done")
2440 (pop-to-buffer sql-buffer))))
2442 ;;;###autoload
2443 (defun sql-oracle ()
2444 "Run sqlplus by Oracle as an inferior process.
2446 If buffer `*SQL*' exists but no process is running, make a new process.
2447 If buffer exists and a process is running, just switch to buffer
2448 `*SQL*'.
2450 Interpreter used comes from variable `sql-oracle-program'. Login uses
2451 the variables `sql-user', `sql-password', and `sql-database' as
2452 defaults, if set. Additional command line parameters can be stored in
2453 the list `sql-oracle-options'.
2455 The buffer is put in sql-interactive-mode, giving commands for sending
2456 input. See `sql-interactive-mode'.
2458 To specify a coding system for converting non-ASCII characters
2459 in the input and output to the process, use \\[universal-coding-system-argument]
2460 before \\[sql-oracle]. You can also specify this with \\[set-buffer-process-coding-system]
2461 in the SQL buffer, after you start the process.
2462 The default comes from `process-coding-system-alist' and
2463 `default-process-coding-system'.
2465 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
2466 (interactive)
2467 (sql-product-interactive 'oracle))
2469 (defun sql-connect-oracle ()
2470 "Create comint buffer and connect to Oracle using the login
2471 parameters and command options."
2472 ;; Produce user/password@database construct. Password without user
2473 ;; is meaningless; database without user/password is meaningless,
2474 ;; because "@param" will ask sqlplus to interpret the script
2475 ;; "param".
2476 (let ((parameter nil))
2477 (if (not (string= "" sql-user))
2478 (if (not (string= "" sql-password))
2479 (setq parameter (concat sql-user "/" sql-password))
2480 (setq parameter sql-user)))
2481 (if (and parameter (not (string= "" sql-database)))
2482 (setq parameter (concat parameter "@" sql-database)))
2483 (if parameter
2484 (setq parameter (nconc (list parameter) sql-oracle-options))
2485 (setq parameter sql-oracle-options))
2486 (if parameter
2487 (set-buffer (apply 'make-comint "SQL" sql-oracle-program nil
2488 parameter))
2489 (set-buffer (make-comint "SQL" sql-oracle-program nil)))
2490 ;; SQL*Plus is buffered on WindowsNT; this handles &placeholders.
2491 (if (eq window-system 'w32)
2492 (setq comint-input-sender 'sql-query-placeholders-and-send))))
2496 ;;;###autoload
2497 (defun sql-sybase ()
2498 "Run isql by SyBase as an inferior process.
2500 If buffer `*SQL*' exists but no process is running, make a new process.
2501 If buffer exists and a process is running, just switch to buffer
2502 `*SQL*'.
2504 Interpreter used comes from variable `sql-sybase-program'. Login uses
2505 the variables `sql-server', `sql-user', `sql-password', and
2506 `sql-database' as defaults, if set. Additional command line parameters
2507 can be stored in the list `sql-sybase-options'.
2509 The buffer is put in sql-interactive-mode, giving commands for sending
2510 input. See `sql-interactive-mode'.
2512 To specify a coding system for converting non-ASCII characters
2513 in the input and output to the process, use \\[universal-coding-system-argument]
2514 before \\[sql-sybase]. You can also specify this with \\[set-buffer-process-coding-system]
2515 in the SQL buffer, after you start the process.
2516 The default comes from `process-coding-system-alist' and
2517 `default-process-coding-system'.
2519 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
2520 (interactive)
2521 (sql-product-interactive 'sybase))
2523 (defun sql-connect-sybase ()
2524 "Create comint buffer and connect to Sybase using the login
2525 parameters and command options."
2526 ;; Put all parameters to the program (if defined) in a list and call
2527 ;; make-comint.
2528 (let ((params sql-sybase-options))
2529 (if (not (string= "" sql-server))
2530 (setq params (append (list "-S" sql-server) params)))
2531 (if (not (string= "" sql-database))
2532 (setq params (append (list "-D" sql-database) params)))
2533 (if (not (string= "" sql-password))
2534 (setq params (append (list "-P" sql-password) params)))
2535 (if (not (string= "" sql-user))
2536 (setq params (append (list "-U" sql-user) params)))
2537 (set-buffer (apply 'make-comint "SQL" sql-sybase-program
2538 nil params))))
2542 ;;;###autoload
2543 (defun sql-informix ()
2544 "Run dbaccess by Informix as an inferior process.
2546 If buffer `*SQL*' exists but no process is running, make a new process.
2547 If buffer exists and a process is running, just switch to buffer
2548 `*SQL*'.
2550 Interpreter used comes from variable `sql-informix-program'. Login uses
2551 the variable `sql-database' as default, if set.
2553 The buffer is put in sql-interactive-mode, giving commands for sending
2554 input. See `sql-interactive-mode'.
2556 To specify a coding system for converting non-ASCII characters
2557 in the input and output to the process, use \\[universal-coding-system-argument]
2558 before \\[sql-informix]. You can also specify this with \\[set-buffer-process-coding-system]
2559 in the SQL buffer, after you start the process.
2560 The default comes from `process-coding-system-alist' and
2561 `default-process-coding-system'.
2563 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
2564 (interactive)
2565 (sql-product-interactive 'informix))
2567 (defun sql-connect-informix ()
2568 "Create comint buffer and connect to Informix using the login
2569 parameters and command options."
2570 ;; username and password are ignored.
2571 (if (string= "" sql-database)
2572 (set-buffer (make-comint "SQL" sql-informix-program nil))
2573 (set-buffer (make-comint "SQL" sql-informix-program nil sql-database "-"))))
2577 ;;;###autoload
2578 (defun sql-sqlite ()
2579 "Run sqlite as an inferior process.
2581 SQLite is free software.
2583 If buffer `*SQL*' exists but no process is running, make a new process.
2584 If buffer exists and a process is running, just switch to buffer
2585 `*SQL*'.
2587 Interpreter used comes from variable `sql-sqlite-program'. Login uses
2588 the variables `sql-user', `sql-password', `sql-database', and
2589 `sql-server' as defaults, if set. Additional command line parameters
2590 can be stored in the list `sql-sqlite-options'.
2592 The buffer is put in sql-interactive-mode, giving commands for sending
2593 input. See `sql-interactive-mode'.
2595 To specify a coding system for converting non-ASCII characters
2596 in the input and output to the process, use \\[universal-coding-system-argument]
2597 before \\[sql-sqlite]. You can also specify this with \\[set-buffer-process-coding-system]
2598 in the SQL buffer, after you start the process.
2599 The default comes from `process-coding-system-alist' and
2600 `default-process-coding-system'.
2602 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
2603 (interactive)
2604 (sql-product-interactive 'sqlite))
2606 (defun sql-connect-sqlite ()
2607 "Create comint buffer and connect to SQLite using the login
2608 parameters and command options."
2609 ;; Put all parameters to the program (if defined) in a list and call
2610 ;; make-comint.
2611 (let ((params))
2612 (if (not (string= "" sql-database))
2613 (setq params (append (list sql-database) params)))
2614 (if (not (string= "" sql-server))
2615 (setq params (append (list (concat "--host=" sql-server)) params)))
2616 (if (not (string= "" sql-password))
2617 (setq params (append (list (concat "--password=" sql-password)) params)))
2618 (if (not (string= "" sql-user))
2619 (setq params (append (list (concat "--user=" sql-user)) params)))
2620 (if (not (null sql-sqlite-options))
2621 (setq params (append sql-sqlite-options params)))
2622 (set-buffer (apply 'make-comint "SQL" sql-sqlite-program
2623 nil params))))
2627 ;;;###autoload
2628 (defun sql-mysql ()
2629 "Run mysql by TcX as an inferior process.
2631 Mysql versions 3.23 and up are free software.
2633 If buffer `*SQL*' exists but no process is running, make a new process.
2634 If buffer exists and a process is running, just switch to buffer
2635 `*SQL*'.
2637 Interpreter used comes from variable `sql-mysql-program'. Login uses
2638 the variables `sql-user', `sql-password', `sql-database', and
2639 `sql-server' as defaults, if set. Additional command line parameters
2640 can be stored in the list `sql-mysql-options'.
2642 The buffer is put in sql-interactive-mode, giving commands for sending
2643 input. See `sql-interactive-mode'.
2645 To specify a coding system for converting non-ASCII characters
2646 in the input and output to the process, use \\[universal-coding-system-argument]
2647 before \\[sql-mysql]. You can also specify this with \\[set-buffer-process-coding-system]
2648 in the SQL buffer, after you start the process.
2649 The default comes from `process-coding-system-alist' and
2650 `default-process-coding-system'.
2652 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
2653 (interactive)
2654 (sql-product-interactive 'mysql))
2656 (defun sql-connect-mysql ()
2657 "Create comint buffer and connect to MySQL using the login
2658 parameters and command options."
2659 ;; Put all parameters to the program (if defined) in a list and call
2660 ;; make-comint.
2661 (let ((params))
2662 (if (not (string= "" sql-database))
2663 (setq params (append (list sql-database) params)))
2664 (if (not (string= "" sql-server))
2665 (setq params (append (list (concat "--host=" sql-server)) params)))
2666 (if (not (string= "" sql-password))
2667 (setq params (append (list (concat "--password=" sql-password)) params)))
2668 (if (not (string= "" sql-user))
2669 (setq params (append (list (concat "--user=" sql-user)) params)))
2670 (if (not (null sql-mysql-options))
2671 (setq params (append sql-mysql-options params)))
2672 (set-buffer (apply 'make-comint "SQL" sql-mysql-program
2673 nil params))))
2677 ;;;###autoload
2678 (defun sql-solid ()
2679 "Run solsql by Solid as an inferior process.
2681 If buffer `*SQL*' exists but no process is running, make a new process.
2682 If buffer exists and a process is running, just switch to buffer
2683 `*SQL*'.
2685 Interpreter used comes from variable `sql-solid-program'. Login uses
2686 the variables `sql-user', `sql-password', and `sql-server' as
2687 defaults, if set.
2689 The buffer is put in sql-interactive-mode, giving commands for sending
2690 input. See `sql-interactive-mode'.
2692 To specify a coding system for converting non-ASCII characters
2693 in the input and output to the process, use \\[universal-coding-system-argument]
2694 before \\[sql-solid]. You can also specify this with \\[set-buffer-process-coding-system]
2695 in the SQL buffer, after you start the process.
2696 The default comes from `process-coding-system-alist' and
2697 `default-process-coding-system'.
2699 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
2700 (interactive)
2701 (sql-product-interactive 'solid))
2703 (defun sql-connect-solid ()
2704 "Create comint buffer and connect to Solid using the login
2705 parameters and command options."
2706 ;; Put all parameters to the program (if defined) in a list and call
2707 ;; make-comint.
2708 (let ((params))
2709 ;; It only makes sense if both username and password are there.
2710 (if (not (or (string= "" sql-user)
2711 (string= "" sql-password)))
2712 (setq params (append (list sql-user sql-password) params)))
2713 (if (not (string= "" sql-server))
2714 (setq params (append (list sql-server) params)))
2715 (set-buffer (apply 'make-comint "SQL" sql-solid-program
2716 nil params))))
2720 ;;;###autoload
2721 (defun sql-ingres ()
2722 "Run sql by Ingres as an inferior process.
2724 If buffer `*SQL*' exists but no process is running, make a new process.
2725 If buffer exists and a process is running, just switch to buffer
2726 `*SQL*'.
2728 Interpreter used comes from variable `sql-ingres-program'. Login uses
2729 the variable `sql-database' as default, if set.
2731 The buffer is put in sql-interactive-mode, giving commands for sending
2732 input. See `sql-interactive-mode'.
2734 To specify a coding system for converting non-ASCII characters
2735 in the input and output to the process, use \\[universal-coding-system-argument]
2736 before \\[sql-ingres]. You can also specify this with \\[set-buffer-process-coding-system]
2737 in the SQL buffer, after you start the process.
2738 The default comes from `process-coding-system-alist' and
2739 `default-process-coding-system'.
2741 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
2742 (interactive)
2743 (sql-product-interactive 'ingres))
2745 (defun sql-connect-ingres ()
2746 "Create comint buffer and connect to Ingres using the login
2747 parameters and command options."
2748 ;; username and password are ignored.
2749 (if (string= "" sql-database)
2750 (set-buffer (make-comint "SQL" sql-ingres-program nil))
2751 (set-buffer (make-comint "SQL" sql-ingres-program nil sql-database))))
2755 ;;;###autoload
2756 (defun sql-ms ()
2757 "Run osql by Microsoft as an inferior process.
2759 If buffer `*SQL*' exists but no process is running, make a new process.
2760 If buffer exists and a process is running, just switch to buffer
2761 `*SQL*'.
2763 Interpreter used comes from variable `sql-ms-program'. Login uses the
2764 variables `sql-user', `sql-password', `sql-database', and `sql-server'
2765 as defaults, if set. Additional command line parameters can be stored
2766 in the list `sql-ms-options'.
2768 The buffer is put in sql-interactive-mode, giving commands for sending
2769 input. See `sql-interactive-mode'.
2771 To specify a coding system for converting non-ASCII characters
2772 in the input and output to the process, use \\[universal-coding-system-argument]
2773 before \\[sql-ms]. You can also specify this with \\[set-buffer-process-coding-system]
2774 in the SQL buffer, after you start the process.
2775 The default comes from `process-coding-system-alist' and
2776 `default-process-coding-system'.
2778 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
2779 (interactive)
2780 (sql-product-interactive 'ms))
2782 (defun sql-connect-ms ()
2783 "Create comint buffer and connect to Microsoft using the login
2784 parameters and command options."
2785 ;; Put all parameters to the program (if defined) in a list and call
2786 ;; make-comint.
2787 (let ((params sql-ms-options))
2788 (if (not (string= "" sql-server))
2789 (setq params (append (list "-S" sql-server) params)))
2790 (if (not (string= "" sql-database))
2791 (setq params (append (list "-d" sql-database) params)))
2792 (if (not (string= "" sql-user))
2793 (setq params (append (list "-U" sql-user) params)))
2794 (if (not (string= "" sql-password))
2795 (setq params (append (list "-P" sql-password) params))
2796 (if (string= "" sql-user)
2797 ;; if neither user nor password is provided, use system
2798 ;; credentials.
2799 (setq params (append (list "-E") params))
2800 ;; If -P is passed to ISQL as the last argument without a
2801 ;; password, it's considered null.
2802 (setq params (append params (list "-P")))))
2803 (set-buffer (apply 'make-comint "SQL" sql-ms-program
2804 nil params))))
2808 ;;;###autoload
2809 (defun sql-postgres ()
2810 "Run psql by Postgres as an inferior process.
2812 If buffer `*SQL*' exists but no process is running, make a new process.
2813 If buffer exists and a process is running, just switch to buffer
2814 `*SQL*'.
2816 Interpreter used comes from variable `sql-postgres-program'. Login uses
2817 the variables `sql-database' and `sql-server' as default, if set.
2818 Additional command line parameters can be stored in the list
2819 `sql-postgres-options'.
2821 The buffer is put in sql-interactive-mode, giving commands for sending
2822 input. See `sql-interactive-mode'.
2824 To specify a coding system for converting non-ASCII characters
2825 in the input and output to the process, use \\[universal-coding-system-argument]
2826 before \\[sql-postgres]. You can also specify this with \\[set-buffer-process-coding-system]
2827 in the SQL buffer, after you start the process.
2828 The default comes from `process-coding-system-alist' and
2829 `default-process-coding-system'. If your output lines end with ^M,
2830 your might try undecided-dos as a coding system. If this doesn't help,
2831 Try to set `comint-output-filter-functions' like this:
2833 \(setq comint-output-filter-functions (append comint-output-filter-functions
2834 '(comint-strip-ctrl-m)))
2836 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
2837 (interactive)
2838 (sql-product-interactive 'postgres))
2840 (defun sql-connect-postgres ()
2841 "Create comint buffer and connect to Postgres using the login
2842 parameters and command options."
2843 ;; username and password are ignored. Mark Stosberg suggest to add
2844 ;; the database at the end. Jason Beegan suggest using --pset and
2845 ;; pager=off instead of \\o|cat. The later was the solution by
2846 ;; Gregor Zych. Jason's suggestion is the default value for
2847 ;; sql-postgres-options.
2848 (let ((params sql-postgres-options))
2849 (if (not (string= "" sql-database))
2850 (setq params (append params (list sql-database))))
2851 (if (not (string= "" sql-server))
2852 (setq params (append (list "-h" sql-server) params)))
2853 (if (not (string= "" sql-user))
2854 (setq params (append (list "-U" sql-user) params)))
2855 (set-buffer (apply 'make-comint "SQL" sql-postgres-program
2856 nil params))))
2860 ;;;###autoload
2861 (defun sql-interbase ()
2862 "Run isql by Interbase as an inferior process.
2864 If buffer `*SQL*' exists but no process is running, make a new process.
2865 If buffer exists and a process is running, just switch to buffer
2866 `*SQL*'.
2868 Interpreter used comes from variable `sql-interbase-program'. Login
2869 uses the variables `sql-user', `sql-password', and `sql-database' as
2870 defaults, if set.
2872 The buffer is put in sql-interactive-mode, giving commands for sending
2873 input. See `sql-interactive-mode'.
2875 To specify a coding system for converting non-ASCII characters
2876 in the input and output to the process, use \\[universal-coding-system-argument]
2877 before \\[sql-interbase]. You can also specify this with \\[set-buffer-process-coding-system]
2878 in the SQL buffer, after you start the process.
2879 The default comes from `process-coding-system-alist' and
2880 `default-process-coding-system'.
2882 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
2883 (interactive)
2884 (sql-product-interactive 'interbase))
2886 (defun sql-connect-interbase ()
2887 "Create comint buffer and connect to Interbase using the login
2888 parameters and command options."
2889 ;; Put all parameters to the program (if defined) in a list and call
2890 ;; make-comint.
2891 (let ((params sql-interbase-options))
2892 (if (not (string= "" sql-user))
2893 (setq params (append (list "-u" sql-user) params)))
2894 (if (not (string= "" sql-password))
2895 (setq params (append (list "-p" sql-password) params)))
2896 (if (not (string= "" sql-database))
2897 (setq params (cons sql-database params))) ; add to the front!
2898 (set-buffer (apply 'make-comint "SQL" sql-interbase-program
2899 nil params))))
2903 ;;;###autoload
2904 (defun sql-db2 ()
2905 "Run db2 by IBM as an inferior process.
2907 If buffer `*SQL*' exists but no process is running, make a new process.
2908 If buffer exists and a process is running, just switch to buffer
2909 `*SQL*'.
2911 Interpreter used comes from variable `sql-db2-program'. There is not
2912 automatic login.
2914 The buffer is put in sql-interactive-mode, giving commands for sending
2915 input. See `sql-interactive-mode'.
2917 If you use \\[sql-accumulate-and-indent] to send multiline commands to
2918 db2, newlines will be escaped if necessary. If you don't want that, set
2919 `comint-input-sender' back to `comint-simple-send' by writing an after
2920 advice. See the elisp manual for more information.
2922 To specify a coding system for converting non-ASCII characters
2923 in the input and output to the process, use \\[universal-coding-system-argument]
2924 before \\[sql-db2]. You can also specify this with \\[set-buffer-process-coding-system]
2925 in the SQL buffer, after you start the process.
2926 The default comes from `process-coding-system-alist' and
2927 `default-process-coding-system'.
2929 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
2930 (interactive)
2931 (sql-product-interactive 'db2))
2933 (defun sql-connect-db2 ()
2934 "Create comint buffer and connect to DB2 using the login
2935 parameters and command options."
2936 ;; Put all parameters to the program (if defined) in a list and call
2937 ;; make-comint.
2938 (set-buffer (apply 'make-comint "SQL" sql-db2-program
2939 nil sql-db2-options))
2940 ;; Properly escape newlines when DB2 is interactive.
2941 (setq comint-input-sender 'sql-escape-newlines-and-send))
2943 ;;;###autoload
2944 (defun sql-linter ()
2945 "Run inl by RELEX as an inferior process.
2947 If buffer `*SQL*' exists but no process is running, make a new process.
2948 If buffer exists and a process is running, just switch to buffer
2949 `*SQL*'.
2951 Interpreter used comes from variable `sql-linter-program' - usually `inl'.
2952 Login uses the variables `sql-user', `sql-password', `sql-database' and
2953 `sql-server' as defaults, if set. Additional command line parameters
2954 can be stored in the list `sql-linter-options'. Run inl -h to get help on
2955 parameters.
2957 `sql-database' is used to set the LINTER_MBX environment variable for
2958 local connections, `sql-server' refers to the server name from the
2959 `nodetab' file for the network connection (dbc_tcp or friends must run
2960 for this to work). If `sql-password' is an empty string, inl will use
2961 an empty password.
2963 The buffer is put in sql-interactive-mode, giving commands for sending
2964 input. See `sql-interactive-mode'.
2966 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
2967 (interactive)
2968 (sql-product-interactive 'linter))
2970 (defun sql-connect-linter ()
2971 "Create comint buffer and connect to Linter using the login
2972 parameters and command options."
2973 ;; Put all parameters to the program (if defined) in a list and call
2974 ;; make-comint.
2975 (let ((params sql-linter-options) (login nil) (old-mbx (getenv "LINTER_MBX")))
2976 (if (not (string= "" sql-user))
2977 (setq login (concat sql-user "/" sql-password)))
2978 (setq params (append (list "-u" login) params))
2979 (if (not (string= "" sql-server))
2980 (setq params (append (list "-n" sql-server) params)))
2981 (if (string= "" sql-database)
2982 (setenv "LINTER_MBX" nil)
2983 (setenv "LINTER_MBX" sql-database))
2984 (set-buffer (apply 'make-comint "SQL" sql-linter-program nil
2985 params))
2986 (setenv "LINTER_MBX" old-mbx)))
2990 (provide 'sql)
2992 ;; arch-tag: 7e1fa1c4-9ca2-402e-87d2-83a5eccb7ac3
2993 ;;; sql.el ends here