Dear all,
Please find attached the latest BNF for the ADQL, which I believe
incorporates (unless something is found to be missing or wrong) all that
we agreed at the latest IVOA Interop. In this moment Alex & Pat are
updating the relevant sections of the document in proper English words.
I plan to incorporate the BNF changes into the doc as soon as they
finish and, of course, upon approval from you all of the contents of
this email. As I am using the recently updated voql-teg mailing list, I
would appreciate that you confirm receipt of this email.
These are the changes done since the last draft spec was released (ADQL-20070918): + CONTAINS and INTERSECTS have been added to the list of ADQL reserved words.
+ The 'contains' predicate has been updated according to the syntax
proposed by Alex & Pat and agreed at the Cambridge Interop:
CONTAINS(region, coordsys, longitude, latitude)
<contains_predicate> ::=
[ NOT ]CONTAINS <left_paren> <region>
<comma> <coordsys>
<comma> <coord_lon>
<comma> <coord_lat> <right_paren>
+ The 'intersects' predicate has been updated according to the syntax
proposed by Alex & Pat and agreed at the Cambridge Interop:
INTERSECTS(region1, region2)
<intersects_predicate> ::=
INTERSECTS <left_paren> <region>
<comma> <region> <right_paren>
+ A new construct, geometric_function, has been added to the numeric_value_function to hold geometrical functions. The idea is to declare explicitly the syntax of certain functions rather than using the generic user_defined_function placeholder for such purpose. In this context, the DISTANCE function has been sketched according to Pat's proposal:
<numeric_value_function> ::=
<trigonometric_function> | <math_function> | <geometric_function> | <user_defined_function>
<geometric_function> ::
DISTANCE <left_paren> <coord_lon> <comma> <coord_lat> <comma>
<coord_lon> <comma> <coord_lat> <right_paren> | ...
+ The 'position' construct has been left as in its original syntax
though it is not referenced across the BNF. The reason of this is that
we have identified this construct as potentially useful.
<position> ::=
<left_paren> <coord_sys> <comma> <coord_lon> <comma> <coord_lat>
<right_paren>
+ As per requested by Pat and Alex, the region is now a type that can be used as a column type or a parameter type to the functions. It also covers the possibility of a binary representation and the support of a region based upon some STC string.
<region> ::= <region_expression> | <region_value>
<region_expression> ::= <circle> | <rectangle> | <polygon>
<region_value> ::= <column_reference> | <user_defined_function>
<user_defined_function> ::=
<user_defined_function_name>
<left_paren>
[ <user_defined_function_param> [ { <comma>
<right_paren>
<user_defined_function_name> ::=
[ <default_function_prefix> ] <regular_identifier>
<user_defined_function_param> ::=
<numeric_value_expression> | <character_value_expression>
That is all for now. Please tell me what you think.
Regards
Iņaki
-- Iņaki Ortiz de Landaluce European Space Agency (ESA) European Space Astronomy Centre (ESAC) Science Operations Department (SCI-O) Science Archives Engineering Unit (SCI-OE) E-mail: Inaki.Ortiz-at-sciops.esa.int Tel: +34 91 813 13 67 Fax: +34 91 813 13 22 European Space Astronomy Centre (ESAC) 28691 Villanueva de la Caņada P.O. Box 78, Madrid, SPAIN ================================================================================================ This message and any attachments are intended for the use of the addressee or addressees only. The unauthorised disclosure, use, dissemination or copying (either in whole or in part) of its content is prohibited. If you received this message in error, please delete it from your system and notify the sender. E-mails can be altered and their integrity cannot be guaranteed. ESA shall not be liable for any e-mail if modified. =================================================================================================Received on 2007-11-14Z14:35:37
<ADQL_language_character> ::=
<simple_Latin_letter> | <digit> | <SQL_special_character>
<ADQL_reserved_word> ::=
ABS | ACOS | ASIN | ATAN | ATAN2 | CEILING | CIRCLE | CONTAINS | COS | DEGREES | EXP | FLOOR | GAL | ICRS | INTERSECTS | LOG | LOG10 | MODE | PI | POLYGON | POWER | RADIANS | RECTANGLE | REGION | RAND | ROUND | SIN | SQRT | SQUARE | TAN | TOP | TRUNCATE | UDF
<SQL_embedded_language_character> ::=
<left_bracket> | <right_bracket>
<SQL_reserved_word> ::=
ABSOLUTE | ACTION | ADD | ALL | ALLOCATE | ALTER | AND | ANY | ARE | AS | ASC | ASSERTION | AT | AUTHORIZATION | AVG | BEGIN | BETWEEN | BIT | BIT_LENGTH | BOTH | BY | CASCADE | CASCADED | CASE | CAST | CATALOG | CHAR | CHARACTER | CHARACTER_LENGTH | CHAR_LENGTH | CHECK | CLOSE | COALESCE | COLLATE | COLLATION | COLUMN | COMMIT | CONNECT | CONNECTION | CONSTRAINT | CONSTRAINTS | CONTINUE | CONVERT | CORRESPONDING | COUNT | CREATE | CROSS | CURRENT | CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP | CURRENT_USER | CURSOR | DATE | DAY | DEALLOCATE | DECIMAL | DECLARE | DEFAULT | DEFERRABLE | DEFERRED | DELETE | DESC | DESCRIBE | DESCRIPTOR | DIAGNOSTICS | DISCONNECT | DISTINCT | DOMAIN | DOUBLE | DROP | ELSE | END | END-EXEC | ESCAPE | EXCEPT | EXCEPTION | EXEC | EXECUTE | EXISTS | EXTERNAL | EXTRACT | FALSE | FETCH | FIRST | FLOAT | FOR | FOREIGN | FOUND | FROM | FULL | GET | GLOBAL | GO | GOTO | GRANT | GROUP | HAVING | HOUR | IDENTITY | IMMEDIATE | IN | INDICATOR | INITIALLY | INNER | INPUT | INSENSITIVE | INSERT | INT | INTEGER | INTERSECT | INTERVAL | INTO | IS | ISOLATION | JOIN | KEY | LANGUAGE | LAST | LEADING | LEFT | LEVEL | LIKE | LOCAL | LOWER | MATCH | MAX | MIN | MINUTE | MODULE | MONTH | NAMES | NATIONAL | NATURAL | NCHAR | NEXT | NO | NOT | NULL | NULLIF | NUMERIC | OCTET_LENGTH | OF | ON | ONLY | OPEN | OPTION | OR | ORDER | OUTER | OUTPUT | OVERLAPS | PAD | PARTIAL | POSITION | PRECISION | PREPARE | PRESERVE | PRIMARY | PRIOR | PRIVILEGES | PROCEDURE | PUBLIC | READ | REAL | REFERENCES | RELATIVE | RESTRICT | REVOKE | RIGHT | ROLLBACK | ROWS | SCHEMA | SCROLL | SECOND | SECTION | SELECT | SESSION | SESSION_USER | SET | SIZE | SMALLINT | SOME | SPACE | SQL | SQLCODE | SQLERROR | SQLSTATE | SUBSTRING | SUM | SYSTEM_USER | TABLE | TEMPORARY | THEN | TIME | TIMESTAMP | TIMEZONE_HOUR | TIMEZONE_MINUTE | TO | TRAILING | TRANSACTION | TRANSLATE | TRANSLATION | TRIM | TRUE | UNION | UNIQUE | UNKNOWN | UPDATE | UPPER | USAGE | USER | USING | VALUE | VALUES | VARCHAR | VARYING | VIEW | WHEN | WHENEVER | WHERE | WITH | WORK | WRITE | YEAR | ZONE
<SQL_special_character> ::=
<ampersand> | <asterisk> | <colon> | <comma> | <double_quote> | <equals_operator> | <greater_than_operator> | <left_paren> | <less_than_operator> | <minus_sign> | <percent> | <period> | <plus_sign> | <question_mark> | <quote> | <right_paren> | <semicolon> | <solidus> | <space> | <underscore> | <vertical_bar>
<ampersand> ::= &
<approximate_numeric_literal> ::= <mantissa> E <exponent>
<as_clause> ::= [ AS ] <column_name>
<asterisk> ::= *
<between_predicate> ::=
<value_expression> [ NOT ] BETWEEN <value_expression> AND <value_expression>
<boolean_factor> ::= [ NOT ] <boolean_primary>
<boolean_primary> ::=
<predicate> | <left_paren> <search_condition> <right_paren>
<boolean_term> ::= <boolean_factor> | <boolean_term> AND <boolean_factor>
<catalog_name> ::= <identifier>
<character_factor> ::= <character_primary>
<character_primary> ::= <value_expression_primary> | <user_defined_function>
<character_representation> ::= <nonquote_character> | <quote_symbol>
<character_string_literal> ::=
<quote> [ <character_representation>... ] <quote> [ {<separator>... <quote> [ <character_representation>... ]<quote>}... ]
<character_value_expression> ::= <concatenation> | <character_factor>
<circle> ::=
CIRCLE <left_paren> <coord_sys> <comma> <coord_lon> <comma> <coord_lat> <comma> <radius> <right_paren>
<colon> ::= :
<column_name> ::= <identifier>
<column_name_list> ::= <column_name> [ { <comma> <column_name> }... ]
<column_reference> ::= [ <qualifier> <period> ] <column_name>
<comma> ::= ,
<comment> ::= <comment_introducer> [ <comment_character>... ] <newline>
<comment_character> ::= <nonquote_character> | <quote>
<comment_introducer> ::= <minus_sign><minus_sign> [<minus_sign>...]
<comp_operator> ::=
<equals_operator> | <not_equals_operator> | <less_than_operator> | <greater_than_operator> | <less_than_or_equals_operator> | <greater_than_or_equals_operator>
<comparison_predicate> ::= <value_expression> <comp_operator> <value_expression>
<concatenation> ::=
<character_value_expression> <concatenation_operator> <character_factor>
<concatenation_operator> ::= ||
<contains_predicate> ::=
[ NOT ]CONTAINS <left_paren> <region> <comma> <coordsys> <comma> <coord_lon> <comma> <coord_lat> <right_paren>
<coord_lat> ::= <numeric_value_expression>
!! generic latitude
<coord_lon> ::= <numeric_value_expression>
!! generic longitude
<coord_sys> ::= <coord_sys_keyword> | <coord_sys_value>
<coord_sys_keyword> ::= ICRS | GAL
<coord_sys_value> ::= <column_reference> | <user_defined_function>
<correlation_name> ::= <identifier>
<correlation_specification> ::= [ AS ] <correlation_name>
<default_function_prefix> ::=
!! The prefix is set by default to "udf_." !! It should be possible to change the default prefix to accommodate local preferences
<delimited_identifier> ::= <double_quote> <delimited_identifier_body> <double_quote>
<delimited_identifier_body> ::= <delimited_identifier_part>?
<delimited_identifier_part> ::= <nondoublequote_character> | <doublequote_symbol>
<delimiter_token> ::=
<character_string_literal> | <delimited_identifier> | <ADQL_special_character> | <SQL_special_character> | <not_equals_operator> | <greater_than_or_equals_operator> | <less_than_or_equals_operator> | <concatenation_operator> | <double_period> | <left_bracket> | <right_bracket>
<derived_column> ::= <value_expression> [ <as_clause> ]
<derived_table> ::= <table_subquery>
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<double_period> ::= ..
<double_quote> ::= "
<double_quote_symbol> ::= <double_quote><double_quote>
<equals_operator> ::= =
<exact_numeric_literal> ::=
<unsigned_integer> [ <period> [ <unsigned_integer> ] ] | <period> <unsigned_integer>
<exists_predicate> ::= EXISTS <table_subquery>
<exponent> ::= <signed_integer>
<factor> ::= [ <sign> ] <numeric_primary>
<from_clause> ::= FROM <table_reference> [ { <comma> <table_reference> }... ]
<general_literal> ::= <character_string_literal>
<general_set_function> ::=
<set_function_type> <left_paren> [ <set_quantifier> ] <value_expression> <right_paren>
<geometric_function> ::
DISTANCE <left_paren> <coord_lon> <comma> <coord_lat> <comma> <coord_lon> <comma> <coord_lat> <right_paren> | ...
<greater_than_operator> ::= >
<greater_than_or_equals_operator> ::= >=
<group_by_clause> ::= GROUP BY <grouping_column_reference_list>
<grouping_column_reference> ::= <column_reference>
<grouping_column_reference_list> ::=
<grouping_column_reference> [ { <comma> <grouping_column_reference> }... ]
<having_clause> ::= HAVING <search_condition>
<identifier> ::= <regular_identifier> | <delimited_identifier>
<in_predicate> ::= <value_expression> [ NOT ] IN <in_predicate_value>
<in_predicate_value> ::=
<table_subquery> | <left_paren> <in_value_list> <right_paren>
<in_value_list> ::=
<value_expression> { <comma> <value_expression> } ...
<intersects_predicate> ::=
INTERSECTS <left_paren> <region> <comma> <region> <right_paren>
<join_column_list> ::= <column_name_list>
<join_condition> ::= ON <search_condition>
<join_specification> ::= <join_condition> | <named_columns_join>
<join_type> ::=
INNER | <outer_join_type> [ OUTER ]
<joined_table> ::=
<qualified_join> | <left_paren> <joined_table> <right_paren>
<keyword> ::= <SQL_reserved_word> | <ADQL_reserved_word>
<left_bracket> ::= [
<left_paren> ::= (
<less_than_operator> ::= <
<less_than_or_equals_operator> ::= <=
<like_predicate> ::=
<match_value> [ NOT ] LIKE <pattern>
<mantissa> ::= <exact_numeric_literal>
<match_value> ::= <character_value_expression>
<math_function> ::=
ABS <left_paren> <numeric_value_expression> <right_paren> | CEILING <left_paren> <numeric_value_expression> <right_paren> | DEGREES <left_paren> <numeric_value_expression> <right_paren> | EXP <left_paren> <numeric_value_expression> <right_paren> | FLOOR <left_paren> <numeric_value_expression> <right_paren> | LOG <left_paren> <numeric_value_expression> <right_paren> | PI <left_paren><right_paren> | POWER <left_paren> <numeric_value_expression> <comma> <unsigned_integer> <right_paren> | RADIANS <left_paren> <numeric_value_expression> <right_paren> | SQUARE <left_paren> <numeric_value_expression> <right_paren> | SQRT <left_paren> <numeric_value_expression> <right_paren> | LOG10 <left_paren> <numeric_value_expression> <right_paren> | RAND <left_paren> [ <numeric_value_expression> ] <right_paren> | ROUND <left_paren> <numeric_value_expression> <right_paren> | TRUNCATE <left_paren> <numeric_value_expression> <right_paren>
<minus_sign> ::= -
<named_columns_join> ::= USING <left_paren> <join_column_list> <right_paren>
<newline> ::= !! implementation defined end of line indicator
<nondelimiter_token> ::=
<regular_identifier> | <keyword> | <unsigned_numeric_literal>
<nondoublequote_character> ::= !! See syntax rules
<nonquote_character> ::= !! One ASCII character
<not_equals_operator> ::= <not_equals_operator1> | <not_equals_operator2>
<not_equals_operator1> ::= <>
<not_equals_operator2> ::= !=
<null_predicate> ::= <column_reference> IS [ NOT ] NULL
<numeric_primary> ::= <value_expression_primary> | <numeric_value_function>
<numeric_value_expression> ::=
<term> | <numeric_value_expression> <plus_sign> <term> | <numeric_value_expression> <minus_sign> <term>
<numeric_value_function> ::=
<trigonometric_function> | <math_function> | <geometric_function> | <user_defined_function>
<order_by_clause> ::= ORDER BY <sort_specification_list>
<ordering_specification> ::= ASC | DESC
<outer_join_type> ::= LEFT | RIGHT | FULL
<pattern> ::= <character_value_expression>
<percent> ::= %
<period> ::= .
<plus_sign> ::= +
<polygon> ::=
POLYGON <left_paren> <coord_sys> <comma> <coord_lon> <comma> <coord_lat> <comma> <coord_lon> <comma> <coord_lat> { <comma> <coord_lon> <comma> <coord_lat> } ? <right_paren>
<position> ::=
<left_paren> <coord_sys> <comma> <coord_lon> <comma> <coord_lat> <right_paren>
<predicate> ::=
<comparison_predicate> | <between_predicate> | <in_predicate> | <like_predicate> | <null_predicate> | <exists_predicate> | <region_predicate>
<qualified_join> ::=
<table_reference> [ NATURAL ] [ <join_type> ] JOIN <table_reference> [ <join_specification> ]
<qualifier> ::= <table_name> | <correlation_name>
<query_expression> ::=
<query_specification> | <joined_table>
<query_specification> ::=
SELECT [ <set_quantifier> ] [ <set_limit> ] <select_list> <table_expression>
<question_mark> ::= ?
<quote> ::= '
<quote_symbol> ::= <quote> <quote>
<radius> ::= <numeric_value_expression>
<rectangle> ::=
RECTANGLE <left_paren> <coord_sys> <comma> <coord_lon> <comma> <coord_lat> <comma> <coord_lon> <comma> <coord_lat> <right_paren>
<region> ::= <region_expression> | <region_value>
<region_expression> ::= <circle> | <rectangle> | <polygon>
<region_predicate> ::= <contains_predicate> | <intersects_predicate>
<region_value> ::= <column_reference> | <user_defined_function>
<regular_identifier> ::=
<simple_Latin_letter>... [ { <underscore> | <simple_Latin_letter> | <digit> } ... ]
<right_bracket> ::= ]
<right_paren> ::= )
<schema_name> ::= [ <catalog_name> <period> ] <unqualified_schema_name>
<search_condition> ::=
<boolean_term> | <search_condition> OR <boolean_term>
<select_list> ::=
<asterisk> | <select_sublist> [ { <comma> <select_sublist> }... ]
<select_sublist> ::= <derived_column> | <qualifier> <period> <asterisk>
<semicolon> ::= ;
<separator> ::= { <comment> | <space> | <newline> }...
<set_function_specification> ::=
COUNT <left_paren> <asterisk> <right_paren> | <general_set_function>
<set_function_type> ::= AVG | MAX | MIN | SUM | COUNT
<set_limit> ::= TOP <unsigned_integer>
<set_quantifier> ::= DISTINCT | ALL
<sign> ::= <plus_sign> | <minus_sign>
<signed_integer> ::= [ <sign> ] <unsigned_integer>
<simple_Latin_letter> ::=
<simple_Latin_upper_case_letter> | <simple_Latin_lower_case_letter>
<simple_Latin_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
<simple_Latin_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
<solidus> ::= /
<sort_key> ::= <column_name> | <unsigned_integer>
<sort_specification> ::= <sort_key> [ <ordering_specification> ]
<sort_specification_list> ::= <sort_specification> [ { <comma> <sort_specification> }... ]
<space> ::= !! space character here
<string_value_expression> ::= <character_value_expression>
<subquery> ::=
<left_paren> <query_expression> <right_paren>
<table_expression> ::=
<from_clause> [ <where_clause> ] [ <group_by_clause> ] [ <having_clause> ] [ <order_by_clause> ]
<table_name> ::= [ <schema_name> <period> ] <identifier>
<table_reference> ::=
<table_name> [ <correlation_specification> ] | <derived_table> <correlation specification> | <joined_table>
<table_subquery> ::= <subquery>
<term> ::=
<factor> | <term> <asterisk> <factor> | <term> <solidus> <factor>
<token> ::=
<nondelimiter_token> | <delimiter_token>
<trigonometric_function> ::=
ACOS <left_paren> <numeric_value_expression> <right_paren> | ASIN <left_paren> <numeric_value_expression> <right_paren> | ATAN <left_paren> <numeric_value_expression> <right_paren> | ATAN2 <left_paren> <numeric_value_expression> <comma> <numeric_value_expression> <right_paren> | COS <left_paren> <numeric_value_expression> <right_paren> | COT <left_paren> <numeric_value_expression> <right_paren> | SIN <left_paren> <numeric_value_expression> <right_paren> | TAN <left_paren> <numeric_value_expression> <right_paren>
<underscore> ::= _
<unqualified_schema_name> ::= <identifier>
<unsigned_integer> ::= <digit> ...
<unsigned_literal> ::= <unsigned_numeric_literal> | <general_literal>
<unsigned_numeric literal> ::=
<exact_numeric_literal> | <approximate_numeric_literal>
<unsigned_value_specification> ::= <unsigned_literal>
<user_defined_function> ::=
<user_defined_function_name> <left_paren> [ <user_defined_function_param> [ { <comma> <user_defined_function_param> } ?] ] <right_paren>
<user_defined_function_name> ::=
[ <default_function_prefix> ] <regular_identifier>
<user_defined_function_param> ::=
<numeric_value_expression> | <character_value_expression>
<value_expression> ::=
<numeric_value_expression> | <string_value_expression>
<value_expression_primary> ::=
<unsigned_value_specification> | <column_reference> | <set_function_specification> | <left_paren> <value_expression> <right_paren>
<vertical_bar> ::= |
<where_clause> ::= WHERE <search_condition>