Annotation of 42BSD/ingres/doc/quel/quel.nr, revision 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 destroy exp 
        !            61: .xx float4 float8 from 
        !            62: .xx gamma help in 
        !            63: .xx index int1 int2 
        !            64: .xx int4 integrity into 
        !            65: .xx is log max 
        !            66: .xx min mod modify 
        !            67: .xx not of on 
        !            68: .xx onto or permit 
        !            69: .xx print range replace 
        !            70: .xx retrieve save sin 
        !            71: .xx sqrt sum sumu 
        !            72: .xx to unique until 
        !            73: .xx view where 
        !            74: .ft
        !            75: .dt
        !            76: .s1
        !            77: 4. Constants
        !            78: .s2
        !            79: There are three types of constants,
        !            80: corresponding to the three data types available in 
        !            81: \*(QU
        !            82: for data storage.
        !            83: .s1
        !            84: 4.1. String constants
        !            85: .s2
        !            86: Strings in 
        !            87: \*(QU
        !            88: are sequences of no more than 255 arbitrary
        !            89: ASCII characters bounded by
        !            90: double quotes ( " " ). Upper case alphabetics within strings
        !            91: are accepted literally.
        !            92: Also, in order to imbed quotes
        !            93: within strings, it is necessary to prefix them with `\e' .
        !            94: The same convention applies to `\e' itself.
        !            95: .s3
        !            96: Only printing characters are allowed within strings.
        !            97: Non-printing characters (i.e. control characters)
        !            98: are converted to blanks.
        !            99: .s1
        !           100: 4.2. Integer constants
        !           101: .s2
        !           102: .br
        !           103: Integer constants in 
        !           104: \*(QU
        !           105: range from \*-2,147,483,647
        !           106: to +2,147,483,647.
        !           107: Integer constants beyond that range will be converted to floating point.
        !           108: If the integer is greater than 32,767 or less than \*-32,767
        !           109: then it will be left as a two byte integer.
        !           110: Otherwise it is converted to a four byte integer.
        !           111: .s1
        !           112: 4.3. Floating point constants
        !           113: .s2
        !           114: Floating constants consist of an integer part, a decimal point, and
        !           115: a fraction part or scientific notation
        !           116: of the following format:
        !           117: .s3
        !           118:        {<dig>} [.<dig>] [e\*vE [+\*v\*-] {<dig>}]
        !           119: .s3
        !           120: Where <dig> is a digit, [] represents zero or one,
        !           121: {} represents zero or more, and | represents alternation.
        !           122: An exponent with a missing mantissa has a mantissa
        !           123: of 1 inserted.
        !           124: There may be no extra characters embedded in the string.
        !           125: Floating constants
        !           126: are taken to be double-precision quantities with a range of
        !           127: approximately
        !           128: .if n -10**38 to +10**38
        !           129: .if t \*-10\x'-0.2v'\u\s-3\&38\s0\d to 10\u\x'-0.2v'\s-3\&38\s0\d
        !           130: and a precision of 17 decimal digits.
        !           131: .s1
        !           132: 5. Attributes
        !           133: .s2
        !           134: An attribute is a construction of the form:
        !           135: .s3
        !           136:        variable.domain
        !           137: .s3
        !           138: .it Variable 
        !           139: identifies a particular relation and can be thought of
        !           140: as standing for the rows or tuples of that relation.
        !           141: A variable is associated with a relation by means of a
        !           142: .it range
        !           143: statement.
        !           144: .it Domain 
        !           145: is the name of one of the columns of the relation
        !           146: over which the variable ranges.
        !           147: Together they make up an attribute, which represents
        !           148: values of the named domain.
        !           149: .s1
        !           150: 6. Arithmetic operators
        !           151: .s2
        !           152: Arithmetic operators take numeric type expressions as operands.
        !           153: Unary operators group right to left; binary operators group
        !           154: left to right. The operators (in order of descending
        !           155: precedence) are:
        !           156: .s3
        !           157: .nf
        !           158:        +,\*-   (unary) plus, minus
        !           159:        \*(**\*(**      exponentiation
        !           160:        \*(**,/ multiplication, division
        !           161:        +,\*-   (binary) addition, subtraction
        !           162: .dt
        !           163: .fi
        !           164: .i0
        !           165: .s3
        !           166: Parentheses may be used for arbitrary grouping.
        !           167: Arithmetic overflow and divide by zero are
        !           168: not checked on integer operations.
        !           169: Floating point operations are checked for
        !           170: overflow, underflow, and divide by zero only
        !           171: if the appropriate machine hardware exists
        !           172: and has been enabled.
        !           173: .s1
        !           174: 7. Expressions (a_expr)
        !           175: .s2
        !           176: An expression is one of the following:
        !           177: .s3
        !           178: .nf
        !           179: .if t .in +0.5i
        !           180: .if n .in +5
        !           181: constant
        !           182: attribute
        !           183: functional expression
        !           184: aggregate or aggregate function
        !           185: a combination of numeric expressions and arithmetic operators
        !           186: .i0
        !           187: .fi
        !           188: .s3
        !           189: For the purposes of this document,
        !           190: an arbitrary expression will be
        !           191: refered to by the name
        !           192: .it a_expr.
        !           193: .s1
        !           194: 8. Formats
        !           195: .s2
        !           196: Every 
        !           197: .it a_expr 
        !           198: has a format
        !           199: denoted by
        !           200: a letter (\c
        !           201: .bd c,
        !           202: .bd i,
        !           203: or 
        !           204: .bd f,
        !           205: for character, integer, or floating data
        !           206: types respectively) and a number indicating the number of bytes
        !           207: of storage occupied.
        !           208: Formats currently supported are listed below.
        !           209: The ranges of numeric types are indicated in parentheses.
        !           210: .s3
        !           211: .lp +20 15
        !           212: c1 \- c255     character data of length 1\-255 characters
        !           213: .lp +20 15
        !           214: i1     1-byte integer (\*-128 to +127)
        !           215: .lp +20 15
        !           216: i2     2-byte integer (\*-32768 to +32767)
        !           217: .lp +20 15
        !           218: i4     4-byte integer  (\*-2,147,483,648 to +2,147,483,647)
        !           219: .lp +20 15
        !           220: .if n f4       4-byte floating (\*-10**38 to +10**38,
        !           221: .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,
        !           222: 7 decimal digit precision)
        !           223: .lp +20 15
        !           224: .if n f4       8-byte floating (\*-10**38 to +10**38,
        !           225: .if t f4       8-byte floating (\*-10\u\x'-0.2v'\s-3\&38\s0\d to +10\u\x'-0.2v'\s-3\&38\s0\d,
        !           226: 17 decimal digit precision)
        !           227: .i0
        !           228: .s3
        !           229: One numeric format can be converted to
        !           230: or substituted for any other numeric format. 
        !           231: .s1
        !           232: 9. Type Conversion.
        !           233: .s2
        !           234: When operating on two numeric domains of
        !           235: different types,
        !           236: \*(II converts as necessary to make the
        !           237: types identical.
        !           238: .s3
        !           239: When operating on an integer and a floating
        !           240: point number,
        !           241: the integer is converted to a floating point
        !           242: number before the operation.
        !           243: When operating on two integers of different
        !           244: sizes, the smaller is converted to
        !           245: the size of the larger.
        !           246: When operating on two floating point number
        !           247: of different size,
        !           248: the larger is converted to the smaller.
        !           249: .s3
        !           250: The following table summarizes the possible combinations:
        !           251: .s3
        !           252: .dt
        !           253: .if n .in +4
        !           254: .if t .in +1i
        !           255: .nf
        !           256:        i1      i2      i4      f4      f8
        !           257: .s3
        !           258: i1 \-  i1      i2      i4      f4      f8
        !           259: i2 \-  i2      i2      i4      f4      f8
        !           260: i4 \-  i4      i4      i4      f4      f8
        !           261: f4 \-  f4      f4      f4      f4      f4
        !           262: f8 \-  f8      f8      f8      f4      f8
        !           263: .dt
        !           264: .i0
        !           265: .fi
        !           266: .s3
        !           267: \*(II provides five type conversion
        !           268: operators specifically for
        !           269: overriding the default actions.
        !           270: The operators are:
        !           271: .s3
        !           272: .nf
        !           273: .in +4
        !           274: .if n .ta 18
        !           275: .if t .ta 1.4i
        !           276: int1(a_expr)   result type i1
        !           277: int2(a_expr)   result type i2
        !           278: int4(a_expr)   result type i4
        !           279: float4(a_expr) result type f4
        !           280: float8(a_expr) result type f8
        !           281: .dt
        !           282: .fi
        !           283: .i0
        !           284: .s3
        !           285: The type conversion operators convert their argument
        !           286: a_expr to the requested type.
        !           287: .it A_expr 
        !           288: can be anything including character.
        !           289: If a character value cannot be converted,
        !           290: an error occures and processing is halted.
        !           291: This can happen only if the syntax of the
        !           292: character value is incorrect.
        !           293: .s3
        !           294: Overflow is not checked on conversion.
        !           295: .s1
        !           296: 10. Target_list
        !           297: .s2
        !           298: .br
        !           299: A target list is a parenthesized, comma separated list of one
        !           300: or more elements , each of which must be of one of the following
        !           301: forms:
        !           302: .s3
        !           303: a)
        !           304: .it result_attname 
        !           305: .bd is 
        !           306: .it a_expr
        !           307: .s3
        !           308: .it Result_attname 
        !           309: is the name of the attribute to be created (or an
        !           310: already existing attribute name in the case of update statements.)
        !           311: The equal sign (``='') may be used
        !           312: interchangeably with 
        !           313: .bd is.
        !           314: In the case where 
        !           315: .it a_expr
        !           316: is anything other than
        !           317: a single attribute, this form
        !           318: must be used to assign a result
        !           319: name to the expression.
        !           320: .s3
        !           321: b)  
        !           322: .it attribute
        !           323: .s3
        !           324: In the case of a 
        !           325: .it retrieve,
        !           326: the resultant domain
        !           327: will acquire the same name as that of the attribute being retrieved.
        !           328: In the case of update statements
        !           329: (\c
        !           330: .it "append, replace\c"
        !           331: ),
        !           332: the relation being updated must have
        !           333: a domain with exactly that name.
        !           334: .s3
        !           335: Inside the target list the keyword 
        !           336: .bd all
        !           337: can be used to represent all domains.
        !           338: For example:
        !           339: .if n .in +5
        !           340: .if t .in +0.5i
        !           341: .s3
        !           342: range of e is employee
        !           343: .br
        !           344: retrieve (e.all) where e.salary > 10000
        !           345: .i0
        !           346: .s3
        !           347: will retrieve all domains of employee for
        !           348: those tuples which satisfy the qualification.
        !           349: .bd All
        !           350: can be used in the target list of
        !           351: a 
        !           352: .it retrieve 
        !           353: or an 
        !           354: .bd append.
        !           355: The domains will be inserted in their
        !           356: ``create'' order, that is,
        !           357: the same order they were listed in the
        !           358: .it create 
        !           359: statement.
        !           360: .s1
        !           361: 11. Comparison operators
        !           362: .s2
        !           363: Comparison operators take arbitrary expressions as operands.
        !           364: .s3
        !           365: .dt
        !           366: .nf
        !           367:        <       (less than)
        !           368:        <=      (less than or equal)
        !           369:        >       (greater than)
        !           370:        >=      (greater than or equal)
        !           371:        =       (equal to)
        !           372:        !=      (not equal to)
        !           373: .fi
        !           374: .s3
        !           375: They are all of equal precedence.
        !           376: When comparisons are made on
        !           377: character attributes, all blanks are ignored.
        !           378: .s1
        !           379: 12. Logical operators
        !           380: .s2
        !           381: Logical operators take clauses as operands and
        !           382: group left-to-right:
        !           383: .s3
        !           384: .nf
        !           385:        not     (logical not; negation)
        !           386:        and     (logical and; conjunction)
        !           387:        or      (logical or; disjunction)
        !           388: .fi
        !           389: .i0
        !           390: .dt
        !           391: .s3
        !           392: .bd Not
        !           393: has the highest precedence of the three.
        !           394: .bd And
        !           395: and 
        !           396: .bd or 
        !           397: have equal precedence.
        !           398: Parentheses may be used for arbitrary grouping.
        !           399: .s1
        !           400: 13. Qualification (qual)
        !           401: .s2
        !           402: A 
        !           403: .it qualification 
        !           404: consists of any number of clauses connected
        !           405: by logical operators.
        !           406: A clause  is a pair of expressions connected by a comparison operator:
        !           407: .s3
        !           408: .dt
        !           409:        a_expr comparison_operator a_expr
        !           410: .s3
        !           411: Parentheses may be used for arbitrary
        !           412: grouping.
        !           413: A qualification may thus be:
        !           414: .s3
        !           415: .in +4
        !           416: .it clause
        !           417: .br
        !           418: .bd not 
        !           419: .it qual
        !           420: .br
        !           421: .it qual 
        !           422: .bd or
        !           423: .it qual
        !           424: .br
        !           425: .it qual 
        !           426: .bd and
        !           427: .it qual
        !           428: .br
        !           429: (
        !           430: .it qual
        !           431: )
        !           432: .i0
        !           433: .s1
        !           434: 14. Functional expressions
        !           435: .s2
        !           436: A 
        !           437: .it "functional expression"
        !           438: consists of a function name followed
        !           439: by a parenthesized (list of) operand(s).
        !           440: Functional expressions can be nested to any level.
        !           441: In the following list of functions supported (\c
        !           442: .it n\c
        !           443: )
        !           444: represents an arbitrary numeric type expression.
        !           445: The format of the result is indicated on the right.
        !           446: .s3
        !           447: .if n .ta 10 25
        !           448: .if n .in 24
        !           449: .if t .ta 1.0i 2.5i
        !           450: .if t .in 2.5i
        !           451: .de xx
        !           452: .lp +20 15
        !           453: \fB\\$1(\fI\\$2\fB)\fR \-\t\c
        !           454: ..
        !           455: .xx abs n
        !           456: same as 
        !           457: .it n
        !           458: (absolute value)
        !           459: .xx ascii n
        !           460: character string (converts numeric to character)
        !           461: .xx atan n
        !           462: f8 (arctangent)
        !           463: .xx concat a,b
        !           464: character (character concatenation. See 16.2)
        !           465: .xx cos n
        !           466: f8 (cosine)
        !           467: .xx exp n 
        !           468: f8 (exponential of 
        !           469: .it n\c
        !           470: )
        !           471: .xx gamma n 
        !           472: f8 (log gamma)
        !           473: .xx log n
        !           474: f8 (natural logarithm)
        !           475: .xx mod n,b
        !           476: same as 
        !           477: .it b
        !           478: (\c
        !           479: .it n
        !           480: modulo
        !           481: .it "b. n" 
        !           482: and 
        !           483: .it b 
        !           484: must be i1, i2, or i4)
        !           485: .xx sin n 
        !           486: f8 (sine)
        !           487: .xx sqrt n
        !           488: f8 (square root)
        !           489: .dt
        !           490: .i0
        !           491: .s1
        !           492: 15. Aggregate expressions
        !           493: .s2
        !           494: Aggregate expressions provide a way to aggregate a computed expression
        !           495: over a set of tuples.
        !           496: .s1
        !           497: 15.1. Aggregation operators
        !           498: .s2
        !           499: The definitions
        !           500: of the aggregates are listed below.
        !           501: .s3
        !           502: .de xx
        !           503: .lp +20 15
        !           504: \fB\\$1\fP \-\t\c
        !           505: ..
        !           506: .xx count
        !           507: (i4) count of occurrences
        !           508: .xx countu
        !           509: (i4) count of unique occurrences
        !           510: .xx sum
        !           511: summation
        !           512: .xx sumu
        !           513: summation of unique values
        !           514: .xx avg
        !           515: (f8) average (sum/count)
        !           516: .xx avgu
        !           517: (f8) unique average (sumu/countu)
        !           518: .xx max
        !           519: maximum
        !           520: .xx min
        !           521: minimum
        !           522: .xx any
        !           523: (i2) value is 1 if any tuples satisfy
        !           524: the qualification, else it is 0
        !           525: .dt
        !           526: .i0
        !           527: .s1
        !           528: 15.2. Simple aggregate
        !           529: .s2
        !           530: .it "\taggregation_operator" 
        !           531: (\c
        !           532: .it a_expr  
        !           533: [ 
        !           534: .bd where
        !           535: .it qual
        !           536: ] )
        !           537: .dt
        !           538: .s3
        !           539: A simple aggregate evaluates to a single scalar value.
        !           540: .it A_expr 
        !           541: is aggregated over the set of tuples satisfying
        !           542: the qualification (or all tuples in the range of the expression if
        !           543: no qualification is present).
        !           544: Operators 
        !           545: .it sum 
        !           546: and 
        !           547: .it avg 
        !           548: require numeric type 
        !           549: .it a_expr;
        !           550: .it "count, any, max"
        !           551: and 
        !           552: .it min 
        !           553: permit a character type attribute as well as
        !           554: numeric type 
        !           555: .it a_expr.
        !           556: .s3
        !           557: .ul 1
        !           558: Simple aggregates are completely local.
        !           559: That is, they are logically removed from the
        !           560: query, processed separately, and replaced
        !           561: by their scalar value.
        !           562: .s1
        !           563: 15.3. ``\c
        !           564: .bd any\c
        !           565: \&''
        !           566: aggregate
        !           567: .s2
        !           568: It is sometimes useful to know if any tuples satisfy a
        !           569: particular qualification.
        !           570: One way of doing this is by using the aggregate 
        !           571: .it count
        !           572: and checking whether the return is zero or non-zero.
        !           573: Using
        !           574: .it any
        !           575: instead of 
        !           576: .it count
        !           577: is more efficient since
        !           578: processing is stopped, if possible, the first time a tuple
        !           579: satisfies a qualification.
        !           580: .s3
        !           581: .it Any
        !           582: returns 1 if the qualification is true
        !           583: and 0 otherwise.
        !           584: .s1
        !           585: 15.4. Aggregate functions
        !           586: .s2
        !           587: .it "\taggregation_operator" 
        !           588: (\c 
        !           589: .it a_expr 
        !           590: .bd by
        !           591: .it by_domain
        !           592: .br
        !           593: .it "\t\t{, by_domain}" 
        !           594: [
        !           595: .bd where 
        !           596: .it qual
        !           597: ] )
        !           598: .s3
        !           599: Aggregate functions are extensions of simple aggregates.
        !           600: The 
        !           601: .it by
        !           602: operator groups (i.e. partitions) the set of qualifying tuples by 
        !           603: .it by_domain 
        !           604: values.
        !           605: For more than one 
        !           606: .it by_domain, 
        !           607: the values which are grouped by are the concatenation
        !           608: of individual 
        !           609: .it by_domain 
        !           610: values.
        !           611: .it A_expr 
        !           612: is as in simple aggregates.
        !           613: The aggregate function evaluates to a set of aggregate results,
        !           614: one for each partition into which the set of qualifying
        !           615: tuples has been grouped.
        !           616: The aggregate value used during evaluation of the query is the
        !           617: value associated with the partition into which
        !           618: the tuple currently being processed would fall.
        !           619: .s3
        !           620: Unlike simple aggregates, aggregate functions
        !           621: are not completely local.
        !           622: The 
        !           623: .it by_list,
        !           624: which differentiates
        !           625: aggregate functions from simple aggregates,
        !           626: is global
        !           627: to the query.
        !           628: Domains in the 
        !           629: .it by_list
        !           630: are automatically linked to the
        !           631: other domains in the query which are
        !           632: in the same relation.
        !           633: .s3
        !           634: Example:
        !           635: .ft B
        !           636: .nf 
        !           637:        /\*(** retrieve the average salary for the employees
        !           638:        working for each manager \*(**/
        !           639:        range of e is employee
        !           640:        retrieve (e.manager, avesal=avg(e.salary by e.manager))
        !           641: .fi
        !           642: .i0
        !           643: .ft
        !           644: .s1
        !           645: 15.5 Aggregates on Unique Values.
        !           646: .s2
        !           647: It is occasionally necessary to aggregate on
        !           648: unique values of an expression.
        !           649: The 
        !           650: .it avgu\c
        !           651: , 
        !           652: .it sumu\c
        !           653: , and 
        !           654: .it countu
        !           655: aggregates
        !           656: all remove duplicate values before
        !           657: performing the aggregation.
        !           658: For example:
        !           659: .s3
        !           660:        count(e.manager)
        !           661: .s3
        !           662: would tell you how many occurrences of 
        !           663: .it "e.manager"
        !           664: exist.
        !           665: But
        !           666: .s3
        !           667:        countu(e.manager)
        !           668: .s3
        !           669: would tell you how many unique values of
        !           670: .it "e.manager"
        !           671: exist.
        !           672: .s1
        !           673: 16. Special character operators
        !           674: .s2
        !           675: There are three special features which are particular
        !           676: to character domains.
        !           677: .s1
        !           678: 16.1 Pattern matching characters
        !           679: .s2
        !           680: There are four characters which take
        !           681: on special meaning when used in character constants
        !           682: (strings):
        !           683: .s3
        !           684: .de xx
        !           685: .lp +10 6
        !           686: \\$1\t\c
        !           687: ..
        !           688: .xx \*(**     
        !           689: matches any string of zero or more characters.
        !           690: .xx ?     
        !           691: matches any single character.
        !           692: .xx [..]  
        !           693: matches any of characters in the brackets.
        !           694: .i0
        !           695: .s3
        !           696: These characters can be used in any combination to
        !           697: form a variety of tests.
        !           698: For example:
        !           699: .s3
        !           700: .lp +25 20
        !           701: where e.name = "\*(**" \- matches any name.
        !           702: .lp +25 20
        !           703: where e.name = "E\*(**" \- matches any name starting with "E".
        !           704: .lp +25 20
        !           705: where e.name = "\*(**ein" \- matches all names ending with "ein"
        !           706: .lp +25 20
        !           707: where e.name = "\*(**[aeiou]\*(**" \- matches any name with at least one vowel.
        !           708: .lp +25 20
        !           709: where e.name = "Allman?" \- matches any seven character name starting with "Allman".
        !           710: .lp +25 20
        !           711: where e.name = "[A\-J]\*(**" \- matches any name starting with A,B,..,J.
        !           712: .i0
        !           713: .s3
        !           714: The special meaning of the pattern matching characters
        !           715: can be disabled by preceding them with a `\e'.
        !           716: Thus ``\e\*(**'' refers to the character ``\*(**''.
        !           717: When the special characters appear in the target
        !           718: list they must be escaped.
        !           719: For example:
        !           720: .s3
        !           721: .dt
        !           722:        title = "\e\*(**\e\*(**\e\*(** ingres \e\*(**\e\*(**\e\*(**"
        !           723: .s3
        !           724: is the correct way to assign the string
        !           725: ``\*(**\*(**\*(** ingres \*(**\*(**\*(**'' to the domain ``title''.
        !           726: .s1
        !           727: 16.2 Concatenation
        !           728: .s2
        !           729: There is a concatenation operator which can
        !           730: form one character string from two.
        !           731: Its syntax is ``concat(field1, field2)''.
        !           732: The size of the new character string is the
        !           733: sum of the sizes of the original two.
        !           734: Trailing blanks are trimmed from the first
        !           735: field, the second field is concatenated
        !           736: and the remainder is blank padded. The result is never
        !           737: trimmed to 0 length, however.
        !           738: Concat can be arbitrarily nested inside other
        !           739: concats. For example:
        !           740: .s3
        !           741: .dt
        !           742:        name = concat(concat(x.lastname, ","), x.firstname)
        !           743: .s3
        !           744: will concatenate 
        !           745: x.lastname with a comma and
        !           746: then concatenate x.firstname to that.
        !           747: .s1
        !           748: 16.3 Ascii (numeric to character translation)
        !           749: .s2
        !           750: The 
        !           751: .it ascii 
        !           752: function can be used to convert a
        !           753: numeric field to its character representation.
        !           754: This can be useful when it is desired to compare
        !           755: a numeric value with a character value.
        !           756: For example:
        !           757: .nf
        !           758: .s3
        !           759: .dt
        !           760:        retrieve ( ... ) 
        !           761:                where x.chardomain = ascii(x.numdomain)
        !           762: .fi
        !           763: .s3
        !           764: .it Ascii 
        !           765: can be applied to a character value.
        !           766: The result is simply the character value unchanged.
        !           767: The numeric conversion formats are determined by
        !           768: the printing formats (see ingres(unix)).
        !           769: .sh "SEE ALSO"
        !           770: append(quel),
        !           771: delete(quel), 
        !           772: range(quel), 
        !           773: replace(quel), 
        !           774: retrieve(quel), 
        !           775: ingres(unix)
        !           776: .sh BUGS
        !           777: The maximum number of variables which can
        !           778: appear in one query is 10.
        !           779: .s3
        !           780: Numeric overflow, underflow, and divide by zero
        !           781: are not detected.
        !           782: .s3
        !           783: When converting between numeric types, overflow is
        !           784: not checked.

unix.superglobalmegacorp.com

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