featurebase/sql3/sql3.ebnf
pokeeffe-molecula 15382a2863 sql3 changes (#2211)
* first cut of working (slowly) bulk insert; table valued functions and a tuple data type to support time quantums

* oversight

* filter pushdown implementation; bulk insert

* addressed some linter issues
2022-09-30 11:21:11 -07:00

268 lines
5.8 KiB
EBNF

(*
sql3
==========================
Document the SQL language support in FeatureBase
*)
sql3 = statement, [ ";" ] ;
statement = show_tables
| show_columns
| drop_table
| create_table_stmt
| alter_table_stmt
| select_stmt
| insert_stmt
| bulk_insert_stmt
| delete_stmt ;
(*
SHOW TABLES
----------------
Shows the tables within a FeatureBase instance.
*)
show_tables = "SHOW", "TABLES" ;
(*
SHOW COLUMNS
----------------
Shows the columns on a FeatureBase table.
*)
show_columns = "SHOW", "COLUMNS", "FROM", identifier ;
(*
DROP TABLE
----------------
Drops a FeatureBase table.
*)
drop_table = "DROP", "TABLE", [ "IF", "EXISTS" ], identifier ;
(*
CREATE TABLE
----------------
Creates a FeatureBase table.
*)
create_table_stmt = "CREATE", "TABLE", [ "IF", "NOT", "EXISTS" ], identifier, "(", column_def, { ",", column_def }, ")", { table_options } ;
column_def = identifier, type_name, { column_constraint } ;
(*
Column Constraint
----------------
Constraints for a column:
MIN, MAX - min/max for int types
TIMEUNIT - 's', 'ms' etc.
TIMEQUANTUM - 'YMD' etc.
*)
column_constraint =
"MIN", integer_literal
| "MAX", integer_literal
| "TIMEUNIT", string_literal, [ "EPOCH", date_literal ]
| "TIMEQUANTUM", string_literal, [ "TTL", string_literal ]
| "CACHETYPE", ( "RANKED" | "LRU" ), [ "SIZE", integer_literal ] ;
table_options = "KEYPARTITIONS", integer_literal
| "SHARDWIDTH", integer_literal ;
type_name = "INT"
| "BOOL"
| "TIMESTAMP"
| "DECIMAL"
| "STRING"
| "STRINGSET"
| "ID"
| "IDSET" ;
(*
ALTER TABLE
----------------
Alters a FeatureBase table.
*)
alter_table_stmt = "ALTER", "TABLE", ( add_column | drop_column | rename_column ) ;
add_column = "ADD", [ "COLUMN" ], column_def ;
drop_column = "DROP", [ "COLUMN" ], identifier ;
rename_column = "RENAME", [ "COLUMN" ], identifier, "TO", identifier ;
(*
INSERT
----------------
Inserts data into a FeatureBase table.
*)
insert_stmt = ( "INSERT" | "REPLACE" ), "INTO", identifier, [ "(", identifier, { identifier, "," }, ")" ], "VALUES", "(", expr, { expr, "," }, ")" ;
(*
BULK INSERT
----------------
Bulk inserts data into a FeatureBase table.
*)
bulk_insert_stmt = "BULK", "INSERT", identifier, "FROM", string_literal, [ "WITH", bulk_insert_option, { bulk_insert_option } ];
bulk_insert_option =
"BATCHSIZE", integer_literal
| "ROWSLIMIT", integer_literal
| "FORMAT", "CSV"
| bulk_insert_map_option ;
bulk_insert_map_option = "MAP", map_id_option | map_column_option ;
map_id_option = "_ID", "TO", ( "AUTOINCREMENT" | expr, { ",", expr } );
map_column_option = "OFFSET", integer_literal, "TO", column_name ;
(*
DELETE
----------------
Deletes data from a FeatureBase table.
*)
delete_stmt = "DELETE" ;
(*
SELECT
----------------
Queries a FeatureBase table.
*)
select_stmt = "SELECT", [ top_clause ], [ "DISTINCT" ], result_column, { ",", result_column }, [ from_clause ], [ where_clause ], [group_by_clause] ;
top_clause = ( "TOP" | "TOPN" ), "(", expr, ")" ;
result_column = expr, [ [ "AS" ], column_alias ]
| "*"
| identifier, ".", "*" ;
column_alias = identifier ;
from_clause = "FROM", table_or_subquery, { ",", table_or_subquery } ;
table_or_subquery =
( identifier | table_valued_function ), [ [ "AS" ], table_alias ], [ table_option ]
| "(", select_stmt, ")", [ [ "AS" ], table_alias ] ;
table_alias = identifier ;
table_option = "SHARDS", "(", integer_literal, { ",", integer_literal }, ")";
where_clause = "WHERE", expr ;
group_by_clause = "GROUP", "BY", expr, { ",", expr }, [ "HAVING", expr ] ;
(*
Expressions
----------------
*)
expr = integer_literal
| string_literal
| decimal_literal
| set_literal
| tuple_literal
| date_literal
| [ table_name, "." ], column_name
| unary_op, expr
| expr, binary_op, expr
| function_call
| "(", expr, ")"
| "CAST", "(", expr, "AS", type_name, ")"
| expr, [ "NOT" ], "LIKE", expr
| expr, "IS", [ "NOT" ], "NULL"
| expr, [ "NOT" ], "BETWEEN", expr, "AND", expr
| expr, [ "NOT" ], "IN", "(", ( select_stmt | expr, { ",", expr } ), ")"
| paren_select_stmt
| case_expr ;
paren_select_stmt = "(", select_stmt, ")" ;
case_expr = "CASE", [ expr ], { "WHEN", expr, "THEN", expr }, [ "ELSE", expr ], "END" ;
unary_op = "-"
| "+"
| "!" ;
binary_op = "="
| "!="
| "<="
| ">="
| "&"
| "|"
| "<<"
| ">>"
| "+"
| "-"
| "*"
| "/"
| "%"
| "||" ;
set_literal = "[", expr, { ",", expr }, "]" ;
tuple_literal = "{", expr, { ",", expr }, "}" ;
date_literal = rfc_3339
| "CURRENT_DATE"
| "CURRENT_TIMESTAMP" ;
table_name = identifier ;
column_name = identifier ;
function_call = agg_function
| non_agg_function
| table_valued_function ;
agg_function = ( "AVG" | "COUNT" | "MAX" | "MIN" | "SUM" ), "(", ( ( [ "DISTINCT" ], expr ) | "*" ), ")"
| "PERCENTILE", "(", expr, ",", expr, ")" ;
non_agg_function =
"SETCONTAINS" , "(", expr, ",", expr, ")"
| "SETCONTAINSALL" , "(", expr, ",", expr, ")"
| "SETCONTAINSANY" , "(", expr, ",", expr, ")"
| "DATEPART" , "(", expr, ",", expr, ")" ;
table_valued_function =
"SUBTABLE" , "(", table_name, ".", column_name, ")";
identifier = letter , { letter | digit | "_" } ;
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" | "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" ;
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;