 |
|
| |
sqsh - Interactive database shell (version 2.5)
sqsh [[options]] [[args......]]
[ -a count ]
[ -A packet_size ]
[ -b ]
[ -B ]
[ -c [cmdend] ]
[ -C sql ]
[ -d severity ]
[ -D database ]
[ -e ]
[ -E editor ]
[ -f severity ]
[ -G tds_version ]
[ -h ]
[ -H hostname ]
[ -i filename ]
[ -I interfaces ]
[ -J charset ]
[ -k keywords ]
[ -K keytab]
[ -l debug_flags ]
[ -L var=value ]
[ -m style ]
[ -n on|off ]
[ -N appname ]
[ -o filename ]
[ -p ]
[ -P [password] ]
[ -Q query_timeout ]
[ -r [sqshrc] ]
[ -R server principal ]
[ -s colsep ]
[ -S server ]
[ -t [filter] ]
[ -T login_timeout ]
[ -U username ]
[ -v ]
[ -V [bcdimoqru]]
[ -w width ]
[ -X ]
[ -y directory ]
[ -z language ]
[ -Z [secmech|default|none] ]
Sqsh (pronounced skwish) is short for SQshelL (pronounced
s-q-shell), and is intended as a replacement for the venerable 'isql'
program supplied by Sybase. It came about due to years of frustration of
trying to do real work with a program that was never meant to perform real
work.
Sqsh is much more than a nice prompt, it is intended to provide
much of the functionality provided by a good shell, such as variables,
aliasing, redirection, pipes, back-grounding, job control, history, command
substitution, and dynamic configuration. Also, as a by-product of the
design, it is remarkably easy to extend and add functionality.
The following options may be used to adjust some of the behavior
of sqsh, however a large portion of the configuration options are available
only through environment variables which may be set at runtime or via a
.sqshrc file.
Options may also be supplied in the SQSH environment variable.
This variable is parsed prior to parsing the command line, so in most cases
the command line will override the contents of the variable. Be aware that
for options which are allowed to be supplied multiple times, such as
-c, supplying them both in a variable and on the command line will be
the same as supplying them multiple times on the command line.
- -a count
- Sets the maximum count of failures (as determined by the
$thresh_fail variable) that
may occur before sqsh will abort. Setting this to 0 indicates that sqsh
should not exit on errors. This value defaults to 0 and may also be set
using the $thresh_exit
variable. See section EXIT STATUS for details.
- -A packetsize
- Specifies the size of the network TDS packets used to communicate with the
SQL server. This value must be between 512 and 8192, and be a multiple of
512. Check your SQL Server configuration to determine supported packet
sizes. This value may also be specified at run-time using the
$packet_size variable.
- -b
- Suppress the banner message upon startup. This is unnecessary in cases
where stdout has been redirected to a file. This option may also be set
via the $banner
variable.
- -B
- Turns off all buffering of stdin, stdout, and stderr. This feature allows
sqsh to be run from an interactive control script such as chat and
expect.
- -c [cmdend]
- Internally sqsh provides the command \go to send a batch of SQL to
the database and provides a single alias, go for this command. Each
time cmdend is supplied a new alias for \go is
established.
- -C sql
- Causes the sql command to be executed by sqsh, similar to the same
behavior exhibited by the -i flag. This sql statement may not
contain double quotes (this limitation may be lifted in a future release
of sqsh).
- -d severity
- Sets the minimum SQL Server error severity that will be displayed to the
user. The default is 0, and valid ranges are from 0 to 22. This may also
be set using the
$thresh_display variable. See
section EXIT STATUS.
- -D database
- Causes sqsh to attempt to start with your database context set to
database rather than your default database (usually master). This
may also be set using the
$database variable.
- -e
- Includes each command issued to sqsh to be included in the output. This
option may also be set via the
$echo variable (which is
unrelated to the \echo command).
- -E editor
- Set the default editor to editor. This may also be set using the
UNIX environment variable
$EDITOR to the name of the
editor desired.
- -f severity
- Sets the minimum severity level considered a failure by sqsh. This
is the same as setting the
$thresh_fail variable. See
section EXIT STATUS for details.
- -G tds_version
- Set the TDS version to use. Valid versions are 4.0, 4.2, 4.6, 4.9.5, 5.0
and freetds additionally supports versions 7.0 and 8.0. The specified
value is assigned to the variable
$tds_version. Input
validation is not performed by sqsh. However, when an invalid TDS version
is specified, the default version of 5.0 will be used. After a session is
setup, the variable
$tds_version will be set to
the TDS version in effect. The variable will not be available if option -G
is not used. Meant for test and debugging purposes only.
TDS stands for Tabular Data Stream and is the communication
protocol Sybase and Microsoft uses for Client-Server communication.
- -h
- Turns off column headers and trailing "(# rows affected)" from
batch output.
- -H hostname
- Sets the client hostname as reported in sysprocesses. This may also be set
via the $hostname
variable.
- -i filename
- Read all input from filename rather than from stdin.
- -I interfaces
- When a connection is established to the database, the interfaces
file is used to turn the value of
$DSQUERY into the hostname
and port to which the connection will be made, by default this is located
in $SYBASE/interfaces. This
flag allows this default to be overridden.
- -J charset
- Specifies the character set to be used on the client side to communicate
with SQL Server. This may also be set using the
$charset environment
variable.
- -k keywords
- Specifies a file containing a list of keywords to be used for keyword tab
completion, if readline support has been compiled into sqsh. This file may
also be set via the
$keyword_file variable, which
defaults to
$HOME/.sqsh_words.
- -K keytab
- Kerberos support. Specify the keytab file name for DCE.
See the Kerberos Support section below for details.
- -l debug_flags
- If sqsh has been compiled with -DDEBUG, this option may be used to turn on
and off debugging options. See the
$debug variable, below.
- -L var=value
- Sets the value of $var to
value. This may be used to set the value of any sqsh variable even
if an explicit command line variable is supplied for setting the variable.
The -L flag may be used to set the value of non-configuration
variables as well.
- -m style
- Changes the current display style to style. Currently supported
styles are horiz, vert, bcp, csv, html,
meta, pretty and none. The current display style may
also be set using the $style
variable or via the -m flag to the \go command.
- -n on|off
- Enables chained transaction mode on connect (if set to on). Chained
transaction mode is also known as "AutoCommit off" mode.
- -N appname
- Set the application name sqsh uses to identify itself to the SQL server.
The application name can be retrieved from the server using the column
program_name of the master.dbo.sysprocesses table. Defaults to
sqsh-2.1.7.
- -o filename
- Redirects all output to filename rather than stdout.
- -p
- Display performance statistics upon completion of every SQL batch. This
option may also be turned on via the
$statistics variable, or by
supplying the -p flag to the \go command.
- -P [password | -]
- The Sybase password for username required to connect to
server (default, NULL). The password may also be set via
$password. Supplying a
password of '-' causes the password to be read from the first line of
stdin.
sqsh takes pains to hide the password from any user trying to
view the command line used to launch sqsh, so using -P should not
constitute a security hole. Alternatively, you can store your default
password in .sqshrc file which is not readable by anyone other than
yourself. (chmod 600 .sqshrc)
- -Q value
- Query timeout value (equivalent to isql's -t option). If set, will timeout
a long running query. Maps to the
$query_timeout variable.
For example:
sqsh -SASE1502 -Usa -P -Q30
ASE1502.sa.master.1> cd tix
ASE1502.sa.tix.1> select count(*) from E_TIX;
Open Client Message
Layer 1, Origin 2, Severity 2, Number 63
ct_results(): user api layer: internal Client Library error:
Read from the server has timed out.
ASE1502: Query or command timeout detected, command/batch cancelled
ASE1502: The client connection has detected this 1 time(s).
See also the
$max_timeout variable,
which controls the number of times a timeout may occur on the current
connection before the session is aborted.
- -r [sqshrc]
- Specifies an alternate .sqshrc file to be processed, rather than
the default. If no sqshrc is supplied following -r, then no
initialization files are processed. This flag must be the first
argument supplied on the command line, all other instances will be
ignored.
- -R server_principal
- Kerberos support: Specifies a server principal to use for network
(Kerberos) authentication, if the server name in the interfaces file
differs from the real server name.
See the Kerberos Support section below for details.
- -s colsep
- Causes the string colsep to be used to delimit SQL column output
columns, this defaults to " ".
- -S server |
host:port[:filter]
- The name or the address of the Sybase server to connect. The
default of this is the external environment variable
$DSQUERY. If neither
-S nor $DSQUERY is set
then defaults to "SYBASE". This value may also be set via the
internal variable $DSQUERY.
The servername must exist in the interfaces or sql.ini file. As an
alternative it is also possible to specify the target server as
host:port[:filter] where host may also be an IP address.
Note that filter may be defined in
$SYBASE/$SYBASE_OCS/config/libtcl[64].cfg. For
example:
[FILTERS]
ssl=libsybfssl.so
ssl64=libsybfssl64.so
- -t [filter]
- Enables filtering of command batches through an external program,
filter, and prior to being sent to the SQL Server. If filter
is not supplied, then
$filter_prog is used (default
is 'm4 -'). This value may also be set via the
$filter and
$filter_prog variables.
- -T value
- Specifies the login timeout (similar to isql's -l flag). If set specifies
the number of seconds sqsh will wait before timing out a login
request. Maps to the
$login_timeout variable.
- -U username
- The Sybase username to connect to the database as, this defaults to
the username of the user running sqsh. The username may also
be set via the $username
variable.
- -v
- Displays the version number,
$version, and exits.
- -V [bcdimoqru]
- Kerberos support: Specify the security options to use.
See the Kerberos Support section below for details.
- -w width
- The maximum output width of a displayed result set, this defaults
to your screen width in interactive mode.
- -X
- Initiates the login connection to the server with client-side password
encryption (if supported). If either SQL Server does not recognize this
option, or if the version of CT-Lib used to compile sqsh does not
support this option, then it will be ignored. This option may also be set
using the $encryption
environment variable.
- -y directory
- Specifies a SYBASE directory to use other than the value of
$SYBASE in order to find the
interfaces file.
- -z language
- Specifies an alternate language to display sqsh prompts and
messages. Without the -z flag, the server's default language will
be used. This may also be set using the
$language variable.
- -Z [secmech|default|none]
- Kerberos support: Specify the security mechanism to use.
See the Kerberos Support section below for details.
- args...
- If sqsh is run with the -i flag specifying an input file to be
processed (rather than initiating an interactive session), arguments may
be supplied on the command line to be passed to the input file. These
arguments may be accessed using the variables ${0}, ${1}, ... (see the
Variables section, below, for more information).
Upon startup, sqsh initializes all internal environment variables,
commands, and aliases to their default values, it then looks in the
system-wide configuration file (usually /usr/local/etc/sqshrc), followed by
a local configuration file
$HOME/.sqshrc (this may be
overridden via the SQSHRC external environment variable). If this file is
found it is executed just like a script would be using the -i
flag.
The .sqshrc file may contain anything that could normally
be typed at the prompt, however it should be noted that at the time this
file is read sqsh has yet to establish a connection to the database, however
most commands that perform database activity, such as \go will
attempt to establish a database connection when executed (it may also prompt
you for a password if necessary). Also, if database activity is required
within this startup file, the \connect command (see COMMANDS,
below) may be executed.
After the .sqshrc file has been executed, sqsh then
parses any command line options (thus any variables set in your
.sqshrc file may be overridden by command line options). Following
that, if sqsh is run in interactive mode (i.e. without -i and
if stdin is attached to a tty), it then looks for the file provided by the
$history variable and loads the
contents of that file into the history buffers. (see BUFFERS,
below).
Immediately prior to establishing a connection to the database
(either during startup, or by an explicit \connect or
\reconnect command), the file
$HOME/.sqsh_session is
executed. The name of this file may be overridden using the
$session variable.
When a line is first read by sqsh, the first word is
separated from the line. This word is then expanded of all variables (see
Variable Substitution, below), followed by command expansion (see
Command Substitution, below). The first word of the resulting string
is then analyzed to see if it is either a valid sqsh command or
alias.
The sqsh command line follows many of the same rules as
Bourne shell, allowing file redirection, pipelining, command substitution,
and back-grounding via the same syntax.
Any line beginning with a # followed by a non-alphanumeric
character (any character other than 0-9, a-z, A-Z, and _) causes the entire
line to be ignored. Because of the possible collision with T-SQL session
specific temp-table names, the line will not be ignored if the first
character following the #, is alphanumeric.
Quoting is used to prevent the interpretation of special keywords
or characters to sqsh, such as white-space, variable expansion, or command
substitution. There are three types of quoting, escape,
single-quotes, and double-quotes.
Enclosing characters in single quotes preserves the literal
interpretation of each character contained within the quotes. A single quote
may not appear within single quotes, even when preceded by an escape. For
example:
1> \echo I can not expand '$username'
outputs
I can not expand $username
The characters \\ are used to escape the meaning (and thus prevent
the interpretation) of the character immediately following them. The \
character itself may be escaped. For example:
1> \echo I can\\'t expand '$username'
outputs
I can't expand $username
The escape character may also be used to escape a new-line in
order to perform a line continuation, in this case the new-line is discarded
and the continued line is automatically appended to the previous line, for
example:
1> \echo Hello \\
--> World!
Hello World!
Enclosing characters in double quotes preserves the literal
meaning of all characters within them with the exception of $,
', and \\. A double quote may be contained within double
quotes by escaping it.
1> \echo "\\"I can't deny it, I like $username\\", she said"
prints out
"I can't deny it, I like gray", she said
After a line of input has been read, sqsh attempts to
expand the line of any aliases (see Aliasing, below), following that
it attempts to determine if the line begins with a command keyword. Once a
line has been determined to contain a command name it has three types of
expansion performed to it: variable substitution, followed by
command substitution respectively. Finally, if a tilde was provided
on the command line, then tilde expansion will be performed and the
~ will be substituted with the corresponding HOME directory
name.
1> \echo ~sybase/err.log
may result in /home/sybase/err.log for example.
1> exec sp_helpdb
2> go > ~/db.log
may result in a file /export/home/dba/db.log for example,
depending on the Unix login and the exact OS you are using. Following this
expansion the command line is separated into words and the command is
executed.
The character $ is used to indicate variable substitution or
expansion within a word. These variables may be assigned values by the
\set command like so:
1> \set name=value
name may be a character or underscore followed by any
combination of characters, digits, or underscore, and may not contain any
special characters, such as (') and ("). The restriction on the first
character being a digit is introduced because SQL allows the representation
of money data types as $nn.nn where n is a
digit.
value may contain anything, however if it is to include
white-space, then it must be quoted (see Words & Quoting, above).
Note that in order to prevent the expansion of a variable use either single
quotes, or two \'s, like thus:
1> \echo \\$name
$name
Variables may be referenced in one of two ways:
$variable In this manner all characters,
digits, and underscores are treated as the name of the variable until
another type of character is reached (either a special character, or a
white-space). ${variable} The braces are required only when variable
is followed by a letter, digit, or underscore that is not to be interpreted
as part of its name. Note that the same effect may be achieved using double
quotes.
It should be noted that because the variables are expanded prior
to breaking the command line into words, if the contents of the variable
contain white spaces, they are treated as significant by the parser. In the
following example:
1> \set x="1 2 3"
1> \echo $x
the \echo command receives three arguments, "1",
"2", and "3", although it looks as if only one argument
was passed to it. This behavior is consistent with most shells (such as csh,
bourne shell, etc.).
Sqsh supports a second form of expansion called command
substitution. This form of expansion substitutes a command on the
command line with the output of the external UNIX command. This expansion
may be achieved by placing the command line to be executed in back-quotes
(`). For example:
1> \set password=`/sybase/bin/getpwd $DSQUERY`
1> \echo $password
ilikepickles
This example, the external program /sybase/bin/getpwd is
executed with the current contents of the
$DSQUERY environment variable,
the entire expression is then replaced with the output of getpwd
(ilikepickles) prior to executing the \set command. By default,
the output of the substituted command is first broken into words according
to the contents of the $ifs
variable prior to assembling together back into the command line. So, by
overriding the contents of $ifs
you may affect the behavior of the substitution process.
For example:
1> \set ifs=":"
1> \echo `echo hello:how:are:you`
hello how are you
This mechanism is frequently useful for parsing input files, such
as /etc/passwd into fields.
As with standard Bourne shell (and most other shells, for that
matter), a command's input and output may be redirected using a special
notation interpreted by the shell. The following may appear anywhere on the
command line, but only redirection that is specified prior to a pipe
(|) actually has any effect on the behavior of internal sqsh commands (refer
to Pipes, below).
- <word
- Use the file word as the standard input for the command. Typically
very few sqsh commands actually read anything from stdin, so this
will usually have no effect (see the \loop command).
- [n]>word
- Associate the output of file descriptor n (stdout, by default) with
file word. If this file does not exist it is created; otherwise it
is truncated to zero length.
- [n]>>word
- Append the output of file descriptor n (stdout, by default) to file
word, creating it if it does not exist.
- [m]>&n
- Redirect the output of file descriptor m (stdout by default), to
same output as file descriptor n. The order in which redirections
are specified on the command line is significant, as the redirections are
evaluated left-to-right. For example:
1> select * from select /* syntax error */
2> \go >/tmp/output 2>&1
This statement first redirects the standard output of the
\go command to the file /tmp/output, then redirects the
stderr to the same file. So, when the commands fails, the error output
will be found in the file /tmp/output.
However, by changing the order of redirection, you can
completely change the meaning:
1> select * from select
2> \go 2>&1 >/tmp/output
Msg 156, Level 15, State 1
Server 'SQSH_TEST', Line 1
Incorrect syntax near the keyword 'select'.
In this case, error output will be sent to stdout, while what
would have gone to stdout is redirected to /tmp/output (in this
case /tmp/output will be empty).
Please read the section on Background Jobs, below, for
detailed info on the interaction between file redirection and background
jobs.
A pipeline is a sequence of one or more commands separated
by a '|', each command using the stdout of the preceding program for its own
stdin. However the first command in the pipeline must be a sqsh
command, and all other commands must be external (or UNIX) programs. Any
sqsh command may be run through a pipeline, although for many of them (such
as the \set command) it doesn't really make any sense to do this. The
following is an example of a pipeline:
1> select * from syslogins
2> \go | more
This command causes the result set generated by the \go
command to be sent to the more(1) program, which
then sends it to your screen, pausing at each screen full of data (this is
the primary reason that I wrote sqsh).
There are several peculiarities in the way in which sqsh deals
with pipelines as opposed to the way in which standard Bourne shell
treats them.
Everything following the first occurrence of a pipe (|) character
is broken into white-space delimited words, including such special shell
commands as '2>&1' and other occurrences of pipes. If there are any
variables contained in these words they are expanded following the same
quoting rules as described in Words & Quoting, above, with the
one exception that all quotes are left in place. These words are then
reassembled into a single string and shipped off to /bin/sh for
processing.
In short, sqsh makes no attempt to interpret what follows the
first pipe, instead it is shipped off to a "real" shell to do the
work. The rationale behind this is that I was lazy and didn't feel like
writing all of the same bizarre variable handling, &&'ing, ||'ing,
grouping, and variable expansion rules that Bourne shell supports, and
instead I let Bourne do the dirty work.
The advantage of this method is that you can do some very complex
stuff after the pipeline, such as:
1> select * from syscolumns
2> \go | (cd /tmp; compress -c > sysolumns.Z)
Not that I can think of any real reason to do this...but you can
if you want to.
Backgrounding provides a mechanism whereby you may run any sqsh
command as a background process and continue working while it runs. Sqsh
offers two types of backgrounding:
- Deferred
- In this mode sqsh redirects all output of the background job to a
temporary file (located in the directory
$tmp_dir) while the job is
running, so that the output is not intermixed with what you are currently
working on. When the job completes you are notified of the process
completion and the output may be viewed using the \show
command.
- Non-Deferred
- This corresponds to the common idea of a background process under UNIX. In
this mode the output of the job is not implicitly redirected for you, and
thus may become intermingled with what you are currently working. The mode
selection you choose is selectable via the
$defer_bg variable (which
defaults to '1', or 'On'). Typically the only reason to not use
deferred mode is to prevent large result sets from filling up your
file system.
To specify that a job be run in the background, simply append a
& to the end of the command line, as:
1> sp_long_arduous_proc 1, 30
2> \go &
Job #1 running [xxxx]
1>
When sqsh encounters the & on the end of the command line it
spawns a child process (with a Unix process id of xxxx) then the
child process calls the \go. \go command then establishes a
new connection to the database (using the current values of the
$DSQUERY,
$username,
$password variables) and
executes the shown query. While the job is executing the commands
\jobs, \wait and \kill may be used to monitor or alter
a currently running job (see section COMMANDS, below). When any job
completes sqsh will display a notification, such as:
1> select count(*) from <return>
Job #1 complete (output pending)
2>
When a job completes, if it had no output, it is immediately
considered terminated and will not show up in the current list of running
jobs. However if the complete job has pending output, it will continue to be
displayed as a running job (with the \jobs command) until a
\show is used to display the output of the job. When you exit your
parent sqsh session and there are background jobs active then a message is
shown: You have running jobs or pending job output. You have to
process all the jobs first before being able to exit sqsh.
There is a known bug with job backgrounding when used in
conjunction with pipes, please refer to the BUGS section at the end
of the manual.
In normal isql only two buffers are maintained; the buffer
into which you are currently typing, and a buffer that contains the last
batch executed (this is kept around for when you run 'vi', or 'edit').
Sqsh maintains several distinct sets of buffers:
Work Buffer: This buffer corresponds directly to the
isql work buffer. It is the buffer into which you enter the current
batch prior to sending it to the database.
History Buffer: This is actually a chain of 0 or more
buffers (configurable by the
$histsize variable) of the last
$histsize batches that have
been run. This buffer is only maintained when sqsh is run in interactive
mode; that is, batches executed using the -i flag, or executed via
redirection from the UNIX prompt will not be maintained in history (after
all, they are already in a file somewhere).
If the variable
$histsave is True (see section
SPECIAL VARIABLES) and sqsh is in interactive mode, then the current
history buffer is written to
$HOME/.sqsh_history when you
exit. This file is then read back into sqsh the next time it is started in
interactive mode.
Named Buffers: At any time during a session the Work
Buffer, or any of the History Buffers may be copied into a named
buffer using the \buf-copy command (see section COMMANDS,
below). These buffers are lost when you exit (however you may use the
\buf-save command to save named buffers to a file).
Buffer Short-Hand
Many commands allow all of these buffers to be referenced in a
short-hand fashion, very similar to the way that
csh(1) references its commands history. Any of
these shorthands may be used for any buffer parameter described in
the COMMANDS section:
- !.
- The current work buffer.
- !!
- The last command executed (note, this is not available in non-interactive
mode as it does not maintain a history).
- !+
- The next available history entry. This is a write-only buffer, so
typically only applies to such commands as \buf-copy.
- !n
- Refers to history #n. Each time an entry is written to history it is
assigned an increasing number from the last entry, with this short-hand
you may reference any given history.
- !buf_name
- Just for consistency this is supplied as a reference to named buffer
buf_name, however buf_name without the leading '!' is also
considered correct.
- buf_name
- Refers to the named buffer buf_name.
Variables
Variables may also be contained within work buffers. Under these
circumstances the variables remain unexpanded until the buffer is sent to
the database (via the \go command), during which time they are
expanded and replaced within the buffer. This behavior may be altered via
the $expand variable. (see
Special Variables, below).
The following is an example of using variables within a
buffer:
1> \set table_name=syscolumns
1> select count(*) from $table_name
2> \go
This is the equivalent of performing the query:
1> select count(*) from syscolumns
2> \go
directly. Typically this feature is useful for reusing large
complex where clauses, or long column names.
Quoting rules apply the same in SQL buffers as they do in command
lines. That is, any variables contained within double quotes (") are
expanded and variables contained within single quotes (') are left
untouched. Thus:
1> select "$username", '$username'
2> \go
yields the results
---- ---------
gray $username
Command Substitution
As with the command line, the output of UNIX commands may also be
substituted within a SQL buffer upon execution (once again, only if the
$expand variable is set to 1,
or true). In this circumstance the command contained within back quotes (`)
is replaced with its output prior to forwarding the buffer to SQL server.
For example:
1> select count(*) from `echo syscolumns`
2> \go
Causes the strings 'echo syscolumns' to be replaced by the word
syscolumns prior to executing the command. It should be noted that
the contents of the substituted command are only executed at the time of the
\go command, not when the line of SQL is input.
New with version 2.0 of sqsh, is the ability to perform basic
flow-of-control and functions using the \if, \while,
\do, and \func commands.
Blocks & SQL Buffers
All sqsh flow-of-control commands are block-based. That is, if the
test expression of the command is met, then a block of sqsh-script will be
executed. For example, the definition of the \if command is:
\if expression
block
\fi
This block may be any number of lines of sqsh commands,
SQL, or flow-of-control statements to be executed if the expression
evaluates to a success condition (0).
Each block has its own SQL buffer for the duration that the
block is executed. That is, the following statements:
1> /*
2> ** IMPROPER USAGE OF IF BLOCK
3> */
4> select count(*) from
5> \if [ $x -gt 10 ]
6> sysobjects
7> \else
8> sysindexes
9> \fi
5> go
will yield:
Msg 102, Level 15, State 1
Server 'bps_pro', Line 1
Incorrect syntax near 'from'
because the string 'sysobjects' or 'sysindexes' were inserted into
their own SQL buffers. These buffers are discarded as soon as the end of the
block was reached, and since a \go command was not contained within
the block, no additional errors were generated.
Thus, the correct way to write the above expression would be:
1> /*
2> ** PROPER USAGE OF IF BLOCK
3> */
4> \if [ $x -gt 10 ]
5> select count(*) from sysobjects
6> go
7> \else
8> select count(*) from sysindexes
9> go
10> \fi
or, even:
1> /*
2> ** PROPER USAGE OF IF BLOCK
3> */
4> \if [ $x -gt 10 ]
5> \set table_name=sysobjects
6> \else
7> \set table_name=sysindexes
8> \fi
4> select * from $table_name
5> go
Also, note that the line number displayed in the sqsh prompt
resets to the current position in the outer SQL buffer after reaching the
\fi terminator.
Expressions
All flow-of-control statements in sqsh take an expression
to determine which block of code to execute. Just like UNIX's Bourne
Shell, this expression is simply an operating system program that is
executed by sqsh. If the command returns a success status (calls
exit(0)), then it is considered successful.
For example, with following statement:
\while test $x -lt 10
block
\done
will execute the contents of block while the current value
of $x is less than 10. Note that 'test' is a
standard UNIX program to perform basic string or numeric comparisons (among
other things). Also, unlike many shells, sqsh has no built-in version of
'test'.
Sqsh does, however, support the standard short form of 'test':
\while [ $x -lt 10 ]
block
\done
With this expression the open brace ('[') is replaced by the sqsh
parser with 'test', and the close brace (']') is discarded.
Unsupported Expressions
Currently sqsh does not support the standard shell predicate
operators '&&' and '||'. These can be performed like so:
\if sh -c "cmd1 && cmd2"
block
\done
\if statement
The \if command performs conditional execution of a sqsh
block based upon the outcome of a supplied expression:
\if expr1
block1
\elif expr2
block2
\else
block3
\fi
In this example, if expression expr1 evaluates to true,
then the block block1 is evaluated. Otherwise, if the expression
expr2 evaluates to true, then block block2 is evaluated.
Finally, if all other tests fail block3 is evaluated.
Note that, unlike Bourne Shell, every \if command must be
accompanies by a trailing \fi statement. Also the sqsh parser is not
terribly intelligent: The \else and \fi statements must be the
only contents on the line in which they appear, and they may not be aliased
to another name.
\while statement
The \while command executes a block of sqsh code for
the while a supplied expression remains true.
\while expr
block
\done
In this example, while the expression expr evaluates to
true, then the block block is evaluated.
The \break statement may be used to break out of the
inner-most \while or \for loop (more on \for
below).
\for statement
The \for command executes a block of sqsh code for
each word supplied:
\for var in word ...
block
\done
For each word supplied, the value of the variable
$var is set to the word and the
block of code is executed. Execution ends when there are no more
words in the list.
As with \while the \break statement may be used to
break out of the inner-most execution loop.
\do command
The \do command is kind of a cross between a statement and
a command.
It is a form of \go (see below for details on the
\go command) in which a block of sqsh code may be executed for
each row of data returned from the query. When the block is executed,
special sqsh variables #[0-9]+ (a hash followed by a number) may be used to
reference the values in the returned query. For example the following
command:
select dbid, name from master..sysdatabases
\do
\echo "Checkpointing database #2, dbid #1"
use #2
go
checkpoint
go
\done
would cause a CHECKPOINT command to be issued in each database on
the server.
Command line options
The \do command establishes a new connection to be used by
the block of code when executed. By default, this connection is
established to the current server (the current setting of
$DSQUERY), using the current
username ($username) and the
current password ($password).
This behavior may, however, be overridden using command line options:
- -D database
- Establishes the connection to the database as the supplied
database.
- -U username
- Establishes the connection to the server as the supplied
username.
- -P password
- Establishes the connection to the server using the supplied
password (which is hopefully a valid password for the supplied
username).
- -S server |
host:port[:filter]
- Establishes the connection to the supplied server.
- -n
- Do not create a connection for use by the \do loop. This flag is
mutually exclusive with the above flags. With this flag enabled, attempts
to perform database commands within the block will generate a
flurry of CT-Library errors.
Column variables
As mentioned above, the values of the columns in the current
result set may be determined using the special #[0-9]+ variables. Thus, the
variable #1 would contain the value of column number one of the current
result set, and #122 could contain the value of the 122'nd column (column
numbers begin at 1).
In the case of nested \do loops, values in previous nesting
levels may be referred to by simply appending an addition '#' for each
previous nesting level, like so:
select id, name from sysobjects
\do
select name, indid from sysindexes where id = #1
\do
\echo "Table ##2 (objid ##1) has index #1"
\done
\done
obviously, this isn't the way you would do this query in real
life, but you get the idea.
When expanding columns with NULL values, the column variable will
expand to an empty string (''). Also, references to non-existent columns,
such as #0, will result in an empty string ('').
As with regular sqsh variables (those referenced with a '$'),
column variables will not be expanded when contained within single
quotes.
Aborting
If the \break or \return commands are issued during
the processing of a \do loop, the current query will be canceled, the
connection used by the loop will be closed (unless the -n flag was
supplied) and the \do loop will abort.
\func command
The \func command is used to define a reusable block of
sqsh code as a function. Functions are defined like so:
\func stats
\if [ $# -ne 1 ]
\echo "use: stats [on | off]"
\return 1
\fi
set statistics io ${1}
set statistics time ${1}
go
\done
In this example a new function is established called stats
that expects a single argument, either "on" or "off".
Using this argument, stats will enable or disable time-based and
I/O-based statistics.
Once established, the function may be called like so:
\call stats on
Causing all instances of ${1} to be replaced with the first
command line argument to stats.
Command line options
Currently only one command line argument is available to the
\func command.
- -x
- Causes the function to be exported as a sqsh command. That is, the
function may be invoked directly without requiring the \call
command. This behavior is optional because command names can potentially
conflict with T-SQL keywords. When using this flag it is recommended that
you prepend a backslash (\) to your function name.
Function variables
As shown in the example above, several special variables are
available for use within the body of the function. These are:
- $#
- Expands to the number of arguments supplied to the function or script when
invoked.
- $*
- Expands to the complete list of arguments supplied to the function or
script when invoked.
- ${0}..${N}
- Expands to positional arguments to the function. ${0} is the name of the
function or the script file being invoked, ${1} is the first argument,
${2} the second and so-on, up to argument N. Note that, unlike most
shells, sqsh requires that function arguments be referred to using the
special curly brace syntax (${1}, rather than $1).
The reason for this is that $1 is a valid MONEY
value and using the curly braces gets rid of this ambiguity.
- $?
- After the invocation of a function, this will contain its return value
(see below).
Return value
A value may be returned from a function via the \return
command.
Like so:
\return N
Where N is a positive value. This return value is available
to the caller of the function via the $? variable. As convention, a
return value of 0 is used to indicate a success.
If \return is not explicitly called, the default return
value is the current value of the $? variable (which is set to 0 upon
entry of the function). Thus, if any SQL statements are invoked within the
function, the default return value of $? will be the last error code
returned during the processing of the SQL statement.
Starting with version 2.1.6, sqsh provides the same command
line options as isql to handle Kerberos network authentication.
In version 2.1.5 experimental Kerberos support was added using the
-K and -R options. -K was merely a switch to set Kerberos on. In sqsh 2.1.6
a more advanced implementation of network authentication is introduced,
although still experimental.
By using the parameters -K, -R, -V, -Z you can make use of your
defined network security settings (libtcl.cfg). The named options are
identical to the ones defined for isql.
- -K keytab_file
- Keytab_file name for DCE.
- -R server_principal
- Server principal name when servername specified in interfaces differs from
the real server name.
- -V [bcdimoqru]
- Specify security options to use with the security mechanism. Each
character stands for a specific security service.
- -Z
[secmech|default|none]
- Request a security mechanism defined for Kerberos, DCE or PAM in your
libtcl.cfg file. Use secmech to specify the name of a SECURITY
entry or default for the first available entry in libtcl.cfg.
None must be specified to disable network authentication or reset
possible existing values in variables
$secmech or
$secure_options.
For example, connecting to a server using Kerberos (which happens
to be the default, i.e. first entry in libtcl.cfg [SECURITY] tab in this
example):
~$ sqsh -SSYB1502 -Uuser1 -RFC6A1502 -Z
\connect: Network authenticated session expires at:
16 Feb 2010 15:28:39 (11764 secs)
SYB1502.user1.master.1> select @@servername,@@authmech,
show_sec_services();
---------------- ----------- ----------------------------------
FC6A1502 kerberos unifiedlogin delegation mutualauth
integrity confidentiality
detectreplay detectseq
Note that the real name of the server (@@servername) differs from
the server name in the interfaces file, so we have to specify the principal
name through the -R parameter. When you do not specify the -V
parameter together with -Z, all available security options will be
enabled. When -V is specified without any security service options,
only option u for Network Authentication will be implicitly set and
the default security mechanism will be used if -Z is not
specified.
[user1@linux-fc6a ~]$ sqsh -SFC6A1502 -Uuser1 -V
Open Client Message
Layer 7, Origin 9, Severity 5, Number 1
ct_connect(): security service layer: internal security control
layer error:
Security service provider internal error -1765328352
occurred.
[user1@linux-fc6a ~]$ kinit
Password for user1@LOCALDOMAIN:
[user1@linux-fc6a ~]$ sqsh -SFC6A1502 -Uuser1 -V
\connect: Network authenticated session expires at:
16 Feb 2010 15:28:39 (10964 secs)
FC6A1502.user1.master.1>
When the connection succeeds, sqsh will store the real name
of the security mechanism in the variable
$secmech. For example:
"\echo $secmech" may show csfkrb5.
The parameter -V takes a list of characters from the possible values
of bcdimoqru. The option u enables Network Authentication, is
the default and will allways be set when using -V or -Z,
specified or not.
b - chanbinding : Channel binding
c - confidentiality : Data confidentiality service
d - delegation : Allow delegated credentials
i - integrity : Data integrity service
m - mutualauth : Mutual authentication for connection
establishment
o - dataorigin : Data origin stamping service
q - detectseq : Out-of-sequence detection
r - detectreplay : Data replay detection
u - unifiedlogin : Network Authentication
Please check master.dbo.syssecmechs for available services.
Non-existing or not supported services supplied with -V are silently
ignored. If you specify -V and/or -Z, sqsh assumes
network authentication is tried and no password is required.
If you have a network authenticated connection and want to
\reconnect using normal ASE authentication with username and password, you
have to reset the network authentication variables by specifying -Znone
For example:
[user1@linux-fc6a ~]$ sqsh -SFC6A1502 -Uuser1 -V
\connect: Network authenticated session expires at:
16 Feb 2010 15:28:39 (10764 secs)
FC6A1502.user1.master.1> \echo $secmech csfkrb5
FC6A1502.user1.master.1> \reconnect -SASE1502 -Usa -Psybase
Open Client Message
Layer 7, Origin 9, Severity 5, Number 8
ct_connect(): security service layer: internal security control
layer error:
Consistency checks performed on the credential failed
(minor status 0).
FC6A1502.user1.master.1> \reconnect -SASE1502 -Usa -Psybase -Znone
ASE1502.sa.master.1>
The first \reconnect fails because sqsh still wants to try network
authentication. However, no user principal for 'sa' exists and no ticket is
set and thus the connection fails. The second \reconnect succeeds as
the -Znone option reset appropriate variables. If the Kerberos ticket is
renewed with kinit or any other client tool, the sqsh session
must perform a \reconnect to refresh the credentials and to prevent a
premature session abort. With the command \snace you can request for
the session expiration interval. Depending on the security services that are
set, the database connection may be closed without warning as soon as the
ticket expires.
See chapter 16 "External Authentication" from the Sybase
System Administration Guide volume 1 for more information on Kerberos
network authenticationi, e.a.
The read-eval-print loop is the heart of the sqsh system and is
responsible for prompting a user for input and determining what should be
done with it. Typically this loop is for internal use only, however they are
open to the user because there are some creative things that can be done
with them.
- \loop [-i] [-n] [-e sql]
[file]
- The \loop command reads input either from a file, a supplied SQL
statement, or from a user (see the options below), determining whether the
current line is a portion of a T-SQL statement or a sqsh command, and
performing the appropriate action. When run in an interactive mode
\loop is also responsible for displaying the current prompt (see
$prompt below).
\loop completes when all input has been depleted
(end-of-file is encountered) or when a command, such as \exit
requests that \loop exit.
- -i
- Normally, if file is supplied and does not exist, \loop will
return with an error condition, usually causing sqsh to exit. By supplying
the -i flag, control will be returned to the calling loop as if
end-of-file had been reached (that is, with no error condition).
- -n
- By default, \loop will automatically attempt to connect to the
database if a connection has not already been established via the
\connect command. The -n flag disables this behavior
allowing \loop to process commands that do not require database
support.
- -e sql
- Causes \loop to process the contents of sql as if the user
had typed it at the prompt and an implicit call to \go is
automatically appended to the statement. If multiple instances of
-e are supplied, they are all sent as a single batch to the SQL
Server for processing. This option may not be used in combination with a
file name as well.
- file
- Specifies the name of a file to be used as input rather than
reading input from the user or from the -e flag.
Database Access
Given the size and complexity of sqsh (just look at the length of
this man page), it is amazing how few database manipulation commands that
there actually are. The following are commands that affect or use the
current database connection:
- \connect [-A packet
size] [-c] [-D db] [-G tds version} [-S srv] [-U user] [-P pass] [-I ifile]
[-J charset] [-K keytab] [-R server_principal] [-n] [-N appname] [-Q
query_timeout] [-T login_timeout] [-V [bcdimoqru]] [-X] [-z language] [-Z
[secmech|default|none]]
- This command is used primarily for internal use to establish a connection
to a database. If a connection is already established it has no effect,
however if a connection has not been established and
$password has not been
supplied, then the password is requested and a connection is established.
\connect accepts the following parameters:
- -A
- Specifies the size of the network TDS packets used to communicate with the
SQL server. This value must be between 512 and 8192, and be a multiple of
512. Check your SQL Server configuration to determine supported packet
sizes. This value may also be specified at run-time using the
$packet_size variable.
- -c
- By default, the \connect command uses the contents of
$database to determine the
database context that should be used upon establishing the connection
(this is used by \reconnect to preserve the current database
context upon reconnection). The -c flag suppresses this behavior
and the default database context of login is used instead.
- -D db
- Causes \connect to attempt to automatically switch the database
context to db after establishing the connection.
Using this flag is identical to setting the
$database variable prior to
establishing the connection.
- -G tds version
- Set the TDS version to use. See the global startup parameter -G for more
information on TDS version.
- -S srv |
host:port[:filter]
- The name or address of the Sybase server to connect, this defaults
to $DSQUERY if not
supplied.
- -U user
- The Sybase user to connect to the database as, this defaults to
$username variable if not
supplied.
- -P pass
- The password for user required to connect to server.
This defaults to $password if
not supplied.
- -I ifile
- The full path of an alternate Sybase interfaces file to use.
- -J charset
- The name of the client character set to communicate with the server.
- -K keytab_file
- Used for DCE user authentication.
- -R principal_name
- Use for Kerberos user authentication to specify the name of the server
principal when the name differs from the
$DSQUERY value.
See also the discussion on Kerberos support.
- -n
- Specifies that the connection must use ANSI compliant chained mode.
- -N appname
- Specify the application name the server will use for program_name in the
sysprocesses table.
- -Q query_timeout
- Set a query timeout period in seconds.
- -T login_timeout
- Specifies a maximum wait time for session setup.
- -V [bcdimoqru]
- Security services used for Kerberos support and other security
mechanisms.
- -X
- Initiates the login connection to the server with client-side password
encryption (if supported). If either SQL Server does not recognize this
option, or if the version of CT-Lib used to compile sqsh does not
support this option, then it will be ignored. This option may also be set
using the $encryption
environment variable.
- -z language
- Specifies an alternate language to display sqsh prompts and messages.
Without the -z flag, the server's default language will be used. This may
also be set using the $language variable.
- -Z
[secmech|default|none]
- Specifies the security mechanism to use for user authentication. For
example csfkrb5 for Kerberos support.
- \reconnect [-A
packet size] [-c] [-D db] [-G tds version} [-S srv] [-U user] [-P pass] [-I
ifile] [-J charset] [-K keytab] [-R server_principal] [-n] [-N appname] [-Q
query_timeout] [-T login_timeout] [-V [bcdimoqru]] [-X] [-z language] [-Z
[secmech|default|none]]
- The \reconnect command may be used to force a reconnection to the
database using a new username, server name, or password (if desired). If
this command fails, the current connection remains (if there is any),
however if it succeeds then the current connection is closed and the new
connection becomes the only active one.
All arguments that are accepted by \connect are also
accepted by \reconnect (in fact \reconnect uses
\connect to establish the new connection).
- \run
- This command will execute a script file like \loop but the
\run command will allow optional script parameters. Furthermore the
command accepts the following parameters.
- -e
- Run the script file with echo on.
- -f
- Suppress footers.
- -h
- Suppress headers.
- -l
- Suppres separator lines with pretty output style.
- -n
- Disable SQL buffer variable expansion.
- -p
- Report runtime statistics.
- -m style
- Specify output style {bcp|csv|horiz|html|meta|none|pretty|vert}.
- -i filename
- Required parameter to specify a filename to be run by sqsh.
For example: \run -p -i ~/tmp/runtst.sqsh 10 -m pretty
- \lcd dirname
- Local Change Directory. This command takes a directory name as argument
and changes the local SQSH context to this directory. You can use \lcd
- to return back to the previous directory. If you exit sqsh
then the shell is still in the same directory from where sqsh was
started.
- \pwd
- Print Working Directory. Show the name of the current local working
directory.
- \ls
- List files in the current directory. Does not take any arguments and is
basically a shortcut for \shell ls.
- \snace
- Will show the session expiration interval for a network authenticated
session, like in a Kerberos enabled session, for example.
- \go [options] [xacts]
- Sends the contents of the Work Buffer to the database, establishing
a new connection to the database if one does not already exist (by calling
the \connect above). It them displays the results of the query back
to stdout and returns, causing the Work Buffer to be cleared and
moved to the end of the History Buffer.
If the Work Buffer is empty and the
$repeat_batch variable is
set to "On", \go will attempt to re-run the last
command executed (this will only work in interactive mode if history
support is enabled).
\go accepts the following arguments:
- -d display
- If X11 support is compiled into sqsh, and X display mode is being used
(see -x, below), then display will be used as the X display
area for the result set. By default the environment variable
$DISPLAY is assumed.
- -e
- Echo the expanded SQL buffer before sending it to the server.
- -f
- Turns off the display of the footer message "(%d rows
affected)". Footer messages may also be turned off via the
$footers variable.
- -h
- Turns off all column headers. These may also be turned off via the
$headers variable.
- -m style
- Temporarily changes the display style to style for the duration of
the command. Currently supported styles are horiz (or hor or
horizontal), vert (or vertical), bcp,
csv, html, meta, pretty and none. The
display style may be permanently set via the
$style variable or the
-m command line flag.
- -l
- Suppress separator lines when using the -m pretty output style. May
also be turned off via the
$nosepline variable.
- -n
- Turns off variable expansion in the Work Buffer prior to sending it
to the server, this may also be turned off via the
$expand variable.
- -p
- Turns on output of performance statistics when the result set has been
successfully returned from the server. This may also be turned on via the
-p command line argument to sqsh, or the
$statistics variable.
- -s sec
- If the value of xacts is greater than 1, this causes sqsh to sleep
for sec seconds before executing the next transaction. Note that
the time spent sleeping is excluded from the statistical information
displayed with the -p flag.
- -t [filter]
- Filters the command batch through an external program, filter, and
prior to being sent to the SQL Server. If filter is not supplied,
then $filter_prog is used
(default is 'm4 -'). This value may also be set via the
$filter and
$filter_prog variables.
- -w width
- Overrides the value of $width
for the life of the query (see
$width below).
- -x [xgeom]
- Turns on the X11 display filter (only if X11 support is compiled into
sqsh), which causes the result set to be sent to a separate window. If
xgeom is supplied, then this value will be used as
$xgeom for the life of the
query (see $xgeom
below).
- -T xwin_title
- Specify the title name of the X result window to create. This will
temporarily override the value of
$xwin_title. Only useful to
specify -T in conjunction with -x.
- xacts
- Specifies number of times the contents of the Work Buffer should be
executed. Note that, similar to isql, a result set will only be displayed
during the final execution of the batch. Also, the contents of the Work
Buffer are only expanded once, prior to the first execution, so the
contents of the buffer will not change between subsequent executions.
- \bcp [bcp_options]
table[:slicenumber|:partition name]
- The \bcp commands acts as a sort of enhanced \go command
that redirects the result set(s) of the batch to another server via the
bcp protocol. While it is possible to \bcp the result set back to
the current server (the
$DSQUERY variable), this is
achieved more easily via a SELECT INTO.
The nitty-gritty details of \bcp go like this: First
the current SQL batch is expanded (unless the
$expand variable is set to
0) and shipped off to the database for processing. If all goes well, a
new connection is established to the destination database (as specified
via $DSQUERY or the
-S flag) to transfer the result set using bcp. Then, the output
of the source database connection is bound to the new bcp connection and
data transfer is performed. \bcp can handle multiple result sets
without any problem (including result sets returned from stored
procedures, etc.) provided that all of the result sets are valid for the
destination table.
The equivalent of a "bcp out" may be performed using
the bcp display style setting and file redirection (see the
$style variable).
- -A packet
- Specifies the TDS packet size used to communicate with the destination
server. If not supplied this defaults to the value the
$packet_size variable, or (if
that is not set), the default server packet size (usually 512 bytes).
- -b batch_size
- The number of records transferred in a single transaction between servers.
Note that reaching the end of a result causes the batch to be transferred,
regardless of the value of batch_size. The default is the entire
result set.
- -i "<initialization command>"
- Using the -i parameter you can send a SQL command to the target
server that will be executed just before the bulk copy operation is
started. This is useful if you need to truncate the target table first.
For example:
1> select * from proddb..materials
2> \bcp -SDTA -i "truncate table testdb..materials" -N -X testdb..materials
- -I ifile
- The full path of an alternate Sybase interfaces file to use.
- -J charset
- Specifies the default charset used to communicate with the SQL
Server. This defaults to the current character set (the value of the
$charset variable).
- -m maxerr
- The maximum number of batches that may fail before \bcp gives up
the ghost (default is 10). Note that this only refers to failures within a
given batch. When performing a bcp of multiple result sets to a server, if
a given result set has, say, too many columns or bad data types, then the
entire bcp process is aborted regardless of the value of
maxerr.
- -N
- Indicates that the value for an identity column in the destination table
is being supplied within the result set.
- -P password
- The password for user required to connect to server.
This defaults to $password if
not supplied.
- -S server |
host:port[:filter]
- The name or address of the Sybase server to connect, this defaults
to $DSQUERY if not
supplied.
- -T
- Transfer the data in transit without performing character set conversion
at the client side.
- -U user
- The Sybase user to connect to the database as, this defaults to
$username variable if not
supplied.
- -X
- Causes password negotiation with the destination server to be performed
using client-side encryption.
- -z language
- Specifies the language setting to use.
- table[:slicenumber|:partition
name]
- As with regular bcp, table may be either a fully or
partially specified table name in the destination server. Note that since
a new database connection is established during the bcp processes that the
database context of the connection may not be the same as the current
context, so it is usually safest to fully specify the table name in the
form database.owner.table. For partitioned tables you may supply a
slicenumber or a partition name (separate table name and partition with a
colon (:)) to bcp the data into the specified partition.
- \rpc [rpc_opt] rpc_name
[[parm_opt] [@var=]value ...]
- The \rpc command is used to directly invoke a stored procedure call
in the connected server. This command is particularly useful for
communicating with an Open Server that does not directly support language
calls.
\rpc invokes the remote procedure rpc_name with
one or more parameters that may be named (using
@var) or anonymous (by not
supplying a name). Unfortunately, due to the fact that Sybase's
implementation of RPC's, does not directly support most implicit data
type conversions (mainly between VARCHAR (the string you supply on the
command line) and the most other data types (that the remote procedure
is expecting), the syntax for the \rpc command is somewhat
complex. However, in short here is how things work:
As the \rpc command line is being parsed, sqsh
attempts to guess the data type of the parameter value based on
the format (for example if it contains only digits, it is assumed to be
an integer), sqsh then performs an explicit data type conversion
prior to calling the remote procedure call. If sqsh guesses
wrong, several flags are supplied to force it to perform the correct
data type conversion (see parm_opt).
Display Options
The following options may be supplied anywhere on the command line
and are used to affect the manner in which the result set(s) returning from
the remote procedure call are displayed:
- -d display
- If X support is compiled into sqsh, the value of display is used as
the X windows DISPLAY variable. Note, this is usually supplied with the
-x flag, below.
- -f
- Turns off the display of the footer message "(%d rows
affected)". Footer messages may also be turned off via the
$footers variable.
- -h
- Turns off all column headers. These may also be turned off via the
$headers variable.
- -m style
- Temporarily changes the display style to style for the duration of
the command. Currently supported styles are horiz (or hor or
horizontal), vert (or vertical), bcp,
csv, html, meta, pretty and none. The
display style may be permanently set via the
$style variable or the
-m command line flag.
- -r
- Request to recompile the procedure prior to execution.
- -w width
- Temporarily sets the output width to width. The output width may be
permanently set via the
$width variable.
- -x [xgeom]
- Sends output to a separate X window. If xgeom is supplied, then the
X window uses this geometry (see
$xgeom for details).
- -T xwin_title
- Specify the title name of the X result window to create. This will
temporarily override the value of
$xwin_title. Only useful to
specify -T in conjunction with -x.
Parameter Options
The following options may be supplied immediately prior to
specifying a parameter value and are used to affect the way in which
sqsh interprets the contents of the value prior to calling the
remote procedure. Although sqsh will allow any combination of these
parameters to be combined, it only really makes sense to combine the
-x flag with any other flag.
- -b
- Indicates that the value that is specified should be converted to
VARBINARY before calling rpc_name. This flag is implicit (i.e. you
need not supply it) if value starts with "0x" and
contains only digits.
- -c
- Indicates that the value that is specified should be converted to
VARCHAR prior to calling rpc_name. This flag is implicit if
value does not match any of the implicit conversions for the other
data types.
- -d
- Indicates that the value that is specified should be converted to
double (float) before calling rpc_name. This flag is implicit if
value is in valid floating point notation (e.g. 0.1, .1, 1.4e10, or
4e10).
- -i
- Indicates that the value that is specified should be converted to
integer (int) before calling rpc_name. This flag is implicit if
value contains only digits (and, optionally, a leading sign).
- -y
- Indicates that the value that is specified should be converted to
money before calling rpc_name. This flag is implicit if
value begins with a "$", and contains only digits and,
optionally, a decimal.
- -n
- Indicates that the value that is specified should be converted to
numeric before calling rpc_name. This flag is never implicit, as
value would always match either int (-i) or float
(-d); however, both of these types will implicitly be converted to
a numeric as necessary by the procedure call.
- -u
- Indicates that value should be ignored and treated as a NULL value,
This flag is implicit if value is "".
The following commands may be used to create, destroy, or
manipulate the various buffers described in the BUFFERS section,
above.
- \clear
- The \clear command will discard the current buffer and in
contradiction with the \reset command, will not save the current
buffer to the history. When sqsh is compiled with readline support, this
command will also clear the screen. (as ^l does.) The alias clear
is automatically established upon startup.
- \history [-i] [-x
count]
- Displays the last $histsize
batches that have either been sent to the database via the \go
command or cleared from the Work Buffer via the \reset
command. With option -i also display the number of times the buffer
is used and the last time the buffer was used. This information may be of
special interest when using the
$histunique feature. The
-x option may specify the number of most recent history entries to
display instead of the total list of history entries.
- \hist-load [filename]
- Load a history file and append items to the current history list. Use
$history if no filename is
specified as a parameter.
- \hist-save
[filename]
- Will save the current history buffers to the
$history file or to the
filename specified as a parameter.
- \redraw
- Returns a request back to the current read-eval-print loop for it to
redisplay the current Work Buffer. If run from non-interactive
mode, this command has no effect.
- \reset
- The \reset command corresponds directly to the isql 'reset'
command, returning a request to the read-eval-print loop to clear the
contents of the current Work Buffer and, if you are running in
interactive mode, place a copy of the buffer into the History
Buffer. The alias reset is automatically established upon
startup of sqsh for backward compatibility with isql.
- \buf-append dst-buffer
[src-buffer]
- Appends the contents of src-buffer (defaults to !.) to the contents
of dst-buffer, if it exists. If dst-buffer doesn't exist it
is created.
- \buf-copy dst-buffer
[src-buffer]
- Copies the contents of src-buffer (defaults to !., the
Work Buffer, if not supplied), to dst-buffer. Refer to
BUFFERS for information on buffer naming conventions.
- \buf-del
[buffer|range]
- Remove a history buffer from the history list. You can also specify a
range list consisting of the first and last buffer numbers separated by a
'-'. For example: "\buf-del 1-10" will delete the first 10
history entries. Another example, "\buf-del 21" will only delete
buffer number 21. Note that the history buffers will be renumbered
consecutively.
- \buf-edit [-r read-buf] [-w
write-buf]
- The \buf-edit command is used to edit the contents of a buffer and
place the changes into another buffer. This command may only be run while
in interactive mode. If read-buf is not supplied then the buffer to
be edited defaults to !., if it is not empty, otherwise it defaults to !!.
If write-buf is not supplied then the edited buffer is written back
to !..
By default, \buf-edit uses the environment variable
$EDITOR first, followed by
$VISUAL to determine which
editor to use, defaulting to 'vi' if the variable is not set.
It is important to note that as of release 1.2,
\buf-edit is no longer able to use the name of an alias to it as
the name of the editor to launch. This is primarily due to the change in
the behavior of alias (see section Aliasing, below, for
details).
The commands edit vi and emacs are automatically
established upon startup of sqsh for backward compatibility with
isql.
- \buf-get buffer
- The \buf-get command is supplied as a shorthand method of running
\buf-copy It is the equivalent of running:
\buf_append !. buffer
- \buf-load [-a] filename
[dst-buffer]
- Copies the contents of filename in dst-buffer (defaults to
!.). If the -a flag is supplied, the contents of filename
are appended to dst-buffer. Note that it is illegal to attempt to
write to the contents of the history buffer.
- \buf-save [-a] filename
[src-buffer]
- Saves the contents of src-buffer (defaults to !.) to
filename. If the -a flag is supplied the contents are
appended to filename rather than overwriting the current
contents.
- \buf-show [buffer]
- Displays the contents of the named buffer. If buffer is not
supplied, then the contents of all named buffers are displayed. This
command is slightly different from the commands above in that it is only
legal to supply a Named Buffer buffer, History
Buffers, and the Work Buffer will have no results.
The following command(s) are used to manipulate the contents of
internal variables and environment variables.
- \set [-x] [name=value
...]
- If no arguments are supplied to \set then the current values of all
variables are displayed. Otherwise the variable name is set to
value. Note that some internal variables (see SPECIAL
VARIABLES) may only be set with certain values, so this action
may fail, leaving the previous contents on name intact. The
-x flag causes the variable to be exported to the environment of
any programs launched from sqsh.
The following commands are used to view the status of, or
manipulate background jobs that are currently running, these correspond
roughly to the commands supplied by such shells as
csh(1).
- \jobs [-i]
- Displays the status of any currently running jobs, including whether or
not these jobs have pending output, how long they have been running, and
when they were started. The -i option will show some additional job
information. Note that the total run time of the job is determined from
the moment the job is marked complete by the read-eval-print loop when
polled, not when it actually ended and is flagged as terminated by the
signal handler.
- \wait [job_id]
- Will pause until job designated by job_id completes. If
job_id is a negative number then \wait will pause until
any pending jobs completes. If there are no jobs pending, or
job_id does not belong to a running job, then an error message is
displayed. Note that if multiple jobs are running, and a \wait is
issued for one of them, the other jobs may not automatically get signaled
when completed within the wait period of the specific job. The other jobs
may need to get signaled with a \wait -1 as well to be noticed
complete by sqsh.
- \kill job_id
- Terminates the job specified by job_id, throwing away any output
that may be deferred for the job. If job_id is not a running job
then an error message is displayed.
- \show job_id
- Displays the deferred output of completed background job job_id and
removes the job from the list of pending jobs (removing the defer file in
the process). If job_id is still running, or is not a valid
complete job, then an error message is displayed. You may need to issue a
\wait job_id first, to get notified of actual job completion.
As of release 1.2, sqsh supports full csh-style
command aliasing. With this feature, sqsh checks the first word of
each line, prior to any form of expansion, to see if it
matches the name of an existing alias. If it does, the command is
reprocessed with the alias definition replacing its name. Unlike csh,
however, only one form of history substitution is available within an alias:
the '!*' entry, indicating the current line being expanded. If no
history expansion is called for, the arguments on the command line remain
unchanged.
Like csh, aliases are not recursively expanded, so it is
perfectly legal to create an alias that expands to a command by the same
name.
The following command is used to create an alias:
- \alias
[alias_name=alias_body]
- If no arguments are supplied to the \alias command, then the list
of aliases currently in effect is displayed. Otherwise, it creates a new
alias with a name of alias_name and a body of alias_body; if
alias_name already exists, the body of the existing
alias_name is replaced with the new definition.
After defining the new alias, whenever sqsh encounters
a line beginning with alias_name, the remainder of the line is
replaced with alias_body before any further processing is
performed.
If the string '!*' exists anywhere within
alias_body, the arguments supplied to the alias are inserted at
that point, otherwise the argument are appended to the end of the alias
definition. For example:
1> \alias hi='\echo !* said hello'
1> hi Scott
Scott said hello
where as if the alias does not include the !* keyword,
then it behaves like so:
1> \alias hi='\echo said hello'
1> hi Scott
said hello Scott
It is perfectly legal to include a !* more than once
within a given alias_body. Currently there is no way to escape
the string !*, if you really need this feature send me mail.
- \unalias
alias_name
- Removes alias_name.
The left over commands.
- \exit [x]
- The \exit command requests that current read-eval-print loop cease
processing. When the last loop returns, sqsh
exit(1)s. You may specify a exit code as
parameter which will be stored in
$exit_value and will be used
as return value to the shell upon exit of sqsh. (0 <= x <=
255).
- \abort
- Causes all nested read-eval-print loops to abort processing, causing
sqsh to exit with an exit value of 254 (see section EXIT
STATUS).
- \read [-a] [-n] [-h] var_name
[< filename]
- Reads a line of input from the user, placing the text of the line in the
variable var_name. If the -n is used, then the trailing
new-line is left on the line of text, and if -a is supplied, then
the text of the line is appended to the existing value of var_name.
The -h flag turns off echoing of typed characters back to the user.
It is also possible to read the contents of a file using the \<
file redirection notation.
- \sleep seconds
- Causes sqsh too pause for seconds. This is useful within
scripts of batches which need to pause briefly between batches (it was
primarily useful to me for testing background jobs).
- \echo [-n] [args ...]
- Just like the UNIX echo(1), this prints its
arguments to stdout, followed by a new-line. If the -n flag is
supplied, the newline is omitted.
- \warranty
- Displays the standard GNU warranty.
- \help [command]
- Without any arguments \help displays a brief list of all available
commands, otherwise, it provides specific help for command, if
available. When help is requested on a specific command,
\help looks for the file
$help_dir/command.hlp and
displays it to stdout.
- \shell [shell
command]
- If shell command is not supplied then sqsh executes
$SHELL. If the
$SHELL variable has not been
set, then, by default, /bin/sh is executed. Otherwise, if shell
command is supplied then it is executed. The exit status of the
command executed is stored in the special $? read-only environment
variable.
- \lock
- Locks the current session until the correct password is typed. By default
\lock attempts to use the UNIX password (from /etc/passwd or
/etc/shadow) associated with the user running sqsh (if sqsh is
linked with the crypt library), however if the
$lock variable is set then
the contents of that is used for validation instead.
The following aliases are established upon startup of sqsh,
and are provided primarily for backward compatibility with isql.
These may be removed at any time using the \unalias command (either
at the prompt, or within your .sqshrc file).
- !
- The ! alias is provided as a
csh(1)-like history mechanism, and is an alias
of \buf-append. With release 0.7, this alias is provided only for
backwards compatibility with previous releases of sqsh. See
SPECIAL VARIABLES,
$history_shorthand for
details on the new shorthand mechanism (the new shorthand more closely
resembles that of csh).
- clear
- An alias for the \clear command, which causes the contents of the
current work buffer to be cleared and discarded. Also the screen will be
cleared if readline is compiled into sqsh.
- reset
- An alias for the \reset command, which causes the contents of the
current work buffer to be cleared and copied to history (if in interactive
mode).
- exit [x]
- quit [x]
- An alias for the \exit [x] command, causes the current
read-eval-print loop to complete.
- edit
- vi
- emacs
- These are provided as aliases for the \buf-edit command. See
COMMANDS-Buffers for information on the interactions between
\buf-edit and aliases.
- go
- Provided as an alias for the \go command (for obvious
reasons).
- help
- An alias for the \help command.
In-Line \go
If the variable
$semicolon_hack is set to 1
(on), then sqsh supports what is called an in-line \go feature. This
allows the current command batch to be terminated and sent to the database
in a single step by appending a ';' onto the end of the current work buffer.
This allows
1> sp_who;
To behave in the same manner as if you had typed:
1> sp_who
2> \go
Likewise, anything following the semicolon is passed to the
\go command just as if it was run as a normal command:
1> sp_who ; 2>/dev/null | more
Unlike most other isql replacements, sqsh attempts
to be smart about the semicolons. If a semicolon is contained within a set
of single or double quotes it will not be interpreted. This includes
multiple quotes. For example:
1> select "This is a multiple line
2> quote; it is smart!" ;
In the above example, only the second semicolon (the one at the
end of the line) will be interpreted. The variable
$semicolon_cmd is a string that
contains the command that will be substituted by the semicolon which is
\go by default. But you can change that to \bcp for example
and execute:
1> select * from pubs2..titles; -S... tempdb..titles
In sqsh-2.2.0 you can also set variable
$semicolon_hack2 to allow
multiple commands on one line to be fired by a semicolon. If this option is
set you cannot use the construct above to pass additional parameters to the
\go command. But of course you can change
$semicolon_cmd to your needs as
this command will be used to execute SQL batches.
echo "exec sp_who;exec sp_helpdb;\echo Done;" | sqsh -S... -U... -P...
In this example the semicolon acts as a \go command to a
SQL buffer and as a command separator for sqsh commands that will be
executed in sequence. Note that
$semicolon_hack2 takes
precedence over
$semicolon_hack.
There are several options that are configurable via the command
line options to sqsh, however these are by no means complete. There
are many aspects of sqsh's behavior that may only be modified by
setting special variables. (In fact, the command line options really only
set these variables for you).
Next to all of the variables that follow is the type of data with
which they may be set. Any attempts to set the variable with a type of data
that it does not accept will fail.
- string
- Any sequence characters.
- boolean
- A positive boolean value may be represented as either
"True", "Yes", "1", or "On" (case
insensitive) and a negative boolean value may be represented as
"False", "No", "0", or "Off" (case
insensitive). However, internally the value of the variable will always be
represented as either a "1" or "0".
- path
- Must be the path name that is readable by the sqsh
program.
- int
- Must be one or more digits. Note that some variables also restrict the
range of the integer.
- date-spec
- This is a string of the format used to specify dates and times for the
date(1) command, or the strftime(3C)
and cftime(3C) standard C library functions. For example '%H:%M:%S'
specifies a time of hours in 24 hour format, followed by a colon, followed
by minutes, followed by a colon, followed by seconds.
- float-format
- A string of the format p.s, where p is the total precision
of a floating point value (the total number of digits to be displayed,
including those following the decimal) and s is the scale of the
value (the total number of digits following the decimal to be
displayed).
Variables
The following variables have special meanings within sqsh
and the setting of these variables alter the behavior of the shell.
- $? (int)
- This read-only variable may contain the following return value:
- The most recent error number returned from the SQL Server (@@errno) of
severity > 10 (above informational messages).
- The exit value of a previously executed pipe command.
- The return value of the most recently executed sqsh function.
- The result of the last executed \if statement:
- 0 - The test evaluated to True.
- 1 - The test evaluated to False.
- 2 - There was an error in the test specification.
- $# (int)
- Contains the number of arguments passed into the sqsh function or
script.
- $* (string list)
- Expands to the complete list of arguments supplied to the function or
script when invoked.
- ${0}...${N} (int)
- Used to reference positional function arguments. Argument ${0} is the name
of the function being called, ${1} is the first argument, etc.
- $$
- Expands to the process ID of the current running sqsh session.
- DISPLAY
- May contain the name of the DISPLAY the X-server uses to put the XWindows
result window when using \go -x. Defaults to the
$DISPLAY shell
environment.
- appname
- Contains the name sqsh uses to identity itself to the server.
Defaults to sqsh-2.1.7. The application name can be retrieved from the
sysprocesses table like:
select program_name from master.dbo.sysprocesses where spid=@@pid;
- autouse
(string)
- Note: the meaning of this variable has been deprecated.
If $autouse is
set, and the $database
variable has not been set, then this variable causes \connect to
perform a "use
$autouse" once a
connection has been established.
This variable may also be set using the -D command line
option.
- banner (boolean)
- Turns off the banner message displayed on startup, this variable defaults
to 1 and may also be turned off using the -b command line
argument.
- batch_failcount
(int)
- This internal variable is used to keep track of the number of batches that
have failed to execute (essentially, the number of times that the error
handler was called).
A batch is considered failed whenever an error of severity
$thresh_fail is
encountered. When
$batch_failcount reaches
$thresh_exit sqsh
exits with an exit value of the total number of batches that have
failed. Setting
$batch_failcount to the
string "" will cause it to reset to zero, any other value may
have unpredictable results.
See EXIT STATUS for details.
- batch_pause
(boolean)
- Causes a "Paused. Hit enter to continue..." message to be
displayed after each batch is executed. This variable, in conjunction with
$echo is good for debugging
SQL scripts specified with the -i option.
- bcp_colsep
(string)
- Used as a separator between columns during BCP style output (see the
$style configuration variable
and the -m option to the \go command). The default setting
is "|".
- bcp_rowsep
(string)
- Used as a separator between rows during BCP style output (see the
$style configuration variable
and the -m option to the \go command). Note that, a newline
("\n") is automatically appended and should not be supplied. The
default setting is "|".
- bcp_trim
(boolean)
- Controls whether or not BCP style output trims trailing spaces from fixed
length columns. The default is "True".
- builddate
(none)
- Read only variable specifying the date when the sqsh executable was
compiled.
- buildtime
(none)
- Read only variable specifying the time when the sqsh executable was
compiled.
- chained
(boolean)
- If set then sqsh uses the "chained" transaction mode (aka
"AutoCommit off"). Setting this has NO effect on the current
connection. It can be set via the command line argument -n.
- charset
(string)
- If this variable is set prior to establishing a connection with SQL
Server, then during the connection sqsh will request that the
server transform to and from the requested charset. After
establishing a connection, this variable is automatically set to the
current character set in use.
- clear_on_fail
(boolean)
- Normally, whenever the \go command is run, sqsh clears the
current work buffer of its contents, moving them to history. Setting
$clear_on_fail to 0, leaves
the current work buffer intact if a failure is encountered while sending
the contents to the database. The default value is 1, or on.
- colsep (string)
- Causes the string colsep to be used to delimit SQL column output
columns, this defaults to " ", it may also be set via the
command line argument -s.
- colwidth
(int)
- Used to control the maximum column width displayed by the pretty
display style (see $style
below). If a row of a column exceeds this width, it will be wrapped in a
relatively visually appealing manner at
$colwidth characters. Note,
however, that if there is enough screen width to hold all columns
$colwidth may be exceeded
until the width of the screen is reached.
- database
(string)
- If this variable is set prior to establishing a connection to the SQL
Server, the a "use
$database" is performed
immediately after the connection is established. Once a connection has
been established this variable will automatically be set to the current
database context.
- date (date-spec)
- This variable may be set with a date format (see the man page for
date(1)), and the variable expands to the
current date in the supplied format. The default format for this variable
is %d-%b-%y (e.g. 02-Feb-1996).
- datefmt
(date-spec)
- This variable may be set with a date format similar to
$date and is used to control
the display format of all SQL Server DATE columns. (Similar to
$datetime.) Note that only 63
bytes are available in total for the expanded string and the remainder
will be truncated.
- datetime
(date-spec)
- This variable may be set with a date format similar to
$date and
$time and is used to control
the display format of all SQL Server DATETIME, BIGDATETIME and
SMALLDATETIME columns. Note that only 63 bytes are available in total for
the expanded string and the remainder will be truncated.
Note that this features relies upon the operating system
specific locale information and the setting of
$localeconv for determining
such things as the name of the month and day, rather than going through
the CT-Lib locale information. This means that the date format could
potentially miss-match the locale as requested using the -z flag.
For example, if sqsh is run on an operating system configured for
US English, but requests French as the language of choice using
-z, the use of
$datetime will cause all
date information to be displayed in US English rather than French.
Ordinary characters defined in the variable are left in place
without any conversion. Characters introduced by a '%' character are
replaced during display of a column value according to the definitions
in the strftime manual page.
- []
- Any contained between a pair of braces ('[' and ']') will be removed when
displaying SMALLDATETIME columns. This feature is particularly useful for
removing the seconds, milliseconds or microseconds values which are not
applicable to SMALLDATETIME anyway. For DATETIME or BIGDATETIME columns,
only the actual braces will be removed.
- %q
- Specifies the milliseconds for DATETIME and TIME and microseconds for
BIGDATETIME and BIGTIME data types. In previous versions of sqsh the
%u specifier was used for the
millisecond part of the datetime datatype. However, as
%u is used by strftime
to denote the day number of the week, this is replaced by
%q since sqsh-2.3. For
example when using the default C locale:
1> \set datetime='%e %b %Y %H:%M[:%S.%q]%p'
1> select convert(bigdatetime,getdate())
2> select convert(smalldatetime,getdate())
3> go
-----------------------------
22 Jul 2013 13:26:52.938000PM
-------------------
22 Jul 2013 13:27PM
- debug (string)
- If sqsh has been compiled with debugging enabled (-DDEBUG), this
variable may be used to control the amount of debugging output displayed.
$debug may be set to a pipe
(|) delimited (logical OR) set of the following words to turn on various
pieces of debugging: ALIAS, AVL, BCP, DISPLAY,
ENV, ERROR, EXPAND, FD, HISTORY (abbr.
HIST), JOB, READLINE (abbr. RL), RPC,
SCREEN, SIG, SIGCHLD (or SIGCLD), TDS
or ALL. Can also be set through the -l startup option.
- debug_tds_capture
(string)
- When TDS debugging is enabled and this variable is defined with a
valid file name, a debugging trace will be logged into this file that can
be analyzed with Ribo. You might need the devlib versions of the
OpenClient library to link with sqsh to be able to use this option. See
for more information the ct_debug function in the Sybase SDK
documentation.
- debug_tds_logdata
(string)
- When TDS debugging is enabled and this variable is defined with a
valid filename, a debugging log will be written by OpenClient with all
possible debugging info (CS_DBG_ALL). See also option above.
- defer_bg
(boolean)
- Normally, when a job is run in the background (via a '&' on the
command line), the output of the job is deferred to a temporary file
(located in $tmp_dir) until
the user requests the output to be displayed using \show
jobid. This way the results of the job will not interfere with what
the user is doing. Setting this variable to false will result in no
deferred output files being created and output sent to the screen
immediately
- echo (boolean)
- Setting $echo to on (1)
causes each command submitted to the database via the \go command
to be displayed prior to the output. This variable defaults to 0 (or off),
and may also be set using the -e command line option.
- encryption
(boolean)
- Setting the $encryption
variable prior to establishing a connection to the server will cause the
login connection to be initiated using client-side password encryption.
This variable may also be set using the -X command line option.
Client-side password encryption will also occur when using the -X
option on the \connect, \reconnect or \bcp commands.
Please note that the Sybase ASE setting for the net password encryption
reqd (15.0.2) configuration parameter may enforce you to use client
side password encryption. sqsh-2.1.9 supports RSA password
encryption when the CT-Lib version in use supports it. RSA password
encryption is required if the above mentioned ASE configuration parameter
is set to 2. Older version of sqsh only supports a value of
1 (CT-Lib internal encryption algorithms).
- exit_failcount
(boolean)
- Settings this value to 1 causes sqsh to return an exit status of
$batch_failcount rather than
0, upon a non-error termination. See EXIT STATUS for
details. The default value is 0.
- exit_value
(int)
- When you exit sqsh by specifying an exit code, like \exit 3 or
using one of the aliases exit or quit commands, then this
value is assigned to the
$exit_value variable. You can
also assign a value using the \set command. When sqsh determines
this variable has a non-zero value during termination, this value will be
used as exit code. See EXIT STATUS for details.
- expand (boolean)
- By default when the \go command is executed, the contents of the
current work buffer is expanded of all environment variables prior to
being sent to the database for execution. By setting this variable to
"0", the buffer will no longer be expanded before being sent to
the database. This is useful when you either (1) have strings in the
buffer that contain a '$' and you don't want them to be expanded, or (2)
for performance reasons; it takes time (and an extra copy of the buffer)
to perform the variable expansion.
- filter (boolean)
- Toggles filtering of the SQL batch through an external program (defined by
the $filter_prog variable,
below) prior to being sent to the SQL Server. Default is '0', or
'off'.
- filter_prog
(string)
- Defines the external program through which the SQL batch will be filtered
prior to being sent to the SQL Server. This variable is ignored if
$filter is set to '0' or
'off'. The default is 'm4 -'.
- float
(float-format)
- Defines the display format (the precision and scale) for all floating
point values displayed by sqsh. The default is '18.6'. Note that values
exceeding the defined precision are not truncated, so setting this value
too low may cause columns in a result set to be miss-aligned.
- Toggles the "(%d rows affected)" following a result set. The
default for this variable is '1'.
- Toggles the column headers preceding a result set. The default for this
variable is '1'.
- help_dir
(path)
- This is the location of the help files used by the \help command,
typically it defaults to something like /usr/local/lib/sqsh/help.
- hist_auto_save
(int)
- When variable $histsave is on
and the $hist_auto_save
variable has a value greater than 0, then the history will be
automatically saved to
$history after
$hist_auto_save modifications
of the history buffers. When the value is 0 (default), then no automatic
history save will be performed.
- histmerge
(boolean)
- When this option is on, sqsh will merge the contents of the history on
disk with the history in memory before writing the history back to disk.
This is to prevent data loss in the history file when other sqsh sessions
have also written to the same history file on disk. This option is off by
default which will just overwrite the existing history file when you exit
sqsh or the history is being automatically saved because of
$hist_auto_save being
set.
- histnum (int)
- Contains the history number that will be assigned to the current command
batch as soon as the \go command is executed. This variable should
be considered read-only. See also the discussion on the
$histunique variable.
- history
(path)
- This is the location of the history file used to store and retrieve a
user's history during start-up and shutdown. This defaults to
$HOME/.sqsh_history. This
variable is expanded each time it is referenced by sqsh, much in the same
way that $prompt is
referenced each time the prompt is displayed.
- history_shorthand
(boolean)
- This variable is only meaningful within an interactive session. If set, it
turns on the ability to append any named buffer or history buffer onto the
current work buffer in a 'sh' history style, such as '!40'. Be careful
with this feature, sqsh is not terribly intelligent with looking
for history shorthand, so it is possible that it may get confused
(although, it is smart enough to ignore !'s in quoted strings).
- histsave
(boolean)
- The value of this variable is used by sqsh to indicate whether the
history should be saved to
$history prior to termination
of sqsh.
- histsize
(int)
- The value of this variable is used to alter the maximum number of history
entries are maintained by sqsh (the default is 10). Note that
decreasing the value of this variable causes some history entries to be
lost.
- histunique
(boolean)
- If set, sqsh maintains a MRU-LRU order of executed buffers and does
not store duplicate command buffers. For example, observe the following
situation:
LINUX1502.user1.master.1> \history
(1) sp_who
(2) grant role mon_role to sa_role
(3) select * from monProcessActivity
(4) select @@authmech,show_sec_services()
(5) select @@servername,@@authmech,show_sec_services()
LINUX1502.user1.master.1> sp_who
LINUX1502.user1.master.2> go
... output omitted
LINUX1502.user1.master.1> \history
(1) grant role mon_role to sa_role
(2) select * from monProcessActivity
(3) select @@authmech,show_sec_services()
(4) select @@servername,@@authmech,show_sec_services()
(5) sp_who
sp_who is the last executed command and the buffer -
originally the last in the list - is now on top of the list. When an
already existing buffer is reused, the value of the
$histnum variable is not
changed.
- hostname
(string)
- Used during the connection process to indicate to SQL Server the name of
the host from which sqsh is connecting. This variable may also be
set using the -H flag.
- ifs (string)
- The list of Internal Field Separators.
- ignoreeof
(boolean)
- By default, sqsh terminates if the user presses ^d (control-D) on
an empty line and readline support is compiled in. If
$ignoreeof is set in the
sqshrc file you get a warning message instead:
CTRL-D: Use "exit" or "quit" to leave the sqsh shell.
This is equivalent to using "set -o ignoreeof" in
the bash shell.
- interactive
(boolean)
- This is a variable used internally and should probably not be altered by
the user. If $interactive is
'0', then the prompt is not displayed, the history is neither read nor
written and some user messages are suppressed.
- interfaces
(path)
- This is the full path name of the interfaces file, it defaults to
$SYBASE/interfaces.
- keytab_file
(string)
- Used in Kerberos and DCE user authentication security mechanisms.
Corresponds with the -K startup option.
See also the discussion on Kerberos Support.
- keyword_completion
(int/string)
- This variable only applies if GNU Readline support has been compiled into
sqsh.
$keyword_completion is used
to control the T-SQL keyword completion feature in readline, and may be
set using either an integer between 0 and 4, or one of the strings
none, lower, upper, smart, or exact. If
it is set to either 0 or none, then no keyword completion is
performed (this is the default). lower or 1, causes sqsh to
complete the keyword in lowercase, regardless of the case that the
partially completed keyword was typed. upper or 2 forces completion
to be performed in upper case, smart, or 3, bases the decision on
case upon the first character of the partial keyword, and exact
completes the keyword in exactly the same case as defined in the
.sqsh_words (for the built-in T-SQL keywords, this will be lower
case). New in sqsh-2.5 is that when regular Readline completion
does not match the typed string with a keyword, then filename completion
will be tried in the current directory. For example:
SYBASE.sa.master.1> \lcd $SYBASE/$SYBASE_ASE/scripts
\lcd: local directory changed to: /opt/sybase/ASE-15_0/scripts
SYBASE.sa.master.1> \run -n -i ./instm<TAB>
results in the completed filename
"./instmsgs.ebf".
- keyword_dynamic
(boolean)
- This variable controls the dynamic loading of keywords in the completion
list when initially logging in to the server or when the database context
is changed using the use database command. When this variable is
set to 'On' (default is 'Off'), then the query that is provided through
the $keyword_query variable
is executed and the query result set is loaded into the Readline
completion list. This will only work for Sybase ASE and Microsoft SQL
servers. This variable also controls dynamic loading of a column list to
be auto- completed by Readline. When an object name is followed by a dot
and TAB completion is requested, sqsh dynamically creates a list of
columns that belongs to the object (table, view, procedure) and allows for
Readline TAB completion of the column or parameter names. This feature is
only available if GNU Readline support has been compiled into sqsh
and $keyword_completion is
set to a value greater than zero. In sqsh-2.4 it is also possible to use
the object alias in the SQL buffer for auto-completion. For example when
you enter the following query in the buffer and type the TAB key twice
after the alias 'd' and the dot, a list of column names will be produced
for the 'sysdatabases' table for further completion:
SYBPROD.sa.tempdb.1> select * from master..sysdatabases d,
SYBPROD.sa.tempdb.2> master.dbo.sysusages u
SYBPROD.sa.tempdb.3> where d.<TAB><TAB>
d.audflags d.def_remote_loc d.durability d.status2
d.audflags2 d.def_remote_type d.logptr d.status3
d.crdate d.deftabaud d.name d.status4
d.dbid d.defvwaud d.spare d.suid
d.defpraud d.dumptrdate d.status d.version
SYBPROD.sa.tempdb.3> where d.
This works both for the T-SQL join syntax and the ANSI inner,
outer, left and right join syntax. Note that sqsh is now able to perform
cross database auto-completion as well.
- keyword_file
(string)
- If Readline support has been compiled into sqsh, and sqsh is
being run in interactive mode, the contents of this file are used for
keyword tab completion by Readline rather than the default set of T-SQL
syntactical keywords. The default is
$HOME/.sqsh_words. When
$keyword_dynamic is enabled
this takes precedence and overrules the list loaded from
$keyword_file.
- keyword_query
(string)
- This variable contains the query that will be executed when a change of
database is detected or during initial login (Msg 5701). The default query
is:
select name from sysobjects order by name
But you can supply a different query that suits your needs
even better. E.g.
\set keyword_query="\\
select name from sysobjects \\
where type in ('U','V','P','S') \\
union \\
select name from sybsystemprocs..sysobjects \\
where type='P' \\
order by name"
This feature is controlled by the variables
$keyword_completion and
$keyword_dynamic and is
only available if GNU Readline support has been compiled into
sqsh.
- language
(string)
- The $language variable is
used while establishing a connection to the server to specify the national
language used to display system prompts and messages. The variable will
automatically track the current language setting of the server. This may
also be set via the -z flag.
- lineno (int)
- This is an internal variable and should not be altered by the user. It is
used to maintain the line number that is being typed into within the
current work buffer.
- linesep
(string)
- Used to configure the line separator for the horizontal display style,
this defaults to "\n\t".
- localeconv
(boolean)
- A boolean variable that when set to true will result in the Operating
System locale to be used for displaying all datetime (DATETIME,
SMALLDATETIME, TIME, DATE, BIGDATETIME and BIGTIME) and the numeric,
decimal, real, float and money/smallmoney datatypes in the result set.
When this variable is set to false (i.e. the default), sqsh will use the
internal C/POSIX locale to determine how to display these datatypes. For
example:
~$ export LANG=nl_NL.utf8
~$ locale -ck LC_TIME
LC_TIME
abday="zo;ma;di;wo;do;vr;za"
day="zondag;maandag;dinsdag;woensdag;donderdag;vrijdag;zaterdag"
abmon="jan;feb;mrt;apr;mei;jun;jul;aug;sep;okt;nov;dec"
mon="januari;februari;maart;april;mei;juni;juli;augustus;september;oktober;
november;december"
am_pm=";"
...
~$ sqsh -Llocaleconv=On -Ldatetime="%A %e %B %Y" -C"select getdate()"
---------------------------
maandag 22 juli 2013
(1 row affected)
~$ sqsh -Llocaleconv=Off -Ldatetime="%A %e %B %Y" -C"select getdate()"
---------------------------
Monday 22 July 2013
(1 row affected)
Also, depending on the locale, the decimal specifier in money,
numeric, decimal, float and real datatypes may be displayed as a
",". Note that sqsh does not take the thousands_sep
into account when displaying numerical data values.
- lock (string/write-only)
- Defines the password to be used by the \lock command. If unset or
set to the string "NULL", then the UNIX password of the user
running sqsh is used instead (if possible). Note that
$lock will always expand to
the string "*lock*" if referenced.
- login_timeout
(int)
- The number of seconds to wait when attempting to create a new connection
to a data server. Default is 0 (infinite wait). See also the -T
command line option.
- max_timeout
(int)
- Controls the number of times a query needs to reach its time-out value
before the session is aborted. See
$query_timeout and the
-Q command line flag. The following messages will be displayed and
sqsh exits with value 255 when the
$max_timeout limit is
reached.
Query or command timeout detected, session aborted
The client connection has detected this x time(s)
Aborting on max_timeout limit
- maxlen (int)
- Controls the maximum amount of data that will be displayed (in any display
mode) in a single column. This setting will automatically truncate the
output of particularly large data types (such as TEXT) to the value
supplied. The default setting is 32768 bytes (32KB).
- newline_go
(boolean)
- This flag is used as a horrible kludge to support an "empty"
alias for the \go command, that is, the equivalent of supplying
"-c ''" or just "-c" on the command line. When on, an
empty line is interpreted as a call to the \go command. This
feature is not recommended but is supplied for completeness.
- nosepline
(boolean)
- Suppress the separator lines with the pretty output style.
- output_parms
(boolean)
- Flag used to enable or disable the display of output parameter result sets
from stored procedures. The default is to enable the display.
- p2faxm (int)
- Implements the feature Print messages to File (P2F). This variable is used
in conjuction with $p2fname
and specifies a threshold on the number of messages per batch that will be
send to the terminal window. If the threshold is exceeded, the remaining
messages will be send to the specified file. The default value is NULL
which disables the P2F feature. Also an assigned value of 0 disables this
feature. This feature will only work in interactive mode and is to prevent
an accidental flood of server messages scrolling over the screen. For
example:
SYBASE.sa.tempdb.1> \set p2fname=/tmp/sqsh_p2f.out
SYBASE.sa.tempdb.1> \set p2faxm=10
SYBASE.sa.tempdb.1> create clustered index keys_cx on keys(id)
SYBASE.sa.tempdb.2> with ignore_dup_row
SYBASE.sa.tempdb.2> go
Warning: deleted duplicate row. Primary key is '0'
Warning: deleted duplicate row. Primary key is '1'
Warning: deleted duplicate row. Primary key is '2'
Warning: deleted duplicate row. Primary key is '3'
Warning: deleted duplicate row. Primary key is '4'
Warning: deleted duplicate row. Primary key is '5'
Warning: deleted duplicate row. Primary key is '6'
Warning: deleted duplicate row. Primary key is '7'
Warning: deleted duplicate row. Primary key is '8'
Warning: deleted duplicate row. Primary key is '9'
Warning: Number of printed server messages exceeds p2faxm=10 limit for current batch.
Remaining server messages will be printed to file: /tmp/sqsh_p2f.out
- p2fname (path)
- Contains the filename for the Print messages to File (P2F) feature
described above. Default is NULL which disables the P2F feature. If a file
is specified that already exists, then new data will be appended.
- packet_size
(int)
- Defines the size of the TDS packets used to communicate with SQL. Changing
the value of the variable will not affect the current connection but will
take effect upon the next \reconnect command. Specifying a value of
NULL indicates that the default packet size is desired.
- password
(string/write-only)
- This is the user's current password. A NULL password may be assigned using
an explicit "NULL" string. For security reasons, when referenced
the $password variable will
always expand to the string "*password*".
- password_retry
(boolean)
- When the variable is on and sqsh started in interactive mode, sqsh will
ask for the password again if login failed. When set to 'off', sqsh will
terminate immediately. Default is on.
- principal
(string)
- Used in Kerberos user authentication as the Server principal name when it
differs from the $DSQUERY
name. Corresponds with the -R startup option.
See also the discussion on Kerberos Support.
- prompt (string)
- This variable is used by sqsh to build your current prompt. Any
variables contained within
$prompt are expanded each
time the prompt is displayed. The default value for this is '${lineno}>
'. See also the discussion on color support below.
- prompt2
(string)
- This contents of this prompt are expanded and displayed during interactive
use when sqsh requires additional input, such as during a line
continuation. The default value is '--> '.
- query_timeout
(int)
- Number of seconds to wait for a query to return data. If the timeout is
reached the query is aborted (canceled). See also
$max_timeout and the
-Q command line option.
- rcfile (path)
- Contains a colon (:) delimited list of sqsh resource (sqshrc) files. The
default setting is /usr/local/etc/sqshrc (unless overridden by the
--prefix option when sqsh was compiled) followed by
$HOME/.sqshrc).
- readline_histignore
(string)
- If readline support has been compiled into sqsh, you can control
which commands or statements on the command line will be filtered from the
readline history file specified by
$readline_history. It is a
colon (:) separated string or a string containing a regular expression
that is identified by "RE:". For example:
\set readline_histignore='go:lo:mo:exit:quit:vi:!!:GO'
or
\set readline_histignore='"RE:^[glm]o$|^cd |^exit$|^quit$|^vi$"'
The regular expression in the second example starts with
RE: and it is recommended to supply the string between quotes and
double quotes to prevent expansion and display problems due to the pipe
characters. The regular expression is evaluated case insensitive.
- readline_history
(string)
- If readline support has been compiled into sqsh, the contents of
the readline line-by-line history will be written to the file specified by
the $readline_history
variable. The default is
$HOME/.sqsh_readline.
- readline_histsize
(int)
- If readline support has been compiled into sqsh, the value of
$readline_histsize specifies
the number of lines that are saved in the readline line-by-line history.
Setting this to a value of 0 causes every line to be saved. The default
value is 100.
- real (float-format)
- Defines the display format (the precision and scale) for all real values
displayed by sqsh. The default is '18.6'. Note that values exceeding the
defined precision are not truncated, so setting this value too low may
cause columns in a result set to be miss-aligned.
- repeat_batch
(boolean)
- When set to On or True, a \go executed with an empty
SQL Buffer will cause the previous batch to be re-executed.
- secmech
(string)
- The name of the security mechanism used for user authentication. For
instance csfkrb5. When using the -Z option, the name of the
security mechanism can be specified, or when no secmech is supplied, the
OpenClient will use the default, i.e. the first security entry from the
$SYBASE/$SYBASE_OCS/config/libtcl.cfg
file. Note that the name used must match the name of the corresponding
secmech entry in the objectid.dat file. When the connection to the
server is setup, the actual secmech name will be stored in the
$secmech variable.
- secure_options
(string)
- Describe the security options used for user authentication security
mechanisms. Corresponds to the -V startup option.
See also the paragraph on Kerberos Support.
- script (string)
- If sqsh is run using the -i flag, then this variable
contains the name of the script being executed.
- semicolon_cmd
(string)
- When $semicolon_hack (see
below) is enabled, the contents of this variable is executed when a
semicolon is encountered in the SQL Buffer. This variable defaults
to the string '\go'.
- semicolon_hack
(boolean)
- Toggles on the ability to use a ';' as an in-line command terminator. This
feature is not recommended and is only in here because enough users
complained. See section COMMANDS, In-Line \go.
- semicolon_hack2
(boolean)
- Toggles on the ability to use multiple ';' as an in-line command
terminator. See section COMMANDS, In-Line \go.
- session
(string)
- The location of the session file that will be processed just before
connecting to a server. The variable will be expanded so it may contain
environment variables.
- SHELL (string)
- The name of the shell to be used to execute pipes and to be used by the
\shell command (default '/bin/sh').
- statistics
(boolean)
- Setting $statistics to 1
causes timing statistics to be displayed upon the successful execution of
every batch of SQL. This variable may also be set via the -p
command line flag, or by supplying -p to the \go command.
$statistics defaults to
0.
- style (string)
- Selects result set display style. Currently eight styles are supported.
The horiz (which may also be defined as hor or
horizontal), closely resembles the output of isql, with the
traditional columnar output.
The vert (or vertical) style rotates the output,
so that every line is represented by a column name followed by a column
value. This is nice for looking at particularly wide output.
The bcp style displays results in a format amenable to
bcp'ing the result set back into another table. That is, every column
value is separated by
$bcp_colsep with the final
column separated by
$bcp_rowsep followed by a
newline (\n). If
$bcp_colsep or
$bcp_rowsep are not defined
then '|' is used as the default separator. Note that this output does
not work well with COMPUTE columns, and uses the default conversion
methods for all data types (that is, datetime columns may
truncate the millisecond).
The csv display style outputs all result sets in the
form of a comma separated construct. This mode is ideal to import result
sets into spreadsheet programs, for instance.
The html display style outputs all result sets in the
form of an HTML <TABLE> construct. This mode is ideal for the use
of sqsh as a CGI application.
The meta display style outputs only the meta-data
information associated with the result and discards the actual row
results. This mode is useful for debugging the result sets generated
from a full passthru Open Server gateway, or for those interested in
what is really coming back from the server.
The pretty display style generates a fluffy table-like
output using regular ASCII characters for borders. This mode does not
perform any explicit column wrapping, like the horiz display
mode. However, the
$colwidth variable can be
used to control the maximum width of a given column on the screen. If
the column exceeds
$colwidth characters wide,
it is wrapped in a relatively visually appealing manner. Note that
$colwidth may be exceeded
if there is enough screen width to hold the columns without
wrapping.
The none display style suppresses all results from
being displayed (however it does actually retrieve result information
from the SQL Server). This is particularly useful when used with the
-p flag (or the
$statistics variable) for
gathering accurate performance statistics.
- term_title
(string)
- When this variable is set, sqsh will reset the name of the current
terminal (xterm) window it is running in. Works for xterm, rxvt, putty and
MS-Windows CMD windows. The name consists of the sqsh startup name
appended with the expanded value of the
$term_title variable.
- thresh_display
(int)
- Sets the minimum SQL Server error severity that will display a message to
the user, the default is 0 and valid ranges are between 0 and 22,
inclusive.
- thresh_exit
(int)
- Defines the maximum number of errors of severity level
$thresh_fail that may be
encountered before sqsh aborts. This is useful primarily for
non-interactive scripts, but is allowed on an interactive session. Setting
$thresh_exit to a value of 0
disables this feature. See section EXIT STATUS for details.
- thresh_fail
(int)
- Sets the minimum SQL Server severity level that is to be considered a
failed batch. The minimum for this value is 0 (meaning any error that is
not an information message), and the maximum is 22. Whenever
$thresh_fail is crossed, the
variable $batch_failcount is
incremented by 1. See section EXIT STATUS for details.
- time (date-spec)
- This variable may be set with a time format (see the man page for
date(1)), and the variable expands to the
current time in the supplied format. The default format for this variable
is %H:%M:%S (e.g. 14:32:58).
- timefmt
(date-spec)
- This variable may be set with a time format similar to
$time and is used to control
the display format of all SQL Server TIME and BIGTIME columns. (Similar to
$datetime.) Note that only 63
bytes are available in total for the expanded string and the remainder
will be truncated.
- tmp_dir (path)
- This contains the directory to which temporary files used internally by
sqsh are to be written. These files are generated either during
buffer editing (the \buf-edit command), or to maintain output defer
files for background jobs. The default value for this variable is
/tmp.
- usedbcheck
(boolean)
- When this variable is set to 'On' (default is 'Off') and a database name
is provided with the -D parameter and sqsh is run in batch mode, i.e.
non-interactive, then a check will be performed if the specified database
is accessible, otherwise sqsh is aborted with exit code 254. Also the
following error message will be shown:
sqsh: ERROR: Unable to use database '...' in batch
mode
This is to prevent that a SQL script is inadvertently executed
in the wrong database, usually the default database of the login (master
for example).
- username
(string)
- The name of the user currently connected to the database.
- version (none)
- This read-only variable contains the current version number.
(sqsh-2.1.7)
- width (int)
- The current width of the SQL output.
- xgeom (string/int)
- If X11 support is compiled into sqsh, this value is used to
configure the default window size (in characters) of the X display. This
variable must be of the format WxH or just W, where W
is the width of the window and H is the height of the window. If
the height of the window is not supplied, then 25 lines is assumed. If
$xgeom is not set, then
$width is used as the default
width and the height is assumed to be 25. If neither is set, then 80x25 is
assumed.
- xwin_title
(string)
- If X11 support is compiled into sqsh and an X11 result windows is
requested by using the -x parameter of the \go or
\rpc commands, then this variable will be used to set the title
name of the window. Can be temporarily overridden with the -T
option of the \go and \rpc commands.
As with most shells, sqsh allows a file containing SQL and
script commands to be executed directly via the magical UNIX #!
convention. On most UNIX platforms, when the operating system encounters the
bytes #! as the first two bytes of an executable file it will
automatically pipe the file through the interpreter specified immediately
after the #!. For example, to create an executable sqsh script
to run sp_who, you simply need to create a file like so:
#!/usr/local/bin/sqsh -i
sp_who
go
Thus, if your sp_who script is executed directly, it will
automatically launch "/usr/local/bin/sqsh -i sp_who" for
you.
And, to make things even more flexible, sqsh supports
positional parameters, similar to most shells, of the form ${n} which
will expand to the nth argument to your sqsh script. For
example:
#!/usr/local/bin/sqsh -i
sp_who ${1}
go
will cause the sp_who stored procedure to be executed with
an argument of the first command line parameter supplied to the
sp_who shell script.
Note that positional parameters must be contained between
braces to avoid conflicts with the T-SQL money data type (without the
braces, the variable will not be expanded).
One of the major complaints of isql is that it provides no
facility to detect when an error condition occurred while it is performing
processing. sqsh provides a rather complex, but flexible mechanism
for returning meaningful information concerning its reason for exit in the
form of an exit status (see exit(3)).
When sqsh begins execution two handlers are associated with
the current connection to the database, one is a message handler which is
responsible for displaying the text of any SQL Server messages or errors,
and the other is an error handler, which is responsible for determining what
to do with an error condition (bear with me, these are only loose
descriptions). And, associated with each message and error condition is a
severity level, between 0 and 22 (informational message to fatal
condition).
Associated with these two message handlers are several variables
that are used to either control their behavior, or are used as indicators by
the message handler:
- $thresh_display
- This variable is used by the message handler to determine the minimum
error severity which will cause a message to be displayed. By default this
is 0, which will display all messages (with a couple of exceptions).
Setting this to 1, for example, would suppress informational messages such
as the output of set showplan on.
- $thresh_fail
- This variable is used by the error handler to determine which error
severity is considered by sqsh to be a failure. Normally, this
defaults to 11 which indicates that any error, other than informational
messages, is a failure. The next variable will explain the importance of
this value.
- $batch_failcount
- This variable should be considered read-only, and contains the total
number of times that batches have caused an error of severity
$thresh_fail or more. The
only value that is valid to explicitly set this value to, is ""
(the empty string), which will reset this value to 0, any other value may
have unpredictable results.
- $thresh_exit
- This variable is used to determine the limit at which
$batch_failcount will cause
sqsh to exit. If
$thresh_exit is 0, then this
feature is disabled. In other words, if
$batch_failcount =
$thresh_exit and
$thresh_exit is greater than
0, then sqsh will exit, returning
$batch_failcount as an exit
status.
Note that, unless
$exit_failcount is set to
1, sqsh will exit with 0 if the total number of failures does not
reach $thresh_exit.
- $exit_failcount
- This variable is used only when sqsh would normally exit with a
success status (0), this causes it to instead exit with a value of
$batch_failcount (which may,
itself, be 0).
- $exit_value
- When this variable is non-zero, it will override the
$exit_failcount and
$batch_failcount values and
just exit the value of
$exit_value. This variable
may be explicitly set using the \set command, or implicitly using
\exit x and its aliased counterparts.
To recap, here is a list of error codes that may be returned by
sqsh upon exit, and the reason that they could be returned:
- - 0 -
- No error has been encountered.
- - 1...253 -
- Between 1 and 253 batches have failed (if you run more than 253 batches,
the exit status of sqsh is undetermined...I may fix this in the
future).
- - 254 -
- An explicit \abort was called, or a SIGINT (^C) was issued during a
non-interactive session.
- - 255 -
- A general error condition has occurred, such as a bad command line
argument to sqsh, memory allocation failure, file access error, etc.
The following sections provide detailed examples of combinations
of variable settings and the results produced upon exit with certain failure
conditions. It is assumed the
$exit_value variable contains 0
in the next examples.
- thresh_display=0,
thresh_fail=0, thresh_exit=1
- With this combination, all error messages will be displayed as they
happen, and every error will be considered an failure condition. Upon
reaching the first error, sqsh will abort with an exit status of 1,
or the total number of failures (the
$batch_failcount variable).
However, if nothing goes wrong during the whole process, a zero is
returned.
- thresh_display=0,
thresh_fail=0, thresh_exit=3
- This combination will cause all error conditions to be displayed and all
of them to be considered a failure condition. Upon reaching three total
failed batches, sqsh will exit with a status of 3. However if 0, 1,
or 2 batches fail, then 0 is returned.
- thresh_display=22,
thresh_fail=0, thresh_exit=3
- This behaves the same as the previous example, with the exception that all
error messages will be suppressed from being displayed. This is
particularly useful if you just care about the exit value more than the
actual error.
- thresh_display=0,
thresh_fail=2, thresh_exit=1
- This will cause the first error of severity 2 or higher to be displayed
and cause sqsh to exit with a failure condition of 1.
- thresh_display=0,
thresh_fail=0, thresh_exit=3, exit_failcount=1
- This is identical to the second example, above, however sqsh will
return the total number of batches that failed even if
$batch_failcount does not
reach 3.
- exit_value=nonzero
- This will override all conditions explained above and just exit the
specific value.
Color codes are presented as a string like {1;2;3}. If sqsh
encounters a { (curly brace) in the prompt string it will assume a
color-code is supplied and will act as such. No checks will be performed on
the validity of the color-code definition itself. The color definition
consists of three values separated by a semicolon.
The first code defines the Color Attribute Code with possible
values: 0=none 1=bold The second value defines the Text Color Code: 30=black
31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white The third
value defines the Background Color Code: 40=black 41=red 42=green 43=yellow
44=blue 45=magenta 46=cyan 47=white The last color-code for the background
may be omitted. Not all color and attribute combinations will present good
results, depending on your terminal type and color scheme. But the following
values work OK on a xterm with a creamy white background color in Linux as
well as rxvt in Cygwin with a black background window:
Prompt: Blue text in white background "{0;34;47}"
Command text: Yellow text "{0;33}"
Command text: Default text color "{0}"
sqsh will translate the color-codes to an actual color-code string
that is presented to readline: for example
"\001\033[0;36;47m\002". Note that if you want to use curly
brackets in your prompt, you have to escape colorization by specifying a
double brace, like {{...}}. For example:
\set prompt_color='{0;34;47}'
\set text_color='{0}'
\set prompt='$prompt_color{{$DSQUERY.$username.$database.$lineno}}>$text_color '
Color support is automatically available if sqsh is compiled and
linked with readline support enabled.
Defaults: $HOME/.sqshrc,
$HOME/.sqsh_session,
$HOME/.sqsh_history,
$HOME/.sqsh_readline,
$HOME/.sqsh_words,
$tmp_dir/sqsh-dfr.*,
$tmp_dir/sqsh-edit.* These can all be modified using
the internal sqsh variables described above.
The addition of flow-of-control expressions has extended sqsh
way beyond the scope of its original design, and it is quite obvious
from using the features they are hacked in and are rather clunky (although
still quite usable). As a result, the processing of these expressions is
rather slow (when compared to bourne shell), and the error reporting doesn't
lend itself to debugging large scripts. The development of 1000+ line
scripts is discouraged.
The combination of backgrounding and pipes does not work properly
right now. What happens is, when a background job is run that incorporates a
pipe-line, sqsh will suspend until the job is complete, which is
obviously not what you desire. To test this, try the following:
1> select * from syscolumns
2> go | grep id &
You will find that you do not get your prompt back until the job
completes. The same is more ore less true for pipes being used with the \do
command:
1> select name from master..sysdatabases
2> \do | grep syb
This will not give you a prompt anymore until the block completes
with \done. So you are typing the do block itself in the dark and there is
no possiblity to edit a do block or retrieve a do block from the history
list. So you may have typed (hopefully without syntax errors):
\echo #1
\done
After \done is processed the results will be displayed followed by
a fresh prompt.
Please report any other bugs to http://sourceforge.net/p/sqsh/bugs
Feature requests may be posted to
http://sourceforge.net/p/sqsh/feature-requests
Visit the GSP FreeBSD Man Page Interface. Output converted with ManDoc.
|