(ediff-copy-list): Use `defalias' instead of
[emacs.git] / lisp / progmodes / sql.el
blobfb33db00681d56e66aea68ecc53b8c35f3bae749
1 ;;; sql.el --- specialized comint.el for SQL interpreters
3 ;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
5 ;; Author: Alex Schroeder <alex@gnu.org>
6 ;; Maintainer: Alex Schroeder <alex@gnu.org>
7 ;; Version: 1.6.5
8 ;; Keywords: comm languages processes
9 ;; URL: http://www.emacswiki.org/cgi-bin/wiki.pl?SqlMode
11 ;; This file is part of GNU Emacs.
13 ;; GNU Emacs is free software; you can redistribute it and/or modify
14 ;; it under the terms of the GNU General Public License as published by
15 ;; the Free Software Foundation; either version 2, or (at your option)
16 ;; any later version.
18 ;; GNU Emacs is distributed in the hope that it will be useful,
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 ;; GNU General Public License for more details.
23 ;; You should have received a copy of the GNU General Public License
24 ;; along with GNU Emacs; see the file COPYING. If not, write to the
25 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
26 ;; Boston, MA 02111-1307, USA.
28 ;;; Commentary:
30 ;; Please send bug reports and bug fixes to the mailing list at
31 ;; sql.el@gnu.org. If you want to subscribe to the mailing list, send
32 ;; mail to sql.el-request@gnu.org with `subscribe sql.el FIRSTNAME
33 ;; LASTNAME' in the mail body.
35 ;; This file provides a sql-mode and a sql-interactive-mode. My goals
36 ;; were two simple modes providing syntactic hilighting. The
37 ;; interactive mode had to provide a command-line history; the other
38 ;; mode had to provide "send region/buffer to SQL interpreter"
39 ;; functions. "simple" in this context means easy to use, easy to
40 ;; maintain and little or no bells and whistles.
42 ;; If anybody feels like extending this sql mode, take a look at the
43 ;; above mentioned modes and write a sqlx-mode on top of this one. If
44 ;; this proves to be difficult, please suggest changes that will
45 ;; facilitate your plans.
47 ;; sql-interactive-mode is used to interact with a SQL interpreter
48 ;; process in a SQLi buffer (usually called `*SQL*'). The SQLi buffer
49 ;; is created by calling a SQL interpreter-specific entry function. Do
50 ;; *not* call sql-interactive-mode by itself.
52 ;; The list of currently supported interpreters and the corresponding
53 ;; entry function used to create the SQLi buffers is shown with
54 ;; `sql-help' (M-x sql-help).
56 ;; Since sql-interactive-mode is built on top of the general
57 ;; command-interpreter-in-a-buffer mode (comint mode), it shares a
58 ;; common base functionality, and a common set of bindings, with all
59 ;; modes derived from comint mode. This makes these modes easier to
60 ;; use.
62 ;; sql-mode can be used to keep editing SQL statements. The SQL
63 ;; statements can be sent to the SQL process in the SQLi buffer.
65 ;; For documentation on the functionality provided by comint mode, and
66 ;; the hooks available for customizing it, see the file `comint.el'.
68 ;; Hint for newbies: take a look at `dabbrev-expand', `abbrev-mode', and
69 ;; `imenu-add-menubar-index'.
71 ;;; Requirements for Emacs 19.34:
73 ;; If you are using Emacs 19.34, you will have to get and install
74 ;; the file regexp-opt.el
75 ;; <URL:ftp://ftp.ifi.uio.no/pub/emacs/emacs-20.3/lisp/emacs-lisp/regexp-opt.el>
76 ;; and the custom package
77 ;; <URL:http://www.dina.kvl.dk/~abraham/custom/>.
79 ;;; Bugs:
81 ;; Using sql-ms (isql by Microsoft): When commands with syntax errors
82 ;; or execution errors are executed, there is no server feedback.
83 ;; This happens in stored procedures for example. The server messages
84 ;; only appear after the process is exited. This makes things
85 ;; somewhat unreliable.
87 ;; ChangeLog available on request.
89 ;;; To Do:
91 ;; Add better hilight support for other brands; there is a bias towards
92 ;; Oracle because that's what I use at work. Anybody else just send in
93 ;; your lists of reserved words, keywords and builtin functions! As
94 ;; long as I don't receive any feedback, everything is hilighted with
95 ;; ANSI keywords only. I received the list of ANSI keywords from a
96 ;; user; if you know of any changes, let me know.
98 ;; Add different hilighting levels.
100 ;;; Thanks to all the people who helped me out:
102 ;; Kai Blauberg <kai.blauberg@metla.fi>
103 ;; <ibalaban@dalet.com>
104 ;; Yair Friedman <yfriedma@JohnBryce.Co.Il>
105 ;; Gregor Zych <zych@pool.informatik.rwth-aachen.de>
106 ;; nino <nino@inform.dk>
107 ;; Berend de Boer <berend@pobox.com>
111 ;;; Code:
113 (require 'comint)
114 ;; Need the following to allow GNU Emacs 19 to compile the file.
115 (require 'regexp-opt)
116 (require 'custom)
118 ;;; Allow customization
120 (defgroup SQL nil
121 "Running a SQL interpreter from within Emacs buffers"
122 :version "20.4"
123 :group 'processes)
125 ;; These three variables will be used as defaults, if set.
127 (defcustom sql-user ""
128 "*Default username."
129 :type 'string
130 :group 'SQL)
132 (defcustom sql-password ""
133 "*Default password.
135 Storing your password in a textfile such as ~/.emacs could be dangerous.
136 Customizing your password will store it in your ~/.emacs file."
137 :type 'string
138 :group 'SQL)
140 (defcustom sql-database ""
141 "*Default database."
142 :type 'string
143 :group 'SQL)
145 (defcustom sql-server ""
146 "*Default server or host."
147 :type 'string
148 :group 'SQL)
150 ;; misc customization of sql.el behaviour
152 (defcustom sql-electric-stuff nil
153 "Treat some input as electric.
154 If set to the symbol `semicolon', then hitting `;' will send current
155 input in the SQLi buffer to the process.
156 If set to the symbol `go', then hitting `go' on a line by itself will
157 send current input in the SQLi buffer to the process.
158 If set to nil, then you must use \\[comint-send-input] in order to send
159 current input in the SQLi buffer to the process."
160 :type '(choice (const :tag "Nothing" nil)
161 (const :tag "The semikolon `;'" semicolon)
162 (const :tag "The string `go' by itself" go))
163 :version "20.8"
164 :group 'SQL)
166 (defcustom sql-pop-to-buffer-after-send-region nil
167 "*If t, pop to the buffer SQL statements are sent to.
169 After a call to `sql-send-region' or `sql-send-buffer',
170 the window is split and the SQLi buffer is shown. If this
171 variable is not nil, that buffer's window will be selected
172 by calling `pop-to-buffer'. If this variable is nil, that
173 buffer is shown using `display-buffer'."
174 :type 'boolean
175 :group 'SQL)
177 ;; imenu support for sql-mode.
179 (defvar sql-imenu-generic-expression
180 '(("Tables" "^\\s-*create\\s-+table\\s-+\\(\\w+\\)" 1)
181 ("Indexes" "^\\s-*create\\s-+index\\s-+\\(\\w+\\)" 1))
182 "Define interesting points in the SQL buffer for `imenu'.
184 This is used to set `imenu-generic-expression' when SQL mode is
185 entered. Subsequent changes to sql-imenu-generic-expression will not
186 affect existing SQL buffers because imenu-generic-expression is a
187 local variable.")
189 ;; history file
191 (defcustom sql-input-ring-file-name nil
192 "*If non-nil, name of the file to read/write input history.
194 You have to set this variable if you want the history of your commands
195 saved from one Emacs session to the next. If this variable is set,
196 exiting the SQL interpreter in an SQLi buffer will write the input
197 history to the specified file. Starting a new process in a SQLi buffer
198 will read the input history from the specified file.
200 This is used to initialize `comint-input-ring-file-name'.
202 Note that the size of the input history is determined by the variable
203 `comint-input-ring-size'."
204 :type '(choice (const :tag "none" nil)
205 (file))
206 :group 'SQL)
208 (defcustom sql-input-ring-separator "\n--\n"
209 "*Separator between commands in the history file.
211 If set to \"\\n\", each line in the history file will be interpreted as
212 one command. Multi-line commands are split into several commands when
213 the input ring is initialized from a history file.
215 This variable used to initialize `comint-input-ring-separator'.
216 `comint-input-ring-separator' is part of Emacs 21; if your Emacs
217 does not have it, setting `sql-input-ring-separator' will have no
218 effect. In that case multiline commands will be split into several
219 commands when the input history is read, as if you had set
220 `sql-input-ring-separator' to \"\\n\"."
221 :type 'string
222 :group 'SQL)
224 ;; The usual hooks
226 (defcustom sql-interactive-mode-hook '()
227 "*Hook for customizing `sql-interactive-mode'."
228 :type 'hook
229 :group 'SQL)
231 (defcustom sql-mode-hook '()
232 "*Hook for customizing `sql-mode'."
233 :type 'hook
234 :group 'SQL)
236 (defcustom sql-set-sqli-hook '()
237 "*Hook for reacting to changes of `sql-buffer'.
239 This is called by `sql-set-sqli-buffer' when the value of `sql-buffer'
240 is changed."
241 :type 'hook
242 :group 'SQL)
244 ;; Customization for Oracle
246 (defcustom sql-oracle-program "sqlplus"
247 "*Command to start sqlplus by Oracle.
249 Starts `sql-interactive-mode' after doing some setup.
251 Under NT, \"sqlplus\" usually starts the sqlplus \"GUI\". In order to
252 start the sqlplus console, use \"plus33\" or something similar. You
253 will find the file in your Orant\\bin directory.
255 The program can also specify a TCP connection. See `make-comint'."
256 :type 'file
257 :group 'SQL)
259 (defcustom sql-oracle-options nil
260 "*List of additional options for `sql-oracle-program'."
261 :type '(repeat string)
262 :version "20.8"
263 :group 'SQL)
265 ;; Customization for MySql
267 (defcustom sql-mysql-program "mysql"
268 "*Command to start mysql by TcX.
270 Starts `sql-interactive-mode' after doing some setup.
272 The program can also specify a TCP connection. See `make-comint'."
273 :type 'file
274 :group 'SQL)
276 (defcustom sql-mysql-options nil
277 "*List of additional options for `sql-mysql-program'.
278 The following list of options is reported to make things work
279 on Windows: \"-C\" \"-t\" \"-f\" \"-n\"."
280 :type '(repeat string)
281 :version "20.8"
282 :group 'SQL)
284 ;; Customization for Solid
286 (defcustom sql-solid-program "solsql"
287 "*Command to start SOLID SQL Editor.
289 Starts `sql-interactive-mode' after doing some setup.
291 The program can also specify a TCP connection. See `make-comint'."
292 :type 'file
293 :group 'SQL)
295 ;; Customization for SyBase
297 (defcustom sql-sybase-program "isql"
298 "*Command to start isql by SyBase.
300 Starts `sql-interactive-mode' after doing some setup.
302 The program can also specify a TCP connection. See `make-comint'."
303 :type 'file
304 :group 'SQL)
306 (defcustom sql-sybase-options nil
307 "*List of additional options for `sql-sybase-program'.
308 Some versions of isql might require the -n option in order to work."
309 :type '(repeat string)
310 :version "20.8"
311 :group 'SQL)
313 ;; Customization for Informix
315 (defcustom sql-informix-program "dbaccess"
316 "*Command to start dbaccess by Informix.
318 Starts `sql-interactive-mode' after doing some setup.
320 The program can also specify a TCP connection. See `make-comint'."
321 :type 'file
322 :group 'SQL)
324 ;; Customization for Ingres
326 (defcustom sql-ingres-program "sql"
327 "*Command to start sql by Ingres.
329 Starts `sql-interactive-mode' after doing some setup.
331 The program can also specify a TCP connection. See `make-comint'."
332 :type 'file
333 :group 'SQL)
335 ;; Customization for Microsoft
337 (defcustom sql-ms-program "isql"
338 "*Command to start isql by Microsoft.
340 Starts `sql-interactive-mode' after doing some setup.
342 The program can also specify a TCP connection. See `make-comint'."
343 :type 'file
344 :group 'SQL)
346 ;; Customization for Postgres
348 (defcustom sql-postgres-program "psql"
349 "Command to start psql by Postgres.
351 Starts `sql-interactive-mode' after doing some setup.
353 The program can also specify a TCP connection. See `make-comint'."
354 :type 'file
355 :group 'SQL)
357 (defcustom sql-postgres-options '("-P" "pager=off")
358 "*List of additional options for `sql-postgres-program'.
359 The default setting includes the -P option which breaks older versions
360 of the psql client (such as version 6.5.3). The -P option is equivalent
361 to the --pset option. If you want the psql to prompt you for a user
362 name, add the string \"-u\" to the list of options. If you want to
363 provide a user name on the command line (newer versions such as 7.1),
364 add your name with a \"-U\" prefix (such as \"-Umark\") to the list."
365 :type '(repeat string)
366 :version "20.8"
367 :group 'SQL)
369 ;; Customization for Interbase
371 (defcustom sql-interbase-program "isql"
372 "*Command to start isql by Interbase.
374 Starts `sql-interactive-mode' after doing some setup.
376 The program can also specify a TCP connection. See `make-comint'."
377 :type 'file
378 :group 'SQL)
380 (defcustom sql-interbase-options nil
381 "*List of additional options for `sql-interbase-program'."
382 :type '(repeat string)
383 :version "20.8"
384 :group 'SQL)
386 ;; Customization for DB2
388 (defcustom sql-db2-program "db2"
389 "*Command to start db2 by IBM.
391 Starts `sql-interactive-mode' after doing some setup.
393 The program can also specify a TCP connection. See `make-comint'."
394 :type 'file
395 :group 'SQL)
397 (defcustom sql-db2-options nil
398 "*List of additional options for `sql-db2-program'."
399 :type '(repeat string)
400 :version "20.8"
401 :group 'SQL)
405 ;;; Variables which do not need customization
407 (defvar sql-user-history nil
408 "History of usernames used.")
410 (defvar sql-database-history nil
411 "History of databases used.")
413 (defvar sql-server-history nil
414 "History of servers used.")
416 ;; Passwords are not kept in a history.
418 (defvar sql-buffer nil
419 "Current SQLi buffer.
421 The global value of sql-buffer is the name of the latest SQLi buffer
422 created. Any SQL buffer created will make a local copy of this value.
423 See `sql-interactive-mode' for more on multiple sessions. If you want
424 to change the SQLi buffer a SQL mode sends its SQL strings to, change
425 the local value of `sql-buffer' using \\[sql-set-sqli-buffer].")
427 (defvar sql-prompt-regexp nil
428 "Prompt used to initialize `comint-prompt-regexp'.
430 You can change `comint-prompt-regexp' on `sql-interactive-mode-hook'.")
432 (defvar sql-prompt-length 0
433 "Prompt used to set `left-margin' in `sql-interactive-mode'.
435 You can change it on `sql-interactive-mode-hook'.")
437 (defvar sql-alternate-buffer-name nil
438 "Buffer-local string used to possibly rename the SQLi buffer.
440 Used by `sql-rename-buffer'.")
442 ;; Keymap for sql-interactive-mode.
444 (defvar sql-interactive-mode-map
445 (let ((map (make-sparse-keymap)))
446 (if (functionp 'set-keymap-parent)
447 (set-keymap-parent map comint-mode-map); Emacs
448 (set-keymap-parents map (list comint-mode-map))); XEmacs
449 (if (functionp 'set-keymap-name)
450 (set-keymap-name map 'sql-interactive-mode-map)); XEmacs
451 (define-key map (kbd "C-j") 'sql-accumulate-and-indent)
452 (define-key map (kbd "C-c C-w") 'sql-copy-column)
453 (define-key map (kbd "O") 'sql-magic-go)
454 (define-key map (kbd "o") 'sql-magic-go)
455 (define-key map (kbd ";") 'sql-magic-semicolon)
456 map)
457 "Mode map used for `sql-interactive-mode'.
458 Based on `comint-mode-map'.")
460 ;; Keymap for sql-mode.
462 (defvar sql-mode-map
463 (let ((map (make-sparse-keymap)))
464 (define-key map (kbd "C-c C-c") 'sql-send-paragraph)
465 (define-key map (kbd "C-c C-r") 'sql-send-region)
466 (define-key map (kbd "C-c C-b") 'sql-send-buffer)
467 map)
468 "Mode map used for `sql-mode'.")
470 ;; easy menu for sql-mode.
472 (easy-menu-define
473 sql-mode-menu sql-mode-map
474 "Menu for `sql-mode'."
475 '("SQL"
476 ["Send Paragraph" sql-send-paragraph (and (buffer-live-p sql-buffer)
477 (get-buffer-process sql-buffer))]
478 ["Send Region" sql-send-region (and (or (and (boundp 'mark-active); Emacs
479 mark-active)
480 (mark)); XEmacs
481 (buffer-live-p sql-buffer)
482 (get-buffer-process sql-buffer))]
483 ["Send Buffer" sql-send-buffer (and (buffer-live-p sql-buffer)
484 (get-buffer-process sql-buffer))]
485 ["Show SQLi buffer" sql-show-sqli-buffer t]
486 ["Set SQLi buffer" sql-set-sqli-buffer t]
487 ["Pop to SQLi buffer after send"
488 sql-toggle-pop-to-buffer-after-send-region
489 :style toggle
490 :selected sql-pop-to-buffer-after-send-region]
491 ("Highlighting"
492 ["ANSI SQL keywords" sql-highlight-ansi-keywords t]
493 ["Oracle keywords" sql-highlight-oracle-keywords t]
494 ["Postgres keywords" sql-highlight-postgres-keywords t])))
496 ;; easy menu for sql-interactive-mode.
498 (easy-menu-define
499 sql-interactive-mode-menu sql-interactive-mode-map
500 "Menu for `sql-interactive-mode'."
501 '("SQL"
502 ["Rename Buffer" sql-rename-buffer t]))
504 ;; Abbreviations -- if you want more of them, define them in your
505 ;; ~/.emacs file. Abbrevs have to be enabled in your ~/.emacs, too.
507 (defvar sql-mode-abbrev-table nil
508 "Abbrev table used in `sql-mode' and `sql-interactive-mode'.")
509 (if sql-mode-abbrev-table
511 (let ((wrapper))
512 (define-abbrev-table 'sql-mode-abbrev-table ())
513 (define-abbrev sql-mode-abbrev-table "ins" "insert" nil 0 t)
514 (define-abbrev sql-mode-abbrev-table "upd" "update" nil 0 t)
515 (define-abbrev sql-mode-abbrev-table "del" "delete" nil 0 t)
516 (define-abbrev sql-mode-abbrev-table "sel" "select" nil 0 t)))
518 ;; Syntax Table
520 (defvar sql-mode-syntax-table
521 (let ((table (make-syntax-table)))
522 ;; C-style comments /**/ (see elisp manual "Syntax Flags"))
523 (modify-syntax-entry ?/ ". 14" table)
524 (modify-syntax-entry ?* ". 23" table)
525 ;; double-dash starts comment
526 (if (string-match "XEmacs\\|Lucid" emacs-version)
527 (modify-syntax-entry ?- ". 56" table)
528 (modify-syntax-entry ?- ". 12b" table))
529 ;; newline and formfeed end coments
530 (modify-syntax-entry ?\n "> b" table)
531 (modify-syntax-entry ?\f "> b" table)
532 ;; single quotes (') quotes delimit strings
533 (modify-syntax-entry ?' "\"" table)
534 ;; backslash is no escape character
535 (modify-syntax-entry ?\\ "." table)
536 table)
537 "Syntax table used in `sql-mode' and `sql-interactive-mode'.")
539 ;; Font lock support
541 (defvar sql-mode-ansi-font-lock-keywords nil
542 "ANSI SQL keywords used by font-lock.
544 This variable is used by `sql-mode' and `sql-interactive-mode'. The
545 regular expressions are created during compilation by calling the
546 function `regexp-opt'. Therefore, take a look at the source before
547 you define your own sql-mode-ansi-font-lock-keywords. You may want to
548 add functions and PL/SQL keywords.")
549 (if sql-mode-ansi-font-lock-keywords
551 (let ((ansi-keywords (eval-when-compile
552 (concat "\\b"
553 (regexp-opt '(
554 "authorization" "avg" "begin" "close" "cobol" "commit"
555 "continue" "count" "declare" "double" "end" "escape"
556 "exec" "fetch" "foreign" "fortran" "found" "go" "goto" "indicator"
557 "key" "language" "max" "min" "module" "numeric" "open" "pascal" "pli"
558 "precision" "primary" "procedure" "references" "rollback"
559 "schema" "section" "some" "sqlcode" "sqlerror" "sum" "work") t) "\\b")))
560 (ansi-reserved-words (eval-when-compile
561 (concat "\\b"
562 (regexp-opt '(
563 "all" "and" "any" "as" "asc" "between" "by" "check" "create"
564 "current" "default" "delete" "desc" "distinct" "exists" "float" "for"
565 "from" "grant" "group" "having" "in" "insert" "into" "is"
566 "like" "not" "null" "of" "on" "option" "or" "order" "privileges"
567 "public" "select" "set" "table" "to" "union" "unique"
568 "update" "user" "values" "view" "where" "with") t) "\\b")))
569 (ansi-types (eval-when-compile
570 (concat "\\b"
571 (regexp-opt '(
572 ;; ANSI Keywords that look like types
573 "character" "cursor" "dec" "int" "real"
574 ;; ANSI Reserved Word that look like types
575 "char" "integer" "smallint" ) t) "\\b"))))
576 (setq sql-mode-ansi-font-lock-keywords
577 (list (cons ansi-keywords 'font-lock-function-name-face)
578 (cons ansi-reserved-words 'font-lock-keyword-face)
579 (cons ansi-types 'font-lock-type-face)))))
581 (defvar sql-mode-oracle-font-lock-keywords nil
582 "Oracle SQL keywords used by font-lock.
584 This variable is used by `sql-mode' and `sql-interactive-mode'. The
585 regular expressions are created during compilation by calling the
586 function `regexp-opt'. Therefore, take a look at the source before
587 you define your own sql-mode-oracle-font-lock-keywords. You may want
588 to add functions and PL/SQL keywords.")
589 (if sql-mode-oracle-font-lock-keywords
591 (let ((oracle-keywords (eval-when-compile
592 (concat "\\b"
593 (regexp-opt '(
594 "admin" "after" "allocate" "analyze" "archive" "archivelog" "backup"
595 "become" "before" "block" "body" "cache" "cancel" "cascade" "change"
596 "checkpoint" "compile" "constraint" "constraints" "contents"
597 "controlfile" "cycle" "database" "datafile" "dba" "disable" "dismount"
598 "dump" "each" "else" "elsif" "enable" "events" "except" "exceptions"
599 "execute" "exit" "explain" "extent" "externally" "false" "flush" "force"
600 "freelist" "freelists" "function" "groups" "if" "including" "initrans"
601 "instance" "layer" "link" "lists" "logfile" "loop" "manage" "manual"
602 "maxdatafiles" "maxinistances" "maxlogfiles" "maxloghistory"
603 "maxlogmembers" "maxtrans" "maxvalue" "minextents" "minvalue" "mount"
604 "new" "next" "noarchivelog" "nocache" "nocycle" "nomaxvalue"
605 "nominvalue" "none" "noorder" "noresetlogs" "normal" "nosort" "off"
606 "old" "only" "optimal" "others" "out" "own" "package" "parallel"
607 "pctincrease" "pctused" "plan" "pragma" "private" "profile" "quota"
608 "raise" "read" "recover" "referencing" "resetlogs" "restrict_references"
609 "restricted" "return" "returning" "reuse" "rnds" "rnps" "role" "roles"
610 "savepoint" "scn" "segment" "sequence" "shared" "snapshot" "sort"
611 "statement_id" "statistics" "stop" "storage" "subtype" "switch" "system"
612 "tables" "tablespace" "temporary" "thread" "time" "tracing"
613 "transaction" "triggers" "true" "truncate" "type" "under" "unlimited"
614 "until" "use" "using" "when" "while" "wnds" "wnps" "write") t) "\\b")))
615 (oracle-warning-words (eval-when-compile
616 (concat "\\b"
617 (regexp-opt '(
618 "cursor_already_open" "dup_val_on_index" "exception" "invalid_cursor"
619 "invalid_number" "login_denied" "no_data_found" "not_logged_on"
620 "notfound" "others" "pragma" "program_error" "storage_error"
621 "timeout_on_resource" "too_many_rows" "transaction_backed_out"
622 "value_error" "zero_divide") t) "\\b")))
623 (oracle-reserved-words (eval-when-compile
624 (concat "\\b"
625 (regexp-opt '(
626 "access" "add" "alter" "audit" "cluster" "column" "comment" "compress"
627 "connect" "drop" "else" "exclusive" "file" "grant"
628 "identified" "immediate" "increment" "index" "initial" "intersect"
629 "level" "lock" "long" "maxextents" "minus" "mode" "modify" "noaudit"
630 "nocompress" "nowait" "number" "offline" "online" "pctfree" "prior"
631 "raw" "rename" "resource" "revoke" "row" "rowlabel" "rownum"
632 "rows" "session" "share" "size" "start" "successful" "synonym" "sysdate"
633 "then" "trigger" "uid" "validate" "whenever") t) "\\b")))
634 (oracle-types (eval-when-compile
635 (concat "\\b"
636 (regexp-opt '(
637 ;; Oracle Keywords that look like types
638 ;; Oracle Reserved Words that look like types
639 "binary_integer" "blob" "boolean" "constant" "date" "decimal" "rowid"
640 "varchar" "varchar2") t) "\\b")))
641 (oracle-builtin-functions (eval-when-compile
642 (concat "\\b"
643 (regexp-opt '(
644 ;; Misc Oracle builtin functions
645 "abs" "add_months" "ascii" "avg" "ceil" "chartorowid" "chr" "concat"
646 "convert" "cos" "cosh" "count" "currval" "decode" "dump" "exp" "floor"
647 "glb" "greatest" "greatest_lb" "hextoraw" "initcap" "instr" "instrb"
648 "last_day" "least" "least_ub" "length" "lengthb" "ln" "log" "lower"
649 "lpad" "ltrim" "lub" "max" "min" "mod" "months_between" "new_time"
650 "next_day" "nextval" "nls_initcap" "nls_lower" "nls_upper" "nlssort"
651 "nvl" "power" "rawtohex" "replace" "round" "rowidtochar" "rpad"
652 "rtrim" "sign" "sin" "sinh" "soundex" "sqlcode" "sqlerrm" "sqrt"
653 "stddev" "sum" "substr" "substrb" "tan" "tanh" "to_char"
654 "to_date" "to_label" "to_multi_byte" "to_number" "to_single_byte"
655 "translate" "trim" "trunc" "uid" "upper" "userenv" "variance" "vsize") t) "\\b"))))
656 (setq sql-mode-oracle-font-lock-keywords
657 (append sql-mode-ansi-font-lock-keywords
658 (list (cons oracle-keywords 'font-lock-function-name-face)
659 (cons oracle-warning-words 'font-lock-warning-face)
660 (cons oracle-reserved-words 'font-lock-keyword-face)
661 ;; XEmacs doesn't have font-lock-builtin-face
662 (if (string-match "XEmacs\\|Lucid" emacs-version)
663 (cons oracle-builtin-functions 'font-lock-preprocessor-face)
664 ;; GNU Emacs 19 doesn't have it either
665 (if (string-match "GNU Emacs 19" emacs-version)
666 (cons oracle-builtin-functions 'font-lock-function-name-face)
667 ;; Emacs
668 (cons oracle-builtin-functions 'font-lock-builtin-face)))
669 (cons oracle-types 'font-lock-type-face))))))
671 (defvar sql-mode-postgres-font-lock-keywords nil
672 "Postgres SQL keywords used by font-lock.
674 This variable is used by `sql-mode' and `sql-interactive-mode'. The
675 regular expressions are created during compilation by calling the
676 function `regexp-opt'. Therefore, take a look at the source before
677 you define your own sql-mode-postgres-font-lock-keywords.")
679 (if sql-mode-postgres-font-lock-keywords
681 (let ((postgres-reserved-words (eval-when-compile
682 (concat "\\b"
683 (regexp-opt '(
684 "language"
685 ) t) "\\b")))
686 (postgres-types (eval-when-compile
687 (concat "\\b"
688 (regexp-opt '(
689 "bool" "box" "circle" "char" "char2" "char4" "char8" "char16" "date"
690 "float4" "float8" "int2" "int4" "int8" "line" "lseg" "money" "path"
691 "point" "polygon" "serial" "text" "time" "timespan" "timestamp" "varchar"
692 ) t)"\\b")))
693 (postgres-builtin-functions (eval-when-compile
694 (concat "\\b"
695 (regexp-opt '(
696 ;; Misc Postgres builtin functions
697 "abstime" "age" "area" "box" "center" "date_part" "date_trunc"
698 "datetime" "dexp" "diameter" "dpow" "float" "float4" "height"
699 "initcap" "integer" "isclosed" "isfinite" "isoldpath" "isopen"
700 "length" "lower" "lpad" "ltrim" "pclose" "point" "points" "popen"
701 "position" "radius" "reltime" "revertpoly" "rpad" "rtrim" "substr"
702 "substring" "text" "timespan" "translate" "trim" "upgradepath"
703 "upgradepoly" "upper" "varchar" "width"
704 ) t) "\\b"))))
705 (setq sql-mode-postgres-font-lock-keywords
706 (append sql-mode-ansi-font-lock-keywords
707 (list (cons postgres-reserved-words 'font-lock-keyword-face)
708 ;; XEmacs doesn't have 'font-lock-builtin-face
709 (if (string-match "XEmacs\\|Lucid" emacs-version)
710 (cons postgres-builtin-functions 'font-lock-preprocessor-face)
711 ;; Emacs
712 (cons postgres-builtin-functions 'font-lock-builtin-face))
713 (cons postgres-types 'font-lock-type-face))))))
716 (defvar sql-mode-font-lock-keywords sql-mode-ansi-font-lock-keywords
717 "SQL keywords used by font-lock.
719 This variable defaults to `sql-mode-ansi-font-lock-keywords'. This is
720 used for the default `font-lock-defaults' value in `sql-mode'. This
721 can be changed by some entry functions to provide more hilighting.")
725 ;;; Functions to switch highlighting
727 (defun sql-highlight-oracle-keywords ()
728 "Highlight Oracle keywords.
729 Basically, this just sets `font-lock-keywords' appropriately."
730 (interactive)
731 (setq font-lock-keywords sql-mode-oracle-font-lock-keywords)
732 (font-lock-fontify-buffer))
734 (defun sql-highlight-postgres-keywords ()
735 "Highlight Postgres keywords.
736 Basically, this just sets `font-lock-keywords' appropriately."
737 (interactive)
738 (setq font-lock-keywords sql-mode-postgres-font-lock-keywords)
739 (font-lock-fontify-buffer))
741 (defun sql-highlight-ansi-keywords ()
742 "Highlight ANSI SQL keywords.
743 Basically, this just sets `font-lock-keywords' appropriately."
744 (interactive)
745 (setq font-lock-keywords sql-mode-ansi-font-lock-keywords)
746 (font-lock-fontify-buffer))
750 ;;; Compatibility functions
752 (if (not (fboundp 'comint-line-beginning-position))
753 ;; comint-line-beginning-position is defined in Emacs 21
754 (defun comint-line-beginning-position ()
755 "Returns the buffer position of the beginning of the line, after any prompt.
756 The prompt is assumed to be any text at the beginning of the line matching
757 the regular expression `comint-prompt-regexp', a buffer local variable."
758 (save-excursion (comint-bol nil) (point))))
762 ;;; Small functions
764 (defun sql-magic-go (arg)
765 "Insert \"o\" and call `comint-send-input'.
766 `sql-electric-stuff' must be the symbol `go'."
767 (interactive "P")
768 (self-insert-command (prefix-numeric-value arg))
769 (if (and (equal sql-electric-stuff 'go)
770 (save-excursion
771 (comint-bol nil)
772 (looking-at "go\\b")))
773 (comint-send-input)))
775 (defun sql-magic-semicolon (arg)
776 "Insert semicolon and call `comint-send-input'.
777 `sql-electric-stuff' must be the symbol `semicolon'."
778 (interactive "P")
779 (self-insert-command (prefix-numeric-value arg))
780 (if (equal sql-electric-stuff 'semicolon)
781 (comint-send-input)))
783 (defun sql-accumulate-and-indent ()
784 "Continue SQL statement on the next line."
785 (interactive)
786 (if (fboundp 'comint-accumulate)
787 (comint-accumulate)
788 (newline))
789 (indent-according-to-mode))
791 ;;;###autoload
792 (defun sql-help ()
793 "Show short help for the SQL modes.
795 Use an entry function to open an interactive SQL buffer. This buffer is
796 usually named `*SQL*'. The name of the major mode is SQLi.
798 Use the following commands to start a specific SQL interpreter:
800 PostGres: \\[sql-postgres]
801 MySQL: \\[sql-mysql]
803 Other non-free SQL implementations are also supported:
805 Solid: \\[sql-solid]
806 Oracle: \\[sql-oracle]
807 Informix: \\[sql-informix]
808 Sybase: \\[sql-sybase]
809 Ingres: \\[sql-ingres]
810 Microsoft: \\[sql-ms]
811 Interbase: \\[sql-interbase]
813 But we urge you to choose a free implementation instead of these.
815 Once you have the SQLi buffer, you can enter SQL statements in the
816 buffer. The output generated is appended to the buffer and a new prompt
817 is generated. See the In/Out menu in the SQLi buffer for some functions
818 that help you navigate through the buffer, the input history, etc.
820 If you have a really complex SQL statement or if you are writing a
821 procedure, you can do this in a separate buffer. Put the new buffer in
822 `sql-mode' by calling \\[sql-mode]. The name of this buffer can be
823 anything. The name of the major mode is SQL.
825 In this SQL buffer (SQL mode), you can send the region or the entire
826 buffer to the interactive SQL buffer (SQLi mode). The results are
827 appended to the SQLi buffer without disturbing your SQL buffer."
828 (interactive)
829 (describe-function 'sql-help))
831 (defun sql-read-passwd (prompt &optional default)
832 "Read a password using PROMPT.
833 Optional DEFAULT is password to start with. This function calls
834 `read-passwd' if it is available. If not, function
835 `ange-ftp-read-passwd' is called. This should always be available,
836 even in old versions of Emacs."
837 (if (fboundp 'read-passwd)
838 (read-passwd prompt nil default)
839 (unless (fboundp 'ange-ftp-read-passwd)
840 (autoload 'ange-ftp-read-passwd "ange-ftp"))
841 (ange-ftp-read-passwd prompt default)))
843 (defun sql-get-login (&rest what)
844 "Get username, password and database from the user.
846 The variables `sql-user', `sql-password', `sql-server', and
847 `sql-database' can be customized. They are used as the default values.
848 Usernames, servers and databases are stored in `sql-user-history',
849 `sql-server-history' and `database-history'. Passwords are not stored
850 in a history.
852 Parameter WHAT is a list of the arguments passed to this function.
853 The function asks for the username if WHAT contains symbol `user', for
854 the password if it contains symbol `password', for the server if it
855 contains symbol `server', and for the database if it contains symbol
856 `database'.
858 In order to ask the user for username, password and database, call the
859 function like this: (sql-get-login 'user 'password 'database)."
860 (interactive)
861 (if (memq 'user what)
862 (setq sql-user
863 (read-from-minibuffer "User: " sql-user nil nil
864 sql-user-history)))
865 (if (memq 'password what)
866 (setq sql-password
867 (sql-read-passwd "Password: " sql-password)))
868 (if (memq 'server what)
869 (setq sql-server
870 (read-from-minibuffer "Server: " sql-server nil nil
871 sql-server-history)))
872 (if (memq 'database what)
873 (setq sql-database
874 (read-from-minibuffer "Database: " sql-database nil nil
875 sql-database-history))))
877 (defun sql-find-sqli-buffer ()
878 "Return the current default SQLi buffer or nil.
879 In order to qualify, the SQLi buffer must be alive,
880 be in `sql-interactive-mode' and have a process."
881 (let ((default-buffer (default-value 'sql-buffer)))
882 (if (and (buffer-live-p default-buffer)
883 (get-buffer-process default-buffer))
884 default-buffer
885 (save-excursion
886 (let ((buflist (buffer-list))
887 (found))
888 (while (not (or (null buflist)
889 found))
890 (let ((candidate (car buflist)))
891 (set-buffer candidate)
892 (if (and (equal major-mode 'sql-interactive-mode)
893 (get-buffer-process candidate))
894 (setq found candidate))
895 (setq buflist (cdr buflist))))
896 found)))))
898 (defun sql-set-sqli-buffer-generally ()
899 "Set SQLi buffer for all SQL buffers that have none.
900 This function checks all SQL buffers for their SQLi buffer. If their
901 SQLi buffer is nonexistent or has no process, it is set to the current
902 default SQLi buffer. The current default SQLi buffer is determined
903 using `sql-find-sqli-buffer'. If `sql-buffer' is set,
904 `sql-set-sqli-hook' is run."
905 (interactive)
906 (save-excursion
907 (let ((buflist (buffer-list))
908 (default-sqli-buffer (sql-find-sqli-buffer)))
909 (setq-default sql-buffer default-sqli-buffer)
910 (while (not (null buflist))
911 (let ((candidate (car buflist)))
912 (set-buffer candidate)
913 (if (and (equal major-mode 'sql-mode)
914 (not (buffer-live-p sql-buffer)))
915 (progn
916 (setq sql-buffer default-sqli-buffer)
917 (run-hooks 'sql-set-sqli-hook))))
918 (setq buflist (cdr buflist))))))
920 (defun sql-set-sqli-buffer ()
921 "Set the SQLi buffer SQL strings are sent to.
923 Call this function in a SQL buffer in order to set the SQLi buffer SQL
924 strings are sent to. Calling this function sets `sql-buffer' and runs
925 `sql-set-sqli-hook'.
927 If you call it from a SQL buffer, this sets the local copy of
928 `sql-buffer'.
930 If you call it from anywhere else, it sets the global copy of
931 `sql-buffer'."
932 (interactive)
933 (let ((default-buffer (sql-find-sqli-buffer)))
934 (if (null default-buffer)
935 (error "There is no suitable SQLi buffer"))
936 (let ((new-buffer
937 (get-buffer
938 (read-buffer "New SQLi buffer: " default-buffer t))))
939 (if (null (get-buffer-process new-buffer))
940 (error "Buffer %s has no process" (buffer-name new-buffer)))
941 (if (null (save-excursion
942 (set-buffer new-buffer)
943 (equal major-mode 'sql-interactive-mode)))
944 (error "Buffer %s is no SQLi buffer" (buffer-name new-buffer)))
945 (if new-buffer
946 (progn
947 (setq sql-buffer new-buffer)
948 (run-hooks 'sql-set-sqli-hook))))))
950 (defun sql-show-sqli-buffer ()
951 "Show the name of current SQLi buffer.
953 This is the buffer SQL strings are sent to. It is stored in the
954 variable `sql-buffer'. See `sql-help' on how to create such a buffer."
955 (interactive)
956 (if (null (buffer-live-p sql-buffer))
957 (message "%s has no SQLi buffer set." (buffer-name (current-buffer)))
958 (if (null (get-buffer-process sql-buffer))
959 (message "Buffer %s has no process." (buffer-name sql-buffer))
960 (message "Current SQLi buffer is %s." (buffer-name sql-buffer)))))
962 (defun sql-make-alternate-buffer-name ()
963 "Return a string that can be used to rename a SQLi buffer.
965 This is used to set `sql-alternate-buffer-name' within
966 `sql-interactive-mode'."
967 (concat (if (string= "" sql-user)
968 (if (string= "" (user-login-name))
970 (concat (user-login-name) "/"))
971 (concat sql-user "/"))
972 (if (string= "" sql-database)
973 (if (string= "" sql-server)
974 (system-name)
975 sql-server)
976 sql-database)))
978 (defun sql-rename-buffer ()
979 "Renames a SQLi buffer."
980 (interactive)
981 (rename-buffer (format "*SQL: %s*" sql-alternate-buffer-name) t))
983 (defun sql-copy-column ()
984 "Copy current column to the end of buffer.
985 Inserts SELECT or commas if appropriate."
986 (interactive)
987 (let ((column))
988 (save-excursion
989 (setq column (buffer-substring
990 (progn (forward-char 1) (backward-sexp 1) (point))
991 (progn (forward-sexp 1) (point))))
992 (goto-char (point-max))
993 (let ((bol (comint-line-beginning-position)))
994 (cond
995 ;; if empty command line, insert SELECT
996 ((= bol (point))
997 (insert "SELECT "))
998 ;; else if appending to INTO .* (, SELECT or ORDER BY, insert a comma
999 ((save-excursion
1000 (re-search-backward "\\b\\(\\(into\\s-+\\S-+\\s-+(\\)\\|select\\|order by\\) .+"
1001 bol t))
1002 (insert ", "))
1003 ;; else insert a space
1005 (if (eq (preceding-char) ? )
1007 (insert " ")))))
1008 ;; in any case, insert the column
1009 (insert column)
1010 (message "%s" column))))
1012 ;; On NT, SQL*Plus for Oracle turns on full buffering for stdout if it
1013 ;; is not attached to a character device; therefore placeholder
1014 ;; replacement by SQL*Plus is fully buffered. The workaround lets
1015 ;; Emacs query for the placeholders.
1017 (defvar sql-placeholder-history nil
1018 "History of placeholder values used.")
1020 (defun sql-query-placeholders-and-send (proc string)
1021 "Send to PROC input STRING, maybe replacing placeholders.
1022 Placeholders are words starting with and ampersand like &this.
1023 This function is used for `comint-input-sender' if using `sql-oracle' on NT."
1024 (while (string-match "&\\(\\sw+\\)" string)
1025 (setq string (replace-match
1026 (read-from-minibuffer
1027 (format "Enter value for %s: " (match-string 1 string))
1028 nil nil nil sql-placeholder-history)
1029 t t string)))
1030 (comint-send-string proc string)
1031 (if comint-input-sender-no-newline
1032 (if (not (string-equal string ""))
1033 (process-send-eof))
1034 (comint-send-string proc "\n")))
1036 ;; Using DB2 interactively, newlines must be escaped with " \".
1037 ;; The space before the backslash is relevant.
1038 (defun sql-escape-newlines-and-send (proc string)
1039 "Send to PROC input STRING, escaping newlines if necessary.
1040 Every newline in STRING will be preceded with a space and a backslash."
1041 (let ((result "") (start 0) mb me)
1042 (while (string-match "\n" string start)
1043 (setq mb (match-beginning 0)
1044 me (match-end 0))
1045 (if (and (> mb 1)
1046 (string-equal " \\" (substring string (- mb 2) mb)))
1047 (setq result (concat result (substring string start me)))
1048 (setq result (concat result (substring string start mb) " \\\n")))
1049 (setq start me))
1050 (setq result (concat result (substring string start)))
1051 (comint-send-string proc result)
1052 (if comint-input-sender-no-newline
1053 (if (not (string-equal string ""))
1054 (process-send-eof))
1055 (comint-send-string proc "\n"))))
1059 ;;; Sending the region to the SQLi buffer.
1061 (defun sql-send-region (start end)
1062 "Send a region to the SQL process."
1063 (interactive "r")
1064 (if (buffer-live-p sql-buffer)
1065 (save-excursion
1066 (comint-send-region sql-buffer start end)
1067 (if (string-match "\n$" (buffer-substring start end))
1069 (comint-send-string sql-buffer "\n"))
1070 (message "Sent string to buffer %s." (buffer-name sql-buffer))
1071 (if sql-pop-to-buffer-after-send-region
1072 (pop-to-buffer sql-buffer)
1073 (display-buffer sql-buffer)))
1074 (message "No SQL process started.")))
1076 (defun sql-send-paragraph ()
1077 "Send the current paragraph to the SQL process."
1078 (interactive)
1079 (let ((start (save-excursion
1080 (backward-paragraph)
1081 (point)))
1082 (end (save-excursion
1083 (forward-paragraph)
1084 (point))))
1085 (sql-send-region start end)))
1087 (defun sql-send-buffer ()
1088 "Send the buffer contents to the SQL process."
1089 (interactive)
1090 (sql-send-region (point-min) (point-max)))
1092 (defun sql-toggle-pop-to-buffer-after-send-region (&optional value)
1093 "Toggle `sql-pop-to-buffer-after-send-region'.
1095 If given the optional parameter VALUE, sets
1096 sql-toggle-pop-to-buffer-after-send-region to VALUE."
1097 (interactive "P")
1098 (if value
1099 (setq sql-pop-to-buffer-after-send-region value)
1100 (setq sql-pop-to-buffer-after-send-region
1101 (null sql-pop-to-buffer-after-send-region ))))
1105 ;;; SQL mode -- uses SQL interactive mode
1107 ;;;###autoload
1108 (defun sql-mode ()
1109 "Major mode to edit SQL.
1111 You can send SQL statements to the SQLi buffer using
1112 \\[sql-send-region]. Such a buffer must exist before you can do this.
1113 See `sql-help' on how to create SQLi buffers.
1115 \\{sql-mode-map}
1116 Customization: Entry to this mode runs the `sql-mode-hook'.
1118 When you put a buffer in SQL mode, the buffer stores the last SQLi
1119 buffer created as its destination in the variable `sql-buffer'. This
1120 will be the buffer \\[sql-send-region] sends the region to. If this
1121 SQLi buffer is killed, \\[sql-send-region] is no longer able to
1122 determine where the strings should be sent to. You can set the
1123 value of `sql-buffer' using \\[sql-set-sqli-buffer].
1125 For information on how to create multiple SQLi buffers, see
1126 `sql-interactive-mode'.
1128 Note that SQL doesn't have an escape character unless you specify
1129 one. If you specify backslash as escape character in SQL,
1130 you must tell Emacs. Here's how to do that in your `~/.emacs' file:
1132 \(add-hook 'sql-mode-hook
1133 (lambda ()
1134 (modify-syntax-entry ?\\\\ \".\" sql-mode-syntax-table)))"
1135 (interactive)
1136 (kill-all-local-variables)
1137 (setq major-mode 'sql-mode)
1138 (setq mode-name "SQL")
1139 (use-local-map sql-mode-map)
1140 (if sql-mode-menu
1141 (easy-menu-add sql-mode-menu)); XEmacs
1142 (set-syntax-table sql-mode-syntax-table)
1143 (make-local-variable 'font-lock-defaults)
1144 ;; Note that making KEYWORDS-ONLY nil will cause havoc if you try
1145 ;; SELECT 'x' FROM DUAL with SQL*Plus, because the title of the column
1146 ;; will have just one quote. Therefore syntactic hilighting is
1147 ;; disabled for interactive buffers. `_' and `.' are considered part
1148 ;; of words.
1149 (setq font-lock-defaults '(sql-mode-font-lock-keywords
1150 nil t ((?_ . "w") (?. . "w"))))
1151 (make-local-variable 'comment-start)
1152 (setq comment-start "--")
1153 ;; Make each buffer in sql-mode remember the "current" SQLi buffer.
1154 (make-local-variable 'sql-buffer)
1155 ;; Add imenu support for sql-mode. Note that imenu-generic-expression
1156 ;; is buffer-local, so we don't need a local-variable for it. SQL is
1157 ;; case-insensitive, that's why we have to set imenu-case-fold-search.
1158 ;; imenu-syntax-alist makes sure that `_' is considered part of object
1159 ;; names.
1160 (setq imenu-generic-expression sql-imenu-generic-expression
1161 imenu-case-fold-search t
1162 imenu-syntax-alist '(("_" . "w")))
1163 ;; Make `sql-send-paragraph' work on paragraphs that contain indented
1164 ;; lines.
1165 (make-local-variable 'paragraph-separate)
1166 (make-local-variable 'paragraph-start)
1167 (setq paragraph-separate "[\f]*$"
1168 paragraph-start "[\n\f]")
1169 ;; Abbrevs
1170 (setq local-abbrev-table sql-mode-abbrev-table)
1171 (setq abbrev-all-caps 1)
1172 ;; Run hook
1173 (run-hooks 'sql-mode-hook))
1177 ;;; SQL interactive mode
1179 (put 'sql-interactive-mode 'mode-class 'special)
1181 (defun sql-interactive-mode ()
1182 "Major mode to use a SQL interpreter interactively.
1184 Do not call this function by yourself. The environment must be
1185 initialized by an entry function specific for the SQL interpreter. See
1186 `sql-help' for a list of available entry functions.
1188 \\[comint-send-input] after the end of the process' output sends the
1189 text from the end of process to the end of the current line.
1190 \\[comint-send-input] before end of process output copies the current
1191 line minus the prompt to the end of the buffer and sends it.
1192 \\[comint-copy-old-input] just copies the current line.
1193 Use \\[sql-accumulate-and-indent] to enter multi-line statements.
1195 If you want to make multiple SQL buffers, rename the `*SQL*' buffer
1196 using \\[rename-buffer] or \\[rename-uniquely] and start a new process.
1197 See `sql-help' for a list of available entry functions. The last buffer
1198 created by such an entry function is the current SQLi buffer. SQL
1199 buffers will send strings to the SQLi buffer current at the time of
1200 their creation. See `sql-mode' for details.
1202 Sample session using two connections:
1204 1. Create first SQLi buffer by calling an entry function.
1205 2. Rename buffer \"*SQL*\" to \"*Connection 1*\".
1206 3. Create a SQL buffer \"test1.sql\".
1207 4. Create second SQLi buffer by calling an entry function.
1208 5. Rename buffer \"*SQL*\" to \"*Connection 2*\".
1209 6. Create a SQL buffer \"test2.sql\".
1211 Now \\[sql-send-region] in buffer \"test1.sql\" will send the region to
1212 buffer \"*Connection 1*\", \\[sql-send-region] in buffer \"test2.sql\"
1213 will send the region to buffer \"*Connection 2*\".
1215 If you accidentally suspend your process, use \\[comint-continue-subjob]
1216 to continue it. On some operating systems, this will not work because
1217 the signals are not supported.
1219 \\{sql-interactive-mode-map}
1220 Customization: Entry to this mode runs the hooks on `comint-mode-hook'
1221 and `sql-interactive-mode-hook' (in that order). Before each input, the
1222 hooks on `comint-input-filter-functions' are run. After each SQL
1223 interpreter output, the hooks on `comint-output-filter-functions' are
1224 run.
1226 Variable `sql-input-ring-file-name' controls the initialisation of the
1227 input ring history.
1229 Variables `comint-output-filter-functions', a hook, and
1230 `comint-scroll-to-bottom-on-input' and
1231 `comint-scroll-to-bottom-on-output' control whether input and output
1232 cause the window to scroll to the end of the buffer.
1234 If you want to make SQL buffers limited in length, add the function
1235 `comint-truncate-buffer' to `comint-output-filter-functions'.
1237 Here is an example for your .emacs file. It keeps the SQLi buffer a
1238 certain length.
1240 \(add-hook 'sql-interactive-mode-hook
1241 \(function (lambda ()
1242 \(setq comint-output-filter-functions 'comint-truncate-buffer))))
1244 Here is another example. It will always put point back to the statement
1245 you entered, right above the output it created.
1247 \(setq comint-output-filter-functions
1248 \(function (lambda (STR) (comint-show-output))))"
1249 (comint-mode)
1250 (setq comint-prompt-regexp sql-prompt-regexp)
1251 (setq left-margin sql-prompt-length)
1252 (setq major-mode 'sql-interactive-mode)
1253 (setq mode-name "SQLi")
1254 (use-local-map sql-interactive-mode-map)
1255 (if sql-interactive-mode-menu
1256 (easy-menu-add sql-interactive-mode-menu)); XEmacs
1257 (set-syntax-table sql-mode-syntax-table)
1258 (make-local-variable 'font-lock-defaults)
1259 ;; Note that making KEYWORDS-ONLY nil will cause havoc if you try
1260 ;; SELECT 'x' FROM DUAL with SQL*Plus, because the title of the column
1261 ;; will have just one quote. Therefore syntactic hilighting is
1262 ;; disabled for interactive buffers. `_' and `.' are considered part
1263 ;; of words.
1264 (setq font-lock-defaults '(sql-mode-font-lock-keywords
1265 t t ((?_ . "w") (?. . "w"))))
1266 ;; Enable commenting and uncommenting of the region.
1267 (make-local-variable 'comment-start)
1268 (setq comment-start "--")
1269 ;; Abbreviation table init and case-insensitive. It is not activatet
1270 ;; by default.
1271 (setq local-abbrev-table sql-mode-abbrev-table)
1272 (setq abbrev-all-caps 1)
1273 ;; Exiting the process will call sql-stop.
1274 (set-process-sentinel (get-buffer-process sql-buffer) 'sql-stop)
1275 ;; People wanting a different history file for each
1276 ;; buffer/process/client/whatever can change separator and file-name
1277 ;; on the sql-interactive-mode-hook.
1278 (setq comint-input-ring-separator sql-input-ring-separator
1279 comint-input-ring-file-name sql-input-ring-file-name)
1280 ;; Create a usefull name for renaming this buffer later.
1281 (make-local-variable 'sql-alternate-buffer-name)
1282 (setq sql-alternate-buffer-name (sql-make-alternate-buffer-name))
1283 ;; User stuff.
1284 (run-hooks 'sql-interactive-mode-hook)
1285 ;; Calling the hook before calling comint-read-input-ring allows users
1286 ;; to set comint-input-ring-file-name in sql-interactive-mode-hook.
1287 (comint-read-input-ring t))
1289 (defun sql-stop (process event)
1290 "Called when the SQL process is stopped.
1292 Writes the input history to a history file using
1293 `comint-write-input-ring' and inserts a short message in the SQL buffer.
1295 This function is a sentinel watching the SQL interpreter process.
1296 Sentinels will always get the two parameters PROCESS and EVENT."
1297 (comint-write-input-ring)
1298 (if (and (eq (current-buffer) sql-buffer)
1299 (not buffer-read-only))
1300 (insert (format "\nProcess %s %s\n" process event))
1301 (message "Process %s %s" process event)))
1305 ;;; Entry functions for different SQL interpreters.
1307 ;;;###autoload
1308 (defun sql-oracle ()
1309 "Run sqlplus by Oracle as an inferior process.
1311 If buffer `*SQL*' exists but no process is running, make a new process.
1312 If buffer exists and a process is running, just switch to buffer
1313 `*SQL*'.
1315 Interpreter used comes from variable `sql-oracle-program'. Login uses
1316 the variables `sql-user', `sql-password', and `sql-database' as
1317 defaults, if set. Additional command line parameters can be stored in
1318 the list `sql-oracle-options'.
1320 The buffer is put in sql-interactive-mode, giving commands for sending
1321 input. See `sql-interactive-mode'.
1323 To specify a coding system for converting non-ASCII characters
1324 in the input and output to the process, use \\[universal-coding-system-argument]
1325 before \\[sql-oracle]. You can also specify this with \\[set-buffer-process-coding-system]
1326 in the SQL buffer, after you start the process.
1327 The default comes from `process-coding-system-alist' and
1328 `default-process-coding-system'.
1330 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
1331 (interactive)
1332 (if (comint-check-proc "*SQL*")
1333 (pop-to-buffer "*SQL*")
1334 (sql-get-login 'user 'password 'database)
1335 (message "Login...")
1336 ;; Produce user/password@database construct. Password without user
1337 ;; is meaningless; database without user/password is meaningless,
1338 ;; because "@param" will ask sqlplus to interpret the script
1339 ;; "param".
1340 (let ((parameter nil))
1341 (if (not (string= "" sql-user))
1342 (if (not (string= "" sql-password))
1343 (setq parameter (concat sql-user "/" sql-password))
1344 (setq parameter sql-user)))
1345 (if (and parameter (not (string= "" sql-database)))
1346 (setq parameter (concat parameter "@" sql-database)))
1347 (if parameter
1348 (setq parameter (nconc (list parameter) sql-oracle-options))
1349 (setq parameter sql-oracle-options))
1350 (if parameter
1351 (set-buffer (apply 'make-comint "SQL" sql-oracle-program nil
1352 parameter))
1353 (set-buffer (make-comint "SQL" sql-oracle-program nil))))
1354 (setq sql-prompt-regexp "^SQL> ")
1355 (setq sql-prompt-length 5)
1356 (setq sql-buffer (current-buffer))
1357 ;; set sql-mode-font-lock-keywords to something different before
1358 ;; calling sql-interactive-mode.
1359 (setq sql-mode-font-lock-keywords sql-mode-oracle-font-lock-keywords)
1360 (sql-interactive-mode)
1361 ;; If running on NT, make sure we do placeholder replacement
1362 ;; ourselves. This must come after sql-interactive-mode because all
1363 ;; local variables will be killed, there.
1364 (if (eq window-system 'w32)
1365 (setq comint-input-sender 'sql-query-placeholders-and-send))
1366 (message "Login...done")
1367 (pop-to-buffer sql-buffer)))
1371 ;;;###autoload
1372 (defun sql-sybase ()
1373 "Run isql by SyBase as an inferior process.
1375 If buffer `*SQL*' exists but no process is running, make a new process.
1376 If buffer exists and a process is running, just switch to buffer
1377 `*SQL*'.
1379 Interpreter used comes from variable `sql-sybase-program'. Login uses
1380 the variables `sql-server', `sql-user', `sql-password', and
1381 `sql-database' as defaults, if set. Additional command line parameters
1382 can be stored in the list `sql-sybase-options'.
1384 The buffer is put in sql-interactive-mode, giving commands for sending
1385 input. See `sql-interactive-mode'.
1387 To specify a coding system for converting non-ASCII characters
1388 in the input and output to the process, use \\[universal-coding-system-argument]
1389 before \\[sql-sybase]. You can also specify this with \\[set-buffer-process-coding-system]
1390 in the SQL buffer, after you start the process.
1391 The default comes from `process-coding-system-alist' and
1392 `default-process-coding-system'.
1394 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
1395 (interactive)
1396 (if (comint-check-proc "*SQL*")
1397 (pop-to-buffer "*SQL*")
1398 (sql-get-login 'server 'user 'password 'database)
1399 (message "Login...")
1400 ;; Put all parameters to the program (if defined) in a list and call
1401 ;; make-comint.
1402 (let ((params sql-sybase-options))
1403 (if (not (string= "" sql-server))
1404 (setq params (append (list "-S" sql-server) params)))
1405 (if (not (string= "" sql-database))
1406 (setq params (append (list "-D" sql-database) params)))
1407 (if (not (string= "" sql-password))
1408 (setq params (append (list "-P" sql-password) params)))
1409 (if (not (string= "" sql-user))
1410 (setq params (append (list "-U" sql-user) params)))
1411 (set-buffer (apply 'make-comint "SQL" sql-sybase-program
1412 nil params)))
1413 (setq sql-prompt-regexp "^SQL> ")
1414 (setq sql-prompt-length 5)
1415 (setq sql-buffer (current-buffer))
1416 (sql-interactive-mode)
1417 (message "Login...done")
1418 (pop-to-buffer sql-buffer)))
1422 ;;;###autoload
1423 (defun sql-informix ()
1424 "Run dbaccess by Informix as an inferior process.
1426 If buffer `*SQL*' exists but no process is running, make a new process.
1427 If buffer exists and a process is running, just switch to buffer
1428 `*SQL*'.
1430 Interpreter used comes from variable `sql-informix-program'. Login uses
1431 the variable `sql-database' as default, if set.
1433 The buffer is put in sql-interactive-mode, giving commands for sending
1434 input. See `sql-interactive-mode'.
1436 To specify a coding system for converting non-ASCII characters
1437 in the input and output to the process, use \\[universal-coding-system-argument]
1438 before \\[sql-informix]. You can also specify this with \\[set-buffer-process-coding-system]
1439 in the SQL buffer, after you start the process.
1440 The default comes from `process-coding-system-alist' and
1441 `default-process-coding-system'.
1443 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
1444 (interactive)
1445 (if (comint-check-proc "*SQL*")
1446 (pop-to-buffer "*SQL*")
1447 (sql-get-login 'database)
1448 (message "Login...")
1449 ;; username and password are ignored.
1450 (if (string= "" sql-database)
1451 (set-buffer (make-comint "SQL" sql-informix-program nil))
1452 (set-buffer (make-comint "SQL" sql-informix-program nil sql-database "-")))
1453 (setq sql-prompt-regexp "^SQL> ")
1454 (setq sql-prompt-length 5)
1455 (setq sql-buffer (current-buffer))
1456 (sql-interactive-mode)
1457 (message "Login...done")
1458 (pop-to-buffer sql-buffer)))
1462 ;;;###autoload
1463 (defun sql-mysql ()
1464 "Run mysql by TcX as an inferior process.
1466 Mysql versions 3.23 and up are free software.
1468 If buffer `*SQL*' exists but no process is running, make a new process.
1469 If buffer exists and a process is running, just switch to buffer
1470 `*SQL*'.
1472 Interpreter used comes from variable `sql-mysql-program'. Login uses
1473 the variables `sql-user', `sql-password', `sql-database', and
1474 `sql-server' as defaults, if set. Additional command line parameters
1475 can be stored in the list `sql-mysql-options'.
1477 The buffer is put in sql-interactive-mode, giving commands for sending
1478 input. See `sql-interactive-mode'.
1480 To specify a coding system for converting non-ASCII characters
1481 in the input and output to the process, use \\[universal-coding-system-argument]
1482 before \\[sql-mysql]. You can also specify this with \\[set-buffer-process-coding-system]
1483 in the SQL buffer, after you start the process.
1484 The default comes from `process-coding-system-alist' and
1485 `default-process-coding-system'.
1487 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
1488 (interactive)
1489 (if (comint-check-proc "*SQL*")
1490 (pop-to-buffer "*SQL*")
1491 (sql-get-login 'user 'password 'database 'server)
1492 (message "Login...")
1493 ;; Put all parameters to the program (if defined) in a list and call
1494 ;; make-comint.
1495 (let ((params))
1496 (if (not (string= "" sql-database))
1497 (setq params (append (list sql-database) params)))
1498 (if (not (string= "" sql-server))
1499 (setq params (append (list (concat "--host=" sql-server)) params)))
1500 (if (not (string= "" sql-password))
1501 (setq params (append (list (concat "--password=" sql-password)) params)))
1502 (if (not (string= "" sql-user))
1503 (setq params (append (list (concat "--user=" sql-user)) params)))
1504 (if (not (null sql-mysql-options))
1505 (setq params (append sql-mysql-options params)))
1506 (set-buffer (apply 'make-comint "SQL" sql-mysql-program
1507 nil params)))
1508 (setq sql-prompt-regexp "^mysql>")
1509 (setq sql-prompt-length 6)
1510 (setq sql-buffer (current-buffer))
1511 (sql-interactive-mode)
1512 (message "Login...done")
1513 (pop-to-buffer sql-buffer)))
1517 ;;;###autoload
1518 (defun sql-solid ()
1519 "Run solsql by Solid as an inferior process.
1521 If buffer `*SQL*' exists but no process is running, make a new process.
1522 If buffer exists and a process is running, just switch to buffer
1523 `*SQL*'.
1525 Interpreter used comes from variable `sql-solid-program'. Login uses
1526 the variables `sql-user', `sql-password', and `sql-server' as
1527 defaults, if set.
1529 The buffer is put in sql-interactive-mode, giving commands for sending
1530 input. See `sql-interactive-mode'.
1532 To specify a coding system for converting non-ASCII characters
1533 in the input and output to the process, use \\[universal-coding-system-argument]
1534 before \\[sql-solid]. You can also specify this with \\[set-buffer-process-coding-system]
1535 in the SQL buffer, after you start the process.
1536 The default comes from `process-coding-system-alist' and
1537 `default-process-coding-system'.
1539 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
1540 (interactive)
1541 (if (comint-check-proc "*SQL*")
1542 (pop-to-buffer "*SQL*")
1543 (sql-get-login 'user 'password 'server)
1544 (message "Login...")
1545 ;; Put all parameters to the program (if defined) in a list and call
1546 ;; make-comint.
1547 (let ((params))
1548 ;; It only makes sense if both username and password are there.
1549 (if (not (or (string= "" sql-user)
1550 (string= "" sql-password)))
1551 (setq params (append (list sql-user sql-password) params)))
1552 (if (not (string= "" sql-server))
1553 (setq params (append (list sql-server) params)))
1554 (set-buffer (apply 'make-comint "SQL" sql-solid-program
1555 nil params)))
1556 (setq sql-prompt-regexp "^")
1557 (setq sql-prompt-length 0)
1558 (setq sql-buffer (current-buffer))
1559 (sql-interactive-mode)
1560 (message "Login...done")
1561 (pop-to-buffer sql-buffer)))
1565 ;;;###autoload
1566 (defun sql-ingres ()
1567 "Run sql by Ingres as an inferior process.
1569 If buffer `*SQL*' exists but no process is running, make a new process.
1570 If buffer exists and a process is running, just switch to buffer
1571 `*SQL*'.
1573 Interpreter used comes from variable `sql-ingres-program'. Login uses
1574 the variable `sql-database' as default, if set.
1576 The buffer is put in sql-interactive-mode, giving commands for sending
1577 input. See `sql-interactive-mode'.
1579 To specify a coding system for converting non-ASCII characters
1580 in the input and output to the process, use \\[universal-coding-system-argument]
1581 before \\[sql-ingres]. You can also specify this with \\[set-buffer-process-coding-system]
1582 in the SQL buffer, after you start the process.
1583 The default comes from `process-coding-system-alist' and
1584 `default-process-coding-system'.
1586 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
1587 (interactive)
1588 (if (comint-check-proc "*SQL*")
1589 (pop-to-buffer "*SQL*")
1590 (sql-get-login 'database)
1591 (message "Login...")
1592 ;; username and password are ignored.
1593 (if (string= "" sql-database)
1594 (set-buffer (make-comint "SQL" sql-ingres-program nil))
1595 (set-buffer (make-comint "SQL" sql-ingres-program nil sql-database)))
1596 (setq sql-prompt-regexp "^\* ")
1597 (setq sql-prompt-length 2)
1598 (setq sql-buffer (current-buffer))
1599 (sql-interactive-mode)
1600 (message "Login...done")
1601 (pop-to-buffer sql-buffer)))
1605 ;;;###autoload
1606 (defun sql-ms ()
1607 "Run isql by Microsoft as an inferior process.
1609 If buffer `*SQL*' exists but no process is running, make a new process.
1610 If buffer exists and a process is running, just switch to buffer
1611 `*SQL*'.
1613 Interpreter used comes from variable `sql-ms-program'. Login uses the
1614 variables `sql-user', `sql-password', `sql-database', and `sql-server'
1615 as defaults, if set.
1617 The buffer is put in sql-interactive-mode, giving commands for sending
1618 input. See `sql-interactive-mode'.
1620 To specify a coding system for converting non-ASCII characters
1621 in the input and output to the process, use \\[universal-coding-system-argument]
1622 before \\[sql-ms]. You can also specify this with \\[set-buffer-process-coding-system]
1623 in the SQL buffer, after you start the process.
1624 The default comes from `process-coding-system-alist' and
1625 `default-process-coding-system'.
1627 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
1628 (interactive)
1629 (if (comint-check-proc "*SQL*")
1630 (pop-to-buffer "*SQL*")
1631 (sql-get-login 'user 'password 'database 'server)
1632 (message "Login...")
1633 ;; Put all parameters to the program (if defined) in a list and call
1634 ;; make-comint.
1635 (let ((params '("-w 300")))
1636 (if (not (string= "" sql-server))
1637 (setq params (append (list "-S" sql-server) params)))
1638 (if (not (string= "" sql-database))
1639 (setq params (append (list "-d" sql-database) params)))
1640 (if (not (string= "" sql-user))
1641 (setq params (append (list "-U" sql-user) params)))
1642 (if (not (string= "" sql-password))
1643 (setq params (append (list "-P" sql-password) params))
1644 ;; If -P is passed to ISQL as the last argument without a password,
1645 ;; it's considered null.
1646 (setq params (append params (list "-P"))))
1647 (set-buffer (apply 'make-comint "SQL" sql-ms-program
1648 nil params)))
1649 (setq sql-prompt-regexp "^[0-9]*>")
1650 (setq sql-prompt-length 5)
1651 (setq sql-buffer (current-buffer))
1652 (sql-interactive-mode)
1653 (message "Login...done")
1654 (pop-to-buffer sql-buffer)))
1658 ;;;###autoload
1659 (defun sql-postgres ()
1660 "Run psql by Postgres as an inferior process.
1662 If buffer `*SQL*' exists but no process is running, make a new process.
1663 If buffer exists and a process is running, just switch to buffer
1664 `*SQL*'.
1666 Interpreter used comes from variable `sql-postgres-program'. Login uses
1667 the variables `sql-database' and `sql-server' as default, if set.
1668 Additional command line parameters can be stored in the list
1669 `sql-postgres-options'.
1671 The buffer is put in sql-interactive-mode, giving commands for sending
1672 input. See `sql-interactive-mode'.
1674 To specify a coding system for converting non-ASCII characters
1675 in the input and output to the process, use \\[universal-coding-system-argument]
1676 before \\[sql-postgres]. You can also specify this with \\[set-buffer-process-coding-system]
1677 in the SQL buffer, after you start the process.
1678 The default comes from `process-coding-system-alist' and
1679 `default-process-coding-system'. If your output lines end with ^M,
1680 your might try undecided-dos as a coding system. If this doesn't help,
1681 Try to set `comint-output-filter-functions' like this:
1683 \(setq comint-output-filter-functions (append comint-output-filter-functions
1684 '(comint-strip-ctrl-m)))
1686 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
1687 (interactive)
1688 (if (comint-check-proc "*SQL*")
1689 (pop-to-buffer "*SQL*")
1690 (sql-get-login 'database 'server)
1691 (message "Login...")
1692 ;; username and password are ignored. Mark Stosberg suggest to add
1693 ;; the database at the end. Jason Beegan suggest using --pset and
1694 ;; pager=off instead of \\o|cat. The later was the solution by
1695 ;; Gregor Zych. Jason's suggestion is the default value for
1696 ;; sql-postgres-options.
1697 (let ((params sql-postgres-options))
1698 (if (not (string= "" sql-database))
1699 (setq params (append params (list sql-database))))
1700 (if (not (string= "" sql-server))
1701 (setq params (append (list "-h" sql-server) params)))
1702 (set-buffer (apply 'make-comint "SQL" sql-postgres-program
1703 nil params)))
1704 (setq sql-prompt-regexp "^.*> *")
1705 (setq sql-prompt-length 5)
1706 ;; This is a lousy hack to prevent psql from truncating it's output
1707 ;; and giving stupid warnings. If s.o. knows a way to prevent psql
1708 ;; from acting this way, then I would be very thankful to
1709 ;; incorporate this (Gregor Zych <zych@pool.informatik.rwth-aachen.de>)
1710 ;; (comint-send-string "*SQL*" "\\o \| cat\n")
1711 (setq sql-mode-font-lock-keywords sql-mode-postgres-font-lock-keywords)
1712 (setq sql-buffer (current-buffer))
1713 (sql-interactive-mode)
1714 (message "Login...done")
1715 (pop-to-buffer sql-buffer)))
1719 ;;;###autoload
1720 (defun sql-interbase ()
1721 "Run isql by Interbase as an inferior process.
1723 If buffer `*SQL*' exists but no process is running, make a new process.
1724 If buffer exists and a process is running, just switch to buffer
1725 `*SQL*'.
1727 Interpreter used comes from variable `sql-interbase-program'. Login
1728 uses the variables `sql-user', `sql-password', and `sql-database' as
1729 defaults, if set.
1731 The buffer is put in sql-interactive-mode, giving commands for sending
1732 input. See `sql-interactive-mode'.
1734 To specify a coding system for converting non-ASCII characters
1735 in the input and output to the process, use \\[universal-coding-system-argument]
1736 before \\[sql-interbase]. You can also specify this with \\[set-buffer-process-coding-system]
1737 in the SQL buffer, after you start the process.
1738 The default comes from `process-coding-system-alist' and
1739 `default-process-coding-system'.
1741 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
1742 (interactive)
1743 (if (comint-check-proc "*SQL*")
1744 (pop-to-buffer "*SQL*")
1745 (sql-get-login 'user 'password 'database)
1746 (message "Login...")
1747 ;; Put all parameters to the program (if defined) in a list and call
1748 ;; make-comint.
1749 (let ((params sql-interbase-options))
1750 (if (not (string= "" sql-user))
1751 (setq params (append (list "-u" sql-user) params)))
1752 (if (not (string= "" sql-password))
1753 (setq params (append (list "-p" sql-password) params)))
1754 (if (not (string= "" sql-database))
1755 (setq params (cons sql-database params))); add to the front!
1756 (set-buffer (apply 'make-comint "SQL" sql-interbase-program
1757 nil params)))
1758 (setq sql-prompt-regexp "^SQL> ")
1759 (setq sql-prompt-length 5)
1760 (setq sql-buffer (current-buffer))
1761 (sql-interactive-mode)
1762 (message "Login...done")
1763 (pop-to-buffer sql-buffer)))
1767 ;;;###autoload
1768 (defun sql-db2 ()
1769 "Run db2 by IBM as an inferior process.
1771 If buffer `*SQL*' exists but no process is running, make a new process.
1772 If buffer exists and a process is running, just switch to buffer
1773 `*SQL*'.
1775 Interpreter used comes from variable `sql-db2-program'. There is not
1776 automatic login.
1778 The buffer is put in sql-interactive-mode, giving commands for sending
1779 input. See `sql-interactive-mode'.
1781 If you use \\[sql-accumulate-and-indent] to send multiline commands to
1782 db2, newlines will be escaped if necessary. If you don't want that, set
1783 `comint-input-sender' back to `comint-simple-send' by writing an after
1784 advice. See the elisp manual for more information.
1786 To specify a coding system for converting non-ASCII characters
1787 in the input and output to the process, use \\[universal-coding-system-argument]
1788 before \\[sql-db2]. You can also specify this with \\[set-buffer-process-coding-system]
1789 in the SQL buffer, after you start the process.
1790 The default comes from `process-coding-system-alist' and
1791 `default-process-coding-system'.
1793 \(Type \\[describe-mode] in the SQL buffer for a list of commands.)"
1794 (interactive)
1795 (if (comint-check-proc "*SQL*")
1796 (pop-to-buffer "*SQL*")
1797 (message "Login...")
1798 ;; Put all parameters to the program (if defined) in a list and call
1799 ;; make-comint.
1800 (set-buffer (apply 'make-comint "SQL" sql-db2-program
1801 nil sql-db2-options))
1802 (setq sql-prompt-regexp "^db2 => ")
1803 (setq sql-prompt-length 7)
1804 (setq sql-buffer (current-buffer))
1805 (sql-interactive-mode)
1806 ;; Escape newlines. This must come after sql-interactive-mode
1807 ;; because all local variables will be killed, there.
1808 (setq comint-input-sender 'sql-escape-newlines-and-send)
1809 (message "Login...done")
1810 (pop-to-buffer sql-buffer)))
1812 (provide 'sql)
1814 ;;; sql.el ends here