SQLite Forum

Lemon SQL output omition
Login

Lemon SQL output omition

(1) By Domingo (mingodad) on 2021-07-03 16:53:54 [link] [source]

Looking at using the sql output of lemon to generate the railroad diagram from the parser I noticed that lemon is omitting info from the rhs side of rules that have '|' like this rule from sqlite3/src/parse.y:

====
cmd ::= COMMIT|END(X) trans_opt. 
====

The lemon SQL output:
====
INSERT INTO rule(ruleid,lhs,txt)VALUES(8,189,'cmd ::= COMMIT|END trans_opt');
INSERT INTO rulerhs(ruleid,pos,sym)VALUES(8,0,10);
-- here somehow the '|' should be present
INSERT INTO rulerhs(ruleid,pos,sym)VALUES(8,0,11);
INSERT INTO rulerhs(ruleid,pos,sym)VALUES(8,1,191);
====

I noticed it when trying this query over the lemon SQL output for sqlite3/src/parse.y:

====
select name || ' ::= ' || group_concat(rhs, '
	|')
from (
	select id, name, group_concat(ifnull(rhs_name, '/* empty */'), ' ') as rhs
	from (
		select symbol.id, symbol.name, rule.ruleid, rulerhs.pos, rulerhs.sym, s2.name as rhs_name
		from symbol
			left join rule on symbol.id=rule.lhs
			left join rulerhs on rule.ruleid=rulerhs.ruleid
			left join symbol as s2 on rulerhs.sym=s2.id
		where symbol.isTerminal=0
		order by symbol.id, rule.ruleid, rulerhs.pos
	) as tbl
	group by id, ruleid
) as tbl2
group by id
====

Partial query output:
====
input ::= cmdlist
cmdlist ::= cmdlist ecmd
	|ecmd
ecmd ::= SEMI
	|cmdx SEMI
	|explain cmdx SEMI
cmdx ::= cmd
explain ::= EXPLAIN
	|EXPLAIN QUERY PLAN
cmd ::= BEGIN transtype trans_opt
	|COMMIT END trans_opt //!! here the '|' is missing
	|ROLLBACK trans_opt
	|SAVEPOINT nm
====

(2.1) By Domingo (mingodad) on 2021-07-03 18:28:40 edited from 2.0 in reply to 1 [source]

Meanwhile this alternative query seems to do the job:

====
select name || ' ::=' || group_concat(
	case when hasOr == 1 then ' (' || trim(rtxt) || ')'
	else
		case when length(rtxt) == 0 then ' /* empty */' else rtxt end
	end, '
	|')
from (
	select lhs, name, substr(txt, instr(txt, tbl.sep) + length(tbl.sep)) rtxt, (instr(txt, '|') > 0) hasOr
	from rule left join symbol on lhs=id, (select '::=' as sep) tbl
) as t
group by lhs;
====

Partial output:
====
input ::= cmdlist
cmdlist ::= cmdlist ecmd
	| ecmd
ecmd ::= SEMI
	| cmdx SEMI
	| explain cmdx SEMI
cmdx ::= cmd
explain ::= EXPLAIN
	| EXPLAIN QUERY PLAN
cmd ::= BEGIN transtype trans_opt
	| (COMMIT|END trans_opt)
	| ROLLBACK trans_opt
	| SAVEPOINT nm
====