| ## picoSQL - supported SQL language | Corso Italia, 178 - 56125 Pisa Telefono/fax 050 46380 e-mail picosoft@picosoft.it

Supported syntax

    Instructions
    ------------

    alter-table-statement ::= alter-table-statement-add
          | alter-table-statement-drop
          | alter-table-statement-rename

    alter-table-statement-add ::=
          ALTER TABLE base-table-name ADD [COLUMN] column-identifier data-type

    alter-table-statement-drop ::=
          ALTER TABLE base-table-name DROP [COLUMN] column-identifier

    alter-table-statement-rename ::=
          ALTER TABLE base-table-name RENAME base-table-name

    create-index-statement ::=
          CREATE [UNIQUE] INDEX index-name ON base-table-name
          (column-identifier [ASC|DESC][,column-identifier [ASC|DESC]]...)

    create-table-statement ::=
          CREATE TABLE base-table-name
          (column-identifier data-type [PRIMARY KEY]
             [,column-identifier data-type [PRIMARY KEY]]...)
          [PRIMARY KEY (column-identifier[,column-identifier]...)]

    create-view-statement ::=
          CREATE VIEW base-view-name [(column-identifier[,column-identifier...])]
               AS select-for-view

    delete-statement-searched ::=
          DELETE FROM table-name [WHERE search-condition]

    drop-index-statement ::=
          DROP INDEX base-index-name

    drop-table-statement ::=
          DROP TABLE base-table-name

    drop-view-statement ::=
          DROP VIEW base-view-name

    insert-statement ::=
          INSERT INTO table-name [( column-identifier [, column-identifier]...)]
          VALUES (insert-value[, insert-value]... )

    replace-statement ::=
          REPLACE INTO table-name [( column-identifier [, column-identifier]...)]
          VALUES (insert-value[, insert-value]... )

    select-statement ::=
          SELECT [ALL | DISTINCT] select-list
          FROM table-reference-list
          [WHERE search-condition]
          [GROUP BY column-name [,column-name]...]
          [HAVING search-condition]
          [UNION select-statement]
          [order-by-clause]
          [LIMIT unsigned-integer]
          [OFFSET unsigned-integer]

    select-for-update-statement ::=
          SELECT [ALL | DISTINCT] select-list
          FROM base-table-name
          [WHERE search-condition]
          FOR UPDATE

    statement ::= create-index-statement
          | alter-table-statement
          | create-table-statement
          | create-view-statement
          | delete-statement-searched
          | drop-index-statement
          | drop-table-statement
          | drop-view-statement
          | insert-statement
          | replace-statement
          | select-statement
          | select-for-update-statement
          | update-statement-searched

    update-statement-searched
          UPDATE table-name
          SET column-identifier = {expression | NULL }
               [, column-identifier = {expression | NULL}]...
          [WHERE search-condition]

    Elements
    --------
    I seguenti elementi sono usati nelle istruzioni precedenti

    all-function :: {AVG|MAX|MIN|SUM}(expression)

    base-index-identifier ::= user-defined-name

    base-index-name ::= base-index-identifier

    base-table-identifier ::= user-defined-name

    base-table-name ::= base-table-identifier

    base-view-identifier ::= user-defined-name

    base-view-name ::= base-view-identifier

    between-predicate ::= expression [NOT] BETWEEN expression AND expression

    boolean-factor ::= [NOT] boolean-primary

    boolean-primary ::= comparison-predicate | ( search-condition )

    boolean-term ::= boolean-factor [AND boolean-term]

    character-string-literal ::= '{character}'

    column-identifier ::= user-defined-name

    column-name ::= [table-name.]column-identifier

    comparison-operator ::= < | > | <= | >= | = | <>

    comparison-predicate ::= expression comparison-operator expression

    data-type ::= CHAR | VARCHAR | NUMERIC | SMALLINT | INTEGER | INT | SERIAL |
                  REAL | FLOAT | DATE | TIME | TIMESTAMP | BLOB | CLOB

    digit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

    distinct-function :: {AVG|COUNT|MAX|MIN|SUM}(DISTINCT column-name)

    dynamic-parameter ::= ?

    exists-predicate ::= EXISTS (sub-query)

    expression ::= term | expression {+|-} term

    factor ::= [+|-]primary

    inner-join ::= table-name INNER JOIN ON {table-name|join} ON search-condition

    in-predicate ::= expression [NOT] IN expression [, expression]

    insert-value ::=
          dynamic-parameter
          | literal
          | NULL

    join ::= outer-join | inner-join

    letter ::= lower-case-letter | upper-case-letter

    like-predicate ::= column-name [NOT] LIKE pattern-value

    literal ::= character-string-literal

    lower-case-letter ::= a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z

    null-predicate ::= IS [NOT] NULL

    order-by-clause ::=  ORDER BY sort-specification [, sort-specification]...

    outer-join ::= table-name {LEFT|RIGHT} OUTER JOIN ON {table-name|join} ON search-condition

    predicate ::= between-predicate | comparison-predicate | exists-predicate | in-predicate | like-predicate | null-predicate

    primary ::= column-name
          | dynamic-parameter
          | literal
          | set-function-reference
          | scalar-function
          | ( expression )

    scalar-func ::= ABS(expression) | ACOS(expression) | ASIN(expression) |
                    ATAN(expression) | CEILING(expression) | COS(expression) |
                    EXP(expression) | FLOOR(expression) |  LOG(expression) |
                    LOG10(expression) | SIGN(expression) | SIN(expression) |
                    SQRT(expression) | TAN(expression) | COT (expression) |
                    LOWER(expression) | UPPER(expression) | LCASE(expression)|
                    UCASE(expression) | RTRIM(expression) | case(expression) |
                    CURRENT_TIMESTAMP(expression) |
                    ROUND(expression,expression)|TRUNCATE(expression,expression)|
                    CHAR(expression) | SPACE(expression) | ASCII(expression) |
                    LENGTH(expression) | CONCAT(expression,expression) |
                    SUBSTRING(expression,expression)|
                    LOCATE(expression,expression,expression) |
                    YEAR(expression) | MONTH(expression) | DAYOFMONTH (expression) |
                    HOUR(expression) | MINUTE(expression) | SECOND (expression) |
                    MILLISECOND (expression) | NOW()

    search-condition ::= boolean-term [OR search-condition]

    select-for-view ::=
          SELECT [ALL | DISTINCT] select-list
          FROM table-reference-list-for-view
          [WHERE search-condition]

    select-list ::= * | select-sublist [, select-sublist]...

    select-sublist ::= expression

    set-function-reference ::= COUNT(*)|distinct-function|all-function

    sort-specification ::= {unsigned-integer | column-name} [ASC | DESC]

    sub-query ::=
          SELECT [ALL | DISTINCT] select-list
          FROM table-reference-list
          [WHERE search-condition]
          [GROUP BY column-name [,column-name]...]
          [HAVING search-condition]

    table-identifier ::= user-defined-name

    table-name ::= table-identifier

    table-reference ::= table-name

    table-reference-list ::= table-reference [,table-reference] | join

    table-reference-list-for-view ::= table-reference | join

    term ::= factor | term {*|/} factor

    unsigned-integer ::= {digit}

    upper-case-letter ::= A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

    user-defined-name ::= letter[digit | letter | _]...