mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 10:54:59 +00:00
* 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
268 lines
5.8 KiB
EBNF
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" ;
|
|
|
|
|