Where to obtain cql (for -R database files)?

30 views
Skip to first unread message

Martijn Dekker

unread,
Jul 9, 2020, 3:04:45 PM7/9/20
to Korn Shell
The ksh -R option is not documented in (k)sh.1 (although it is mentioned
in the synopsis), but 'ksh --man' documents it as follows:

| -R file Do not execute the script, but create a cross reference
| database in file that can be used a separate shell
script
| browser. The -R option requires a script to be
specified as
| the first operand.

I did some Googling to figure out what this "separate shell script
browser" could be, and ended up here:

https://comp.unix.shell.narkive.com/dpQsfiWq/ksh-syntax-tree-and-script-call-analysis

which says these files should be usable with a tool called cql, "C Query
Language", or cdb, a tool to display files in this language:

http://web.archive.org/web/20080820144630/http://public.research.att.com/~gsf/cql/cql.html

http://web.archive.org/web/20100811174618/http://www2.research.att.com/~gsf/man/man1/cdb.html

Does anyone know where cql and/or cdb are currently available? It can't
be downloaded from those links. Without these, the ksh -R feature
appears to be of no use.

Thanks,

- Martijn

--
|| modernish -- harness the shell
|| https://github.com/modernish/modernish
||
|| KornShell lives!
|| https://github.com/ksh93/ksh

Marc Wilson

unread,
Jul 9, 2020, 3:21:13 PM7/9/20
to Korn Shell
Some documentation, at least, for cql appears to be on gsf's page.

Marc Wilson

unread,
Jul 9, 2020, 3:31:50 PM7/9/20
to Korn Shell
And at some point it was part of ast, because if you google around for cql.c, you can find more than one PDF abstract that mentions it and at least one person who was trying to build ast under cygwin with a patch file that mentions it.

Marc Wilson

unread,
Jul 9, 2020, 6:42:17 PM7/9/20
to Korn Shell
I found a binary here (Windows.): http://academy.delmar.edu/Courses/ITSC1405/Downloads/AT&T_Unix-for-Windows/

C:\root\usr\bin>.\cql --man
NAME
  cql - C query language

SYNOPSIS
  cql [ options ] [ data ]

DESCRIPTION
  cql applies C style expressions to flat database files. It fills the gap between awk(1) and full blown relational
  database management programs. A flat database is a sequence of newline terminated records of delimiter separated
  fields.

  Files are processed as follows. cql first evaluates the begin expression if defined, then sequentially applies the
  select expression to all records. The action expression is evaluated for each record that select evaluates to non-0.
  After all records have been checked the done expression is evaluated if defined, and cql exits. The default select
  expression is 1 (all records are selected) and the default action expression prints the record on the standard
  output.

  Depending on the input file declarations, cql may generate index files for quick record access. Indexes are used to
  filter out records for which select would evaluate to 0. Index files are placed in the current directory and each is
  named by changing the suffix to .hix or by adding a .hix suffix.

OPTIONS
  -a, --active    Run in active mode by reading declarations and expressions from the standard input. The special
                  sequence %% separates the declarations from the expressions. %% after an expression applies that
                  expression to the input files. EOF terminates the active session. Active mode error message lines
                  are prefixed with %% cql:.
  -c, --compile=file
                  If file matches *.c then the cql expression are converted to C and placed in file, and cql exits.
                  file may then be compiled with cc(1). Otherwise file is assumed to be a dll (compiled and linked
                  from a .c file previously generated by clq) and is loaded into the current process.
  -e|d, --expression=expr
                  expression defines the database schemas and the labelled expressions that control database
                  traversal. Multiple --expression expressions are parsed in order from left to right.
  -f, --file=file Equivalent to -e "#include 'file'".
  -l, --local     By default index files are only generated in the directory containing the data files; --local causes
                  index files to be generated in the current directory.
  -n, --index     Enable index file generation. If index files must be (re)generated and --noindex is on then cql
                  exits with a diagnostic. On by default; -n means --noindex.
  -r, --replace   Replace the top level database view with an updated view if there were updates.
  -R, --regenerate
                  If index files are required then --regenerate forces them to be regenerated even if the otherwise
                  seem up-to-date.
  -u, --update    Only output updated records. By default all selected records are output.
  -w, --warn      Disable malformed data warning messages. With --nowarn malformed records are silently repaired or
                  discarded. On by default; -w means --nowarn.
  -I, --include=dir
                  Add dir to the list of directories searched for include and library files. The default ../lib/cql
                  directories on $PATH are added to this list.
  -D, --debug=level
                  Set the debug trace level to level. Higher levels produce more output.
  -T, --test=mask Inclusive-or mask into the implementation defined test mask. Occasionally a particular mask may be
                  used as a temporary bug workaround. Otherwise use at your own risk.
  -g, --g2        (obsolete) Enable g2 output mode.

SCHEMAS
  A schema is similar to a C struct declaration with the struct keyword omitted. A schema specifies names and types
  for the fields in a database record. The types are:
    char* A null-terminated C string.
    date_t
          A C unsigned long variable whose string representation is a date.
    elapsed_t
          A C long variable whose string representation is elapsed time in 1/100 seconds.
    float A C double variable.
    hex   A C unsigned long variable whose string representation is hexadecimal.
    int   A C long variable.
    string
          Equivalent to a null-terminated C char*.
    unsigned
          A C unsigned long variable.

  Schemas are themselves types. schema field; declares a subfield within a record and schema* field; declares a field
  that indexes another schema. In this case the field value is a string key that is used to match the first field in
  the referenced schema. The register prefix denotes fields that should be indexed; references to other schemas are
  always indexed.

  The first declared schema becomes the main schema (the schema of the data to be scanned.) The main schema may also
  be set by schema=schema;. schema.delimiter="delimiter"; sets the delimiter for schema and schema.input="file"; sets
  the input to file. The default delimiter is ";". The main schema input is the data command line argument if
  specified. Otherwise schema input file names are determined by the schema name with an optional .db suffix. Multiple
  schemas may be placed in a single file using the pax(1) vdb archive format.

EXPRESSIONS
  A labelled expression is defined by one of:
    label : statement-list
    type label() { statement-list }

  Supported expression labels are:
    action
          Evaluated for each record in which select returns non-zero. The default action lists each selected record as
          it appears in the databse.
    begin Evaluated once before the traversal begins. The return value is ignored.
    end   Evaluated once after the traversal ends. The return value is ignored.
    select
          Evaluated once for each record. If the return value is non-zero then action is evaluated. The default select
          return value is always non-zero.
    closure
          TBD
    loop  TBD

  select is assumed when label: or type label() is omitted. statement-list is composed of expr(3) C style expressions,
  including int variable, ... and float variable, ... declarations, (int) and (float) casts, if - else conditionals,
  for and while loops, and { ... } blocks. The trailing ; in any expression is optional. In the absense of a return
  statement the expression value is the value of the last evaluated expression in statement-list. Numbers and comments
  follow C syntax. String operands must be quoted with either "..." or '...'. String comparisons (== and !=) treat the
  right hand operand as a ksh(1) file match pattern.

  The expressions operate on the fields in the current input record. The begin and end expressions operate on a null
  valued current record. If a date_t type field is an operand to a binary operator then the other operand may be a
  string that is interpreted as a date(1) date expression; there is similar treatment for other types with alternate
  string representations.

  There is also a predefined readonly schema with the following elements:
    elapsed_t clock
          The elapsed time in 1/100 seconds since this cql started.
    date_t date
          The date when this cql started.
    int errors
          The current soft error count. cql continues after a soft error but exits with a non-zero exit status when
          complete.
    int line
          The current input file line number.
    int offset
          The current input file byte offset.
    int record
          The current input file record number.
    int select
          The current number of selected records.
    int size
          The size in bytes of the current input record.
    date_t time
          The current date and time.

  The following expr(3) functions are also supported:
    cql.getenv(name)
          Returns the value of the environment variable name. The empty string is returned for undefined environment
          variables.
    cql.path(name,len)
          Truncates the file pathname name to len bytes.
          cql.sub(string,old,new,flags)?Returns the substituted value of string the first match of the egrep(1) style
          regular expression old replaced by new. flags may be any combination of:
            g     Substitute all matches of old.
            l     Convert matches to lower case.
            u     Convert matches to upper case.
    exit(expr)
          Causes cql to exit with the exit code expr. expr defaults to 0 if omitted.
    printf(format[,arg...])
          Print the arguments on stdout using the printf(3) specification format.
    eprintf(format[,arg...])
          Like printf but output goes to stderr.
    query(format[,arg...])
          Prompt with the printf(3) message on stderr for an interactive response. A line beginning with y returns 1,
          q or EOF causes cql to exit immediately, and any other input returns 0.

SEE ALSO
  awk(1), grep(1), ksh(1), pax(1), perl(1), tw(1), expr(3), printf(3), tm(3)

IMPLEMENTATION
  version         cql (AT&T Research) 2002-09-06
  author          Glenn Fowler <g...@research.att.com>
  copyright       Copyright (c) 1991-2007 AT&T Intellectual Property

Reply all
Reply to author
Forward
0 new messages