Packages
exosql
0.2.2
0.2.88
0.2.87
0.2.86
0.2.85
0.2.84
0.2.83
0.2.82
0.2.81
0.2.80
0.2.79
0.2.78
0.2.77
0.2.76
0.2.75
0.2.74
0.2.73
0.2.72
0.2.71
0.2.70
0.2.69
0.2.68
0.2.67
0.2.65
0.2.64
0.2.63
0.2.62
0.2.60
0.2.59
0.2.58
0.2.57
0.2.56
0.2.55
0.2.54
0.2.53
0.2.51
0.2.50
0.2.49
0.2.48
0.2.47
0.2.46
0.2.45
0.2.44
0.2.43
0.2.42
0.2.41
0.2.40
0.2.39
0.2.38
0.2.37
0.2.36
0.2.35
0.2.33
0.2.32
0.2.31
0.2.30
0.2.29
0.2.28
0.2.26
0.2.25
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.1
0.1.0
Universal SQL engine for Elixir. This library implements the SQL logic to perform queries on user provided databases using a simple interface based on Foreign Data Wrappers from PostgreSQL.
Current section
Files
Jump to
Current section
Files
src/sql_parser.yrl
Nonterminals
query
select
from table_list
where expr expr_list
column table groupby
join join_type.
Terminals
id comma dot lit int op open_par close_par
'SELECT' 'FROM' 'INNER' 'CROSS' 'JOIN' 'ON' 'WHERE' 'GROUP' 'BY'
.
Rootsymbol query.
query -> select from join where groupby: #{select => '$1', from => '$2', join => '$3', where => '$4', groupby => '$5'}.
select -> 'SELECT' expr_list : '$2'.
from -> 'FROM' table_list : '$2'.
table_list -> table : [{table, '$1'}].
table_list -> table comma table_list : [{table, '$1'}] ++ '$3'.
join -> '$empty' : [].
join -> join_type table 'ON' expr join : [{'$1', {{table, '$2'}, '$4'}}] ++ '$5'.
join_type -> 'JOIN' : inner_join.
join_type -> 'INNER' 'JOIN' : inner_join.
join_type -> 'CROSS' 'JOIN' : cross_join.
where -> '$empty' : nil.
where -> 'WHERE' expr : '$2'.
groupby -> '$empty' : nil.
groupby -> 'GROUP' 'BY' expr_list : '$3'.
expr_list -> expr : ['$1'].
expr_list -> expr comma expr_list: ['$1'] ++ '$3'.
expr -> column : {column, '$1'}.
expr -> lit : {lit, unwrap('$1')}.
expr -> open_par expr close_par : '$2'.
expr -> expr op expr: {op, {unwrap('$2'), '$1', '$3'}}.
expr -> id open_par expr_list close_par : {fn, {unwrap_d('$1'), '$3'}}.
expr -> id open_par op close_par: tag('$3', "*"), {fn, {unwrap_d('$1'), [{lit, "*"}]}}.
column -> id dot id dot id : {unwrap('$1'), unwrap('$3'), unwrap('$5')}.
column -> id dot id : {nil, unwrap('$1'), unwrap('$3')}.
column -> id : {nil, nil, unwrap('$1')}.
table -> id dot id : {unwrap('$1'), unwrap('$3')}.
table -> id : {nil, unwrap('$1')}.
select -> column comma select: [unwrap('$1')] ++ '$3'.
Erlang code.
unwrap_d({_,_,V}) -> 'Elixir.String':downcase('Elixir.List':to_string(V)).
unwrap({_,_,V}) -> 'Elixir.List':to_string(V).
tag(A, B) ->
A1 = unwrap(A),
%% io:format("DEBUG: ~p == ~p", [A1, B]),
A2 = 'Elixir.String':upcase(A1),
A2 = 'Elixir.List':to_string(B).