该项目为mysql sql解析器,词法分析和语法分析基于oceanbase 0.4版本,语法树解析和 sql语句优化分拆及最终生成执行计划为新写,目前执行计划已支持DML操作,另外支持SET/SHOW操作。
编译: STEP1:$ sh gen_parser.sh STEP2: $ make
执行: $ ./sql_parser
当select语句如下时,解析后的语法树:
$ ./sql_parser.exe
<<Part 1 : SQL STRING>>
SELECT id FROM pp UNION distinct SELECT id FROM tt
<<Part 2 : PARSE TREE>>
|-T_STMT_LIST
|-T_SELECT
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-T_SET_UNION
|-T_DISTINCT
|-T_SELECT
|-NULL
|-T_PROJECT_LIST
|-T_PROJECT_STRING
|-T_IDENT : id
|-T_FROM_LIST
|-T_IDENT : pp
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-T_SELECT
|-NULL
|-T_PROJECT_LIST
|-T_PROJECT_STRING
|-T_IDENT : id
|-T_FROM_LIST
|-T_IDENT : tt
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
|-NULL
=======================================
<<Part 2 : LOGICAL PLAN>>
<LogicalPlan>
<StmtList>
ObSelectStmt 0 Begin
LEFTQUERY ::= <2>
<UNION DISTINCT>
RIGHTQUERY ::= <3>
ObSelectStmt 0 End
ObSelectStmt 1 Begin
<TableItemList Begin>
{Num 0, TableId:2, TableName:pp, AliasName:NULL, Type:BASE_TABLE, RefId: 2}
<TableItemList End>
<ColumnItemList Begin>
{Num 0, ColumnId:2, ColumnName:id, TableRef:2}
<ColumnItemList End>
SELECT ::= <1, id>
FROM ::= <2>
ObSelectStmt 1 End
ObSelectStmt 2 Begin
<TableItemList Begin>
{Num 0, TableId:1, TableName:tt, AliasName:NULL, Type:BASE_TABLE, RefId: 1}
<TableItemList End>
<ColumnItemList Begin>
{Num 0, ColumnId:1, ColumnName:id, TableRef:1}
<ColumnItemList End>
SELECT ::= <2, id>
FROM ::= <1>
ObSelectStmt 2 End
</StmtList>
<ExprList>
<ObSqlRawExpr 0 Begin>
expr_id = 1
(table_id : column_id) = (NULL : 65519)
ObBinaryRefRawExpr
T_REF_COLUMN : [table_id, column_id] = [2, 2]
<ObSqlRawExpr 0 End>
<ObSqlRawExpr 1 Begin>
expr_id = 2
(table_id : column_id) = (NULL : 65518)
ObBinaryRefRawExpr
T_REF_COLUMN : [table_id, column_id] = [1, 1]
<ObSqlRawExpr 1 End>
</ExprList>
</LogicalPlan>
LEFTQUERY ::= <2>
<UNION DISTINCT>
RIGHTQUERY ::= <3>
STMT string: SELECT id FROM pp
STMT string: SELECT id FROM tt
生成的执行计划如下:
I0100 00:00:00.000000 11191 jd_exec_plan.cpp:531] RAW: new physical plan, addr=0xb5e8790
exec_plan_unit shard name: pp1
exec_plan_unit SQL name : SELECT id FROM pp1
exec_plan_unit shard name: pp2
exec_plan_unit SQL name : SELECT id FROM pp2
exec_plan_unit shard name: pp3
exec_plan_unit SQL name : SELECT id FROM pp3
exec_plan_unit shard name: pp4
exec_plan_unit SQL name : SELECT id FROM pp4
exec_plan_unit shard name: tt1
exec_plan_unit SQL name : SELECT id FROM tt1
exec_plan_unit shard name: tt2
exec_plan_unit SQL name : SELECT id FROM tt2
exec_plan_unit shard name: tt3
exec_plan_unit SQL name : SELECT id FROM tt3
exec_plan_unit shard name: tt4
exec_plan_unit SQL name : SELECT id FROM tt4
DATE : 2013.11.15
EMAIL: gqinbo@gmail.com