Annotation of 43BSD/ingres/doc/quel/quel.nr, revision 1.1.1.1

1.1       root        1: .th QUEL QUEL 2/23/79
                      2: .ds QU \s-2QUEL\s0
                      3: .sh NAME
                      4: quel \- \fBQUE\fPry \fBL\fPanguage for \*(II
                      5: .sh DESCRIPTION
                      6: The following is a description of the general syntax
                      7: of
                      8: .nh
                      9: \*(QU.
                     10: .hy
                     11: Individual 
                     12: \*(QU
                     13: statements and commands
                     14: are treated separately in the document;
                     15: this section describes the syntactic classes from which the constituent
                     16: parts of 
                     17: \*(QU
                     18: statements are drawn.
                     19: .s1
                     20: 1. Comments
                     21: .s2
                     22: A comment is an arbitrary sequence of characters
                     23: bounded on the left by
                     24: ``/\*(**''
                     25: and on the right by
                     26: ``\*(**/'':
                     27: .s3
                     28: /\*(** This is a comment \*(**/
                     29: .s1
                     30: 2. Names
                     31: .s2
                     32: Names in 
                     33: \*(QU
                     34: are sequences of no more than 12 alphanumeric
                     35: characters, starting with an alphabetic. Underscore (_) is considered
                     36: an alphabetic.
                     37: All upper-case alphabetics
                     38: appearing anywhere except in strings are automatically
                     39: and silently mapped into their
                     40: lower-case counterparts.
                     41: .s1
                     42: 3. Keywords
                     43: .s2
                     44: The following identifiers are reserved for use as keywords and
                     45: may not be used otherwise:
                     46: .s3
                     47: .ft B
                     48: .if n .ta 5 25 45
                     49: .if t .ta 0.5i 2.5i 4.5i
                     50: .de xx
                     51: \t\\$1\t\\$2\t\\$3
                     52: .br
                     53: ..
                     54: .xx abs all and 
                     55: .xx any append ascii 
                     56: .xx at atan avg 
                     57: .xx avgu by concat 
                     58: .xx copy cos count 
                     59: .xx countu create define 
                     60: .xx delete delim destroy 
                     61: .xx exp  float4 float8 
                     62: .xx from gamma help 
                     63: .xx in index int1 
                     64: .xx int2 int4 integrity 
                     65: .xx into is log 
                     66: .xx max min mod 
                     67: .xx modify not of 
                     68: .xx on onto or 
                     69: .xx permit print range 
                     70: .xx replace retrieve save 
                     71: .xx sin sqrt sum 
                     72: .xx sumu to unique 
                     73: .xx until unuse use 
                     74: .xx view where 
                     75: .ft
                     76: .dt
                     77: .s1
                     78: 4. Constants
                     79: .s2
                     80: There are three types of constants,
                     81: corresponding to the three data types available in 
                     82: \*(QU
                     83: for data storage.
                     84: .s1
                     85: 4.1. String constants
                     86: .s2
                     87: Strings in 
                     88: \*(QU
                     89: are sequences of no more than 255 arbitrary
                     90: ASCII characters bounded by
                     91: double quotes ( " " ). Upper case alphabetics within strings
                     92: are accepted literally.
                     93: Also, in order to imbed quotes
                     94: within strings, it is necessary to prefix them with `\e' .
                     95: The same convention applies to `\e' itself.
                     96: .s3
                     97: Only printing characters are allowed within strings.
                     98: Non-printing characters (i.e. control characters)
                     99: are converted to blanks.
                    100: .s1
                    101: 4.2. Integer constants
                    102: .s2
                    103: .br
                    104: Integer constants in 
                    105: \*(QU
                    106: range from \*-2,147,483,647
                    107: to +2,147,483,647.
                    108: Integer constants beyond that range will be converted to floating point.
                    109: If the integer is greater than 32,767 or less than \*-32,767
                    110: then it will be left as a two byte integer.
                    111: Otherwise it is converted to a four byte integer.
                    112: .s1
                    113: 4.3. Floating point constants
                    114: .s2
                    115: Floating constants consist of an integer part, a decimal point, and
                    116: a fraction part or scientific notation
                    117: of the following format:
                    118: .s3
                    119:        {<dig>} [.<dig>] [e\*vE [+\*v\*-] {<dig>}]
                    120: .s3
                    121: Where <dig> is a digit, [] represents zero or one,
                    122: {} represents zero or more, and | represents alternation.
                    123: An exponent with a missing mantissa has a mantissa
                    124: of 1 inserted.
                    125: There may be no extra characters embedded in the string.
                    126: Floating constants
                    127: are taken to be double-precision quantities with a range of
                    128: approximately
                    129: .if n -10**38 to +10**38
                    130: .if t \*-10\x'-0.2v'\u\s-3\&38\s0\d to 10\u\x'-0.2v'\s-3\&38\s0\d
                    131: and a precision of 17 decimal digits.
                    132: .s1
                    133: 5. Attributes
                    134: .s2
                    135: An attribute is a construction of the form:
                    136: .s3
                    137:        variable.domain
                    138: .s3
                    139: .it Variable 
                    140: identifies a particular relation and can be thought of
                    141: as standing for the rows or tuples of that relation.
                    142: A variable is associated with a relation by means of a
                    143: .it range
                    144: statement.
                    145: .it Domain 
                    146: is the name of one of the columns of the relation
                    147: over which the variable ranges.
                    148: Together they make up an attribute, which represents
                    149: values of the named domain.
                    150: .s2
                    151: If the attribute is a string type, it can be qualified with the substring
                    152: notation. The substring notation is explained later.
                    153: .s1
                    154: 6. Operators
                    155: .s1
                    156: 6.1 Arithmetic operators
                    157: .s2
                    158: Arithmetic operators take numeric type expressions as operands.
                    159: Unary operators group right to left; binary operators group
                    160: left to right. The operators (in order of descending
                    161: precedence) are:
                    162: .s3
                    163: .nf
                    164:        +,\*-   (unary) plus, minus
                    165:        \*(**\*(**      exponentiation
                    166:        \*(**,/ multiplication, division
                    167:        +,\*-   (binary) addition, subtraction
                    168: .dt
                    169: .fi
                    170: .i0
                    171: .s3
                    172: Parentheses may be used for arbitrary grouping.
                    173: Arithmetic overflow and divide by zero are
                    174: not checked on integer operations.
                    175: Floating point operations are checked for
                    176: overflow, underflow, and divide by zero only
                    177: if the appropriate machine hardware exists
                    178: and has been enabled.
                    179: .s1
                    180: 6.2 Arithmetic string operators
                    181: .s2
                    182: The operator \fI+\fR is a string concatenator, like the 
                    183: \(*QU
                    184: function \fIconcat\fR; 
                    185: however, its syntax is cleaner and it is not limited to two
                    186: arguments,
                    187: but like its arithmetic counterpart,
                    188: can be used without restriction.
                    189: Its counterpart, \fI-\fR, is the string equivalent of the difference
                    190: operator on sets, with the special property that only the first
                    191: instance of the right hand side is deleted from the string.
                    192: The binding properties of these two operators are exactly equivalent
                    193: to the arithmetic plus and minus,  
                    194: which means that they can be used in conjunction with parentheses to
                    195: form complex expressions.
                    196: .s2
                    197: These two operators are most useful when used with the substring notation.
                    198: .s1
                    199: 7. Expressions (a_expr)
                    200: .s2
                    201: An expression is one of the following:
                    202: .s3
                    203: .nf
                    204: .if t .in +0.5i
                    205: .if n .in +5
                    206: constant
                    207: attribute
                    208: functional expression
                    209: aggregate or aggregate function
                    210: a combination of numeric expressions and arithmetic operators
                    211: .i0
                    212: .fi
                    213: .s3
                    214: For the purposes of this document,
                    215: an arbitrary expression will be
                    216: refered to by the name
                    217: .it a_expr.
                    218: .s1
                    219: 8. Formats
                    220: .s2
                    221: Every 
                    222: .it a_expr 
                    223: has a format
                    224: denoted by
                    225: a letter (\c
                    226: .bd c,
                    227: .bd i,
                    228: or 
                    229: .bd f,
                    230: for character, integer, or floating data
                    231: types respectively) and a number indicating the number of bytes
                    232: of storage occupied.
                    233: Formats currently supported are listed below.
                    234: The ranges of numeric types are indicated in parentheses.
                    235: .s3
                    236: .lp +20 15
                    237: c1 \- c255     character data of length 1\-255 characters
                    238: .lp +20 15
                    239: i1     1-byte integer (\*-128 to +127)
                    240: .lp +20 15
                    241: i2     2-byte integer (\*-32768 to +32767)
                    242: .lp +20 15
                    243: i4     4-byte integer  (\*-2,147,483,648 to +2,147,483,647)
                    244: .lp +20 15
                    245: .if n f4       4-byte floating (\*-10**38 to +10**38,
                    246: .if t f4       4-byte floating (\*-10\x'-0.2v'\u\s-3\&38\s0\d to +10\x'-0.2v'\u\s-3\&38\s0\d,
                    247: 7 decimal digit precision)
                    248: .lp +20 15
                    249: .if n f8       8-byte floating (\*-10**38 to +10**38,
                    250: .if t f8       8-byte floating (\*-10\u\x'-0.2v'\s-3\&38\s0\d to +10\u\x'-0.2v'\s-3\&38\s0\d,
                    251: 17 decimal digit precision)
                    252: .i0
                    253: .s3
                    254: One numeric format can be converted to
                    255: or substituted for any other numeric format. 
                    256: .s1
                    257: 9. Type Conversion.
                    258: .s2
                    259: When operating on two numeric domains of
                    260: different types,
                    261: \*(II converts as necessary to make the
                    262: types identical.
                    263: .s3
                    264: When operating on an integer and a floating
                    265: point number,
                    266: the integer is converted to a floating point
                    267: number before the operation.
                    268: When operating on two integers of different
                    269: sizes, the smaller is converted to
                    270: the size of the larger.
                    271: When operating on two floating point number
                    272: of different size,
                    273: the larger is converted to the smaller.
                    274: .s3
                    275: The following table summarizes the possible combinations:
                    276: .s3
                    277: .dt
                    278: .if n .in +4
                    279: .if t .in +1i
                    280: .nf
                    281:        i1      i2      i4      f4      f8
                    282: .s3
                    283: i1 \-  i1      i2      i4      f4      f8
                    284: i2 \-  i2      i2      i4      f4      f8
                    285: i4 \-  i4      i4      i4      f4      f8
                    286: f4 \-  f4      f4      f4      f4      f4
                    287: f8 \-  f8      f8      f8      f4      f8
                    288: .dt
                    289: .i0
                    290: .fi
                    291: .s3
                    292: \*(II provides five type conversion
                    293: operators specifically for
                    294: overriding the default actions.
                    295: The operators are:
                    296: .s3
                    297: .nf
                    298: .in +4
                    299: .if n .ta 18
                    300: .if t .ta 1.4i
                    301: int1(a_expr)   result type i1
                    302: int2(a_expr)   result type i2
                    303: int4(a_expr)   result type i4
                    304: float4(a_expr) result type f4
                    305: float8(a_expr) result type f8
                    306: .dt
                    307: .fi
                    308: .i0
                    309: .s3
                    310: The type conversion operators convert their argument
                    311: a_expr to the requested type.
                    312: .it A_expr 
                    313: can be anything including character.
                    314: If a character value cannot be converted,
                    315: an error occures and processing is halted.
                    316: This can happen only if the syntax of the
                    317: character value is incorrect.
                    318: .s3
                    319: Overflow is not checked on conversion.
                    320: .s1
                    321: 10. Target_list
                    322: .s2
                    323: .br
                    324: A target list is a parenthesized, comma separated list of one
                    325: or more elements , each of which must be of one of the following
                    326: forms:
                    327: .s3
                    328: a)
                    329: .it result_attname 
                    330: .bd is 
                    331: .it a_expr
                    332: .s3
                    333: .it Result_attname 
                    334: is the name of the attribute to be created (or an
                    335: already existing attribute name in the case of update statements.)
                    336: The equal sign (``='') may be used
                    337: interchangeably with 
                    338: .bd is.
                    339: In the case where 
                    340: .it a_expr
                    341: is anything other than
                    342: a single attribute, this form
                    343: must be used to assign a result
                    344: name to the expression.
                    345: .s3
                    346: b)  
                    347: .it attribute
                    348: .s3
                    349: In the case of a 
                    350: .it retrieve,
                    351: the resultant domain
                    352: will acquire the same name as that of the attribute being retrieved.
                    353: In the case of update statements
                    354: (\c
                    355: .it "append, replace\c"
                    356: ),
                    357: the relation being updated must have
                    358: a domain with exactly that name.
                    359: .s3
                    360: Inside the target list the keyword 
                    361: .bd all
                    362: can be used to represent all domains.
                    363: For example:
                    364: .if n .in +5
                    365: .if t .in +0.5i
                    366: .s3
                    367: range of e is employee
                    368: .br
                    369: retrieve (e.all) where e.salary > 10000
                    370: .i0
                    371: .s3
                    372: will retrieve all domains of employee for
                    373: those tuples which satisfy the qualification.
                    374: .bd All
                    375: can be used in the target list of
                    376: a 
                    377: .it retrieve 
                    378: or an 
                    379: .bd append.
                    380: The domains will be inserted in their
                    381: ``create'' order, that is,
                    382: the same order they were listed in the
                    383: .it create 
                    384: statement.
                    385: .s1
                    386: 11. Comparison operators
                    387: .s2
                    388: Comparison operators take arbitrary expressions as operands.
                    389: .s3
                    390: .dt
                    391: .nf
                    392:        <       (less than)
                    393:        <=      (less than or equal)
                    394:        >       (greater than)
                    395:        >=      (greater than or equal)
                    396:        =       (equal to)
                    397:        !=      (not equal to)
                    398: .fi
                    399: .s3
                    400: They are all of equal precedence.
                    401: When comparisons are made on
                    402: character attributes, all blanks are ignored.
                    403: .s1
                    404: 12. Logical operators
                    405: .s2
                    406: Logical operators take clauses as operands and
                    407: group left-to-right:
                    408: .s3
                    409: .nf
                    410:        not     (logical not; negation)
                    411:        and     (logical and; conjunction)
                    412:        or      (logical or; disjunction)
                    413: .fi
                    414: .i0
                    415: .dt
                    416: .s3
                    417: .bd Not
                    418: has the highest precedence of the three.
                    419: .bd And
                    420: and 
                    421: .bd or 
                    422: have equal precedence.
                    423: Parentheses may be used for arbitrary grouping.
                    424: .s1
                    425: 13. Qualification (qual)
                    426: .s2
                    427: A 
                    428: .it qualification 
                    429: consists of any number of clauses connected
                    430: by logical operators.
                    431: A clause  is a pair of expressions connected by a comparison operator:
                    432: .s3
                    433: .dt
                    434:        a_expr comparison_operator a_expr
                    435: .s3
                    436: Parentheses may be used for arbitrary
                    437: grouping.
                    438: A qualification may thus be:
                    439: .s3
                    440: .in +4
                    441: .it clause
                    442: .br
                    443: .bd not 
                    444: .it qual
                    445: .br
                    446: .it qual 
                    447: .bd or
                    448: .it qual
                    449: .br
                    450: .it qual 
                    451: .bd and
                    452: .it qual
                    453: .br
                    454: (
                    455: .it qual
                    456: )
                    457: .i0
                    458: .s1
                    459: 14. Functional expressions
                    460: .s2
                    461: A 
                    462: .it "functional expression"
                    463: consists of a function name followed
                    464: by a parenthesized (list of) operand(s).
                    465: Functional expressions can be nested to any level.
                    466: In the following list of functions supported (\c
                    467: .it n\c
                    468: )
                    469: represents an arbitrary numeric type expression.
                    470: The format of the result is indicated on the right.
                    471: .s3
                    472: .if n .ta 10 25
                    473: .if n .in 24
                    474: .if t .ta 1.0i 2.5i
                    475: .if t .in 2.5i
                    476: .de xx
                    477: .lp +20 15
                    478: \fB\\$1(\fI\\$2\fB)\fR \-\t\c
                    479: ..
                    480: .xx abs n
                    481: same as 
                    482: .it n
                    483: (absolute value)
                    484: .xx ascii n
                    485: character string (converts numeric to character)
                    486: .xx atan n
                    487: f8 (arctangent)
                    488: .xx concat a,b
                    489: character (character concatenation. See 16.2)
                    490: .xx cos n
                    491: f8 (cosine)
                    492: .xx exp n 
                    493: f8 (exponential of 
                    494: .it n\c
                    495: )
                    496: .xx gamma n 
                    497: f8 (log gamma)
                    498: .xx log n
                    499: f8 (natural logarithm)
                    500: .xx mod n,b
                    501: same as 
                    502: .it b
                    503: (\c
                    504: .it n
                    505: modulo
                    506: .it "b. n" 
                    507: and 
                    508: .it b 
                    509: must be i1, i2, or i4)
                    510: .xx sin n 
                    511: f8 (sine)
                    512: .xx sqrt n
                    513: f8 (square root)
                    514: .dt
                    515: .i0
                    516: .s1
                    517: 15. Aggregate expressions
                    518: .s2
                    519: Aggregate expressions provide a way to aggregate a computed expression
                    520: over a set of tuples.
                    521: .s1
                    522: 15.1. Aggregation operators
                    523: .s2
                    524: The definitions
                    525: of the aggregates are listed below.
                    526: .s3
                    527: .de xx
                    528: .lp +20 15
                    529: \fB\\$1\fP \-\t\c
                    530: ..
                    531: .xx count
                    532: (i4) count of occurrences
                    533: .xx countu
                    534: (i4) count of unique occurrences
                    535: .xx sum
                    536: summation
                    537: .xx sumu
                    538: summation of unique values
                    539: .xx avg
                    540: (f8) average (sum/count)
                    541: .xx avgu
                    542: (f8) unique average (sumu/countu)
                    543: .xx max
                    544: maximum
                    545: .xx min
                    546: minimum
                    547: .xx any
                    548: (i2) value is 1 if any tuples satisfy
                    549: the qualification, else it is 0
                    550: .dt
                    551: .i0
                    552: .s1
                    553: 15.2. Simple aggregate
                    554: .s2
                    555: .it "\taggregation_operator" 
                    556: (\c
                    557: .it a_expr  
                    558: [ 
                    559: .bd where
                    560: .it qual
                    561: ] )
                    562: .dt
                    563: .s3
                    564: A simple aggregate evaluates to a single scalar value.
                    565: .it A_expr 
                    566: is aggregated over the set of tuples satisfying
                    567: the qualification (or all tuples in the range of the expression if
                    568: no qualification is present).
                    569: Operators 
                    570: .it sum 
                    571: and 
                    572: .it avg 
                    573: require numeric type 
                    574: .it a_expr;
                    575: .it "count, any, max"
                    576: and 
                    577: .it min 
                    578: permit a character type attribute as well as
                    579: numeric type 
                    580: .it a_expr.
                    581: .s3
                    582: .ul 1
                    583: Simple aggregates are completely local.
                    584: That is, they are logically removed from the
                    585: query, processed separately, and replaced
                    586: by their scalar value.
                    587: .s1
                    588: 15.3. ``\c
                    589: .bd any\c
                    590: \&''
                    591: aggregate
                    592: .s2
                    593: It is sometimes useful to know if any tuples satisfy a
                    594: particular qualification.
                    595: One way of doing this is by using the aggregate 
                    596: .it count
                    597: and checking whether the return is zero or non-zero.
                    598: Using
                    599: .it any
                    600: instead of 
                    601: .it count
                    602: is more efficient since
                    603: processing is stopped, if possible, the first time a tuple
                    604: satisfies a qualification.
                    605: .s3
                    606: .it Any
                    607: returns 1 if the qualification is true
                    608: and 0 otherwise.
                    609: .s1
                    610: 15.4. Aggregate functions
                    611: .s2
                    612: .it "\taggregation_operator" 
                    613: (\c 
                    614: .it a_expr 
                    615: .bd by
                    616: .it by_domain
                    617: .br
                    618: .it "\t\t{, by_domain}" 
                    619: [
                    620: .bd where 
                    621: .it qual
                    622: ] )
                    623: .s3
                    624: Aggregate functions are extensions of simple aggregates.
                    625: The 
                    626: .it by
                    627: operator groups (i.e. partitions) the set of qualifying tuples by 
                    628: .it by_domain 
                    629: values.
                    630: For more than one 
                    631: .it by_domain, 
                    632: the values which are grouped by are the concatenation
                    633: of individual 
                    634: .it by_domain 
                    635: values.
                    636: .it A_expr 
                    637: is as in simple aggregates.
                    638: The aggregate function evaluates to a set of aggregate results,
                    639: one for each partition into which the set of qualifying
                    640: tuples has been grouped.
                    641: The aggregate value used during evaluation of the query is the
                    642: value associated with the partition into which
                    643: the tuple currently being processed would fall.
                    644: .s3
                    645: Unlike simple aggregates, aggregate functions
                    646: are not completely local.
                    647: The 
                    648: .it by_list,
                    649: which differentiates
                    650: aggregate functions from simple aggregates,
                    651: is global
                    652: to the query.
                    653: Domains in the 
                    654: .it by_list
                    655: are automatically linked to the
                    656: other domains in the query which are
                    657: in the same relation.
                    658: .s3
                    659: Example:
                    660: .ft B
                    661: .nf 
                    662:        /\*(** retrieve the average salary for the employees
                    663:        working for each manager \*(**/
                    664:        range of e is employee
                    665:        retrieve (e.manager, avesal=avg(e.salary by e.manager))
                    666: .fi
                    667: .i0
                    668: .ft
                    669: .s1
                    670: 15.5 Aggregates on Unique Values.
                    671: .s2
                    672: It is occasionally necessary to aggregate on
                    673: unique values of an expression.
                    674: The 
                    675: .it avgu\c
                    676: , 
                    677: .it sumu\c
                    678: , and 
                    679: .it countu
                    680: aggregates
                    681: all remove duplicate values before
                    682: performing the aggregation.
                    683: For example:
                    684: .s3
                    685:        count(e.manager)
                    686: .s3
                    687: would tell you how many occurrences of 
                    688: .it "e.manager"
                    689: exist.
                    690: But
                    691: .s3
                    692:        countu(e.manager)
                    693: .s3
                    694: would tell you how many unique values of
                    695: .it "e.manager"
                    696: exist.
                    697: .s1
                    698: 16. Special character operators
                    699: .s2
                    700: There are four special features which are particular
                    701: to character domains.
                    702: .s1
                    703: 16.1 Pattern matching characters
                    704: .s2
                    705: There are eleven characters which take
                    706: on special meaning when used in character constants
                    707: (strings):
                    708: .s3
                    709: .de xx
                    710: .lp +10 6
                    711: \\$1\t\c
                    712: ..
                    713: .xx \*(**     
                    714: matches any string of zero or more characters.
                    715: .xx ?     
                    716: matches any single character.
                    717: .xx [..]  
                    718: matches any of characters in the brackets.
                    719: .xx ##1
                    720: matches any string of zero or more characters.
                    721: .xx ##2
                    722: matches any string of zero or more characters.
                    723: .xx ##3
                    724: matches any string of zero or more characters.
                    725: .xx ##4
                    726: matches any string of zero or more characters.
                    727: .xx ##5
                    728: matches any string of zero or more characters.
                    729: .xx ##6
                    730: matches any string of zero or more characters.
                    731: .xx ##7
                    732: matches any string of zero or more characters.
                    733: .xx ##8
                    734: matches any string of zero or more characters.
                    735: .xx ##9
                    736: matches any string of zero or more characters.
                    737: .xx ##0
                    738: matches all instances of strings between two occurances of ##0.
                    739: .i0
                    740: .s3
                    741: These characters can be used in any combination to
                    742: form a variety of tests.
                    743: For example:
                    744: .s3
                    745: .lp +25 20
                    746: where e.name = "##1Kalash##2Joe##4" \- matches any occurance of "Kalash",
                    747: followed by "Joe".
                    748: .lp +25 20
                    749: where e.name = "##0Ingres##0" \- matches all occurances of "Ingres" within a line.
                    750: .lp +25 20
                    751: where e.name = "\*(**" \- matches any name.
                    752: .lp +25 20
                    753: where e.name = "E\*(**" \- matches any name starting with "E".
                    754: .lp +25 20
                    755: where e.name = "\*(**ein" \- matches all names ending with "ein"
                    756: .lp +25 20
                    757: where e.name = "\*(**[aeiou]\*(**" \- matches any name with at least one vowel.
                    758: .lp +25 20
                    759: where e.name = "Allman?" \- matches any seven character name starting with "Allman".
                    760: .lp +25 20
                    761: where e.name = "[A\-J]\*(**" \- matches any name starting with A,B,..,J.
                    762: .i0
                    763: .s3
                    764: The special meaning of the pattern matching characters
                    765: can be disabled by preceding them with a `\e'.
                    766: Thus ``\e\*(**'' refers to the character ``\*(**''.
                    767: When the special characters appear in the target
                    768: list they must be escaped.
                    769: For example:
                    770: .s3
                    771: .dt
                    772:        title = "\e\*(**\e\*(**\e\*(** ingres \e\*(**\e\*(**\e\*(**"
                    773: .s3
                    774: is the correct way to assign the string
                    775: ``\*(**\*(**\*(** ingres \*(**\*(**\*(**'' to the domain ``title''.
                    776: .s1
                    777: 16.1.1 Numbered Wildcards
                    778: .s2
                    779: The numbered wildcards are unique in that they may also appear
                    780: in a target list, as well as in a qualification.
                    781: Each unique numbered wildcard used  retains the same value
                    782: in both the target list and the qualification list.
                    783: Thus a query such as
                    784: .s1
                    785: .lp +25 20
                    786: replace t(text = "##1the##2")
                    787: .lp +30 20
                    788: where t.text = "##1THE##2"
                    789: .i0
                    790: .s1
                    791: will replace an occurence of "THE" in t.text with "the".
                    792: .s1
                    793: The special global wildcard ##0 when used in the query
                    794: .s1
                    795: .lp +25 20
                    796: replace t(text = "##0the##0") 
                    797: .lp +30 20
                    798: where t.text = "##0THE##0"
                    799: .i0
                    800: .s1
                    801: will replace all occurrences of "THE" with "the".
                    802: .s1
                    803: 16.2 Concatenation
                    804: .s2
                    805: There is a concatenation operator which can
                    806: form one character string from two.
                    807: Its syntax is ``concat(field1, field2)''.
                    808: The size of the new character string is the
                    809: sum of the sizes of the original two.
                    810: Trailing blanks are trimmed from the first
                    811: field, the second field is concatenated
                    812: and the remainder is blank padded. The result is never
                    813: trimmed to 0 length, however.
                    814: Concat can be arbitrarily nested inside other
                    815: concats. For example:
                    816: .s3
                    817: .dt
                    818:        name = concat(concat(x.lastname, ","), x.firstname)
                    819: .s3
                    820: will concatenate 
                    821: x.lastname with a comma and
                    822: then concatenate x.firstname to that.
                    823: .s1
                    824: 16.3 Ascii (numeric to character translation)
                    825: .s2
                    826: The 
                    827: .it ascii 
                    828: function can be used to convert a
                    829: numeric field to its character representation.
                    830: This can be useful when it is desired to compare
                    831: a numeric value with a character value.
                    832: For example:
                    833: .nf
                    834: .s3
                    835: .dt
                    836:        retrieve ( ... ) 
                    837:                where x.chardomain = ascii(x.numdomain)
                    838: .fi
                    839: .s3
                    840: .it Ascii 
                    841: can be applied to a character value.
                    842: The result is simply the character value unchanged.
                    843: The numeric conversion formats are determined by
                    844: the printing formats (see ingres(unix)).
                    845: .s1
                    846: 16.4 Substring notation
                    847: .s2
                    848: Any string attribute can be broken up into into a smaller substring
                    849: using the following substring operators.
                    850: .nf
                    851: .s3
                    852: .dt
                    853:        variable.domain(X,Y)
                    854:        variable.domain(X,y%
                    855:        variable.domain%X,Y)
                    856:        variable.domain%X,Y%
                    857: .fi
                    858: Each of the above represents a certain substring of
                    859: .it domain,
                    860: denoted by the endpoints X and Y. Whether the endpoints are to be
                    861: included or not is determined by the parentheses (exclusion) and
                    862: percent signs (inclusion).
                    863: .s2
                    864: \fIX\fR and \fIY\fR (optional) 
                    865: consist of a required part with optional qualifiers.  
                    866: The required part can be any of the following:
                    867: .nf
                    868: .s3
                    869: .dt
                    870: a string
                    871: \*(lqw\*(rq \fR (a word) \fB
                    872: \*(lqc\*(rq \fR (a character)
                    873: A user defined delimiter (see delim(quel))
                    874: .fi
                    875: .s2
                    876: The optional qualifiers are a preceding digit, \fIi\fR, which specifies
                    877: to look for the \fI ith \fR occurence, and a trailing \fI$\fR, which 
                    878: specifies to search backwards from the end of the string.
                    879: .s2
                    880: The rules for searching are very simple.
                    881: Without the \fI$\fR, the value of \fIX\fR
                    882: chosen is the \fIith\fR occurrance (the default value of \fIi\fR is one)
                    883: from the left end of the string.
                    884: The search for \fIY\fR, if it is requested, starts after the end of \fIX\fR.
                    885: A dollar sign, however, always specifies that the search start from the end
                    886: of the string regardless of the value of \fIX\fR.
                    887: For illustrative purposes, assume a text field to contain the following:
                    888: .nf
                    889: .s3
                    890: .dt
                    891: I saw the dog, the cat, and the duck take a walk.
                    892: .fi
                    893: Then the following constructs would have the attached values:
                    894: .nf
                    895: .s3
                    896: .dt
                    897: r.text(3w,2"the"%      dog, the cat, and the
                    898: r.text%2"the"$,$%      the cat, and the duck take a walk.
                    899: .fi
                    900: .s2
                    901: When combined with the \*(lqarithemtic\*(rq
                    902: string operators this facility can the quite powerful.
                    903: For example, to remove \*(lqthe dog\*(rq from the sentence requires
                    904: only the simple following query:
                    905: .nf
                    906: .s3
                    907: .dt
                    908: replace r(text = r.text - r.text%"the","the"))
                    909: .fi
                    910: Or perhaps only the baby duck was taking a walk:
                    911: .nf
                    912: .s3
                    913: .dt
                    914: replace r(text = r.text%"I","the"% + "baby" + r.text%"duck",$})
                    915: .fi
                    916: .sh "SEE ALSO"
                    917: append(quel),
                    918: delete(quel), 
                    919: delim(quel),
                    920: range(quel), 
                    921: replace(quel), 
                    922: retrieve(quel), 
                    923: ingres(unix)
                    924: .sh BUGS
                    925: The maximum number of variables which can
                    926: appear in one query is 10.
                    927: .s3
                    928: Numeric overflow, underflow, and divide by zero
                    929: are not detected.
                    930: .s3
                    931: When converting between numeric types, overflow is
                    932: not checked.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.