Postgresql源码(96)操作符的语法解析细节
单字符Operators
1 加法
select 1+2;
3
解析过程
steps | lex | yacc规则左值 | yacc规则右值 | gram.y规则代码 |
---|---|---|---|---|
1 | SELECT 623 | |||
2 | ICONST 266 | |||
3 | Iconst | ICONST | $$ = $1; | |
4 | AexprConst | Iconst | $$ = makeIntConst($1, @1) | |
5 | c_expr | AexprConst | $$ = $1; | |
6 | a_expr | c_expr | $$ = $1; | |
7 | + 43 | |||
8 | ICONST 266 | |||
9 | Iconst | ICONST | $$ = $1; | |
10 | AexprConst | Iconst | $$ = makeIntConst($1, @1) | |
11 | c_expr | AexprConst | $$ = $1; | |
12 | a_expr | c_expr | $$ = $1; | |
13 | ; 59 | |||
14 | a_expr | a_expr ‘+’ a_expr | $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, “+”, $1, $3, @2); | |
15 | target_el | a_expr | $$ = makeNode(ResTarget); … | |
16 | target_list | target_el | $$ = list_make1($1) |
2 绝对值
select @ -5.0;
5
解析过程
steps | lex | yacc规则左值 | yacc规则右值 | gram.y规则代码 |
---|---|---|---|---|
1 | SELECT 623 | |||
2 | Op 265 | |||
3 | qual_Op | Op | $$ = list_make1(makeString($1)) | |
4 | - 45 | |||
5 | FCONST 260 | |||
6 | AexprConst | FCONST | $$ = makeFloatConst($1, @1) | |
7 | c_expr | AexprConst | $$ = $1 | |
8 | a_expr | c_expr | $$ = $1 | |
9 | ; 59 | |||
10 | a_expr | ‘-’ a_expr | $$ = doNegate($2, @1); | |
11 | a_expr | qual_Op a_expr | $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2, @1) | |
12 | target_el | a_expr | $$ = makeNode(ResTarget) | |
13 | target_list | target_el | $$ = list_make1($1) |
token来源
token | lex规则 | lex规则代码 |
---|---|---|
SELECT | {identifier}←{ident_start}{ident_cont}*←[A-Za-z\200-\377_]←[A-Za-z\200-\377_0-9$] | {…return yyextra->keyword_tokens[kwnum];} |
Op | {operator}←{op_chars}←[~!@#^&|`?+-*/%<>=] | {…return Op;} |
FCONST | {numeric}←`(({decinteger}.{decinteger}?) | (.{decinteger}))`←decinteger |
3 取反
select -(-5.0);
5
解析过程
steps | lex | yacc规则左值 | yacc规则右值 | gram.y规则代码 |
---|---|---|---|---|
1 | SELECT 623 | |||
2 | - 45 | |||
3 | ( 40 | |||
4 | - 45 | |||
5 | FCONST 260 | |||
6 | AexprConst | FCONST | $$ = makeFloatConst($1, @1) | |
7 | c_expr | AexprConst | $$ = $1 | |
8 | a_expr | c_expr | $$ = $1 | |
9 | ) 41 | |||
10 | a_expr | ‘-’ a_expr | $$ = doNegate($2, @1) | |
11 | opt_indirection | EMPTY | ||
12 | ; 59 | |||
13 | c_expr | ‘(’ a_expr ‘)’ opt_indirection | $$ = $2 | |
14 | a_expr | c_expr | $$ = $1 | |
15 | a_expr | ‘-’ a_expr | $$ = doNegate($2, @1) | |
16 | target_el | a_expr | $$ = makeNode(ResTarget) | |
17 | target_list | target_el | $$ = list_make1($1) |
多字符Operators
1 位运算
可以不加空格
select 1<<2;
select 1<< 2;
select 1 <<2;
4
解析过程(PG16)
steps | lex | yacc规则左值 | yacc规则右值 | gram.y规则代码 |
---|---|---|---|---|
1 | SELECT 623 | |||
2 | ICONST 266 | |||
3 | Iconst | ICONST | $$ = $1 | |
4 | AexprConst | Iconst | $$ = makeIntConst($1, @1) | |
5 | c_expr | AexprConst | $$ = $1 | |
6 | a_expr | c_expr | $$ = $1 | |
7 | Op 265 | |||
8 | ICONST 266 | |||
9 | qual_Op | Op | $$ = list_make1(makeString($1)) | |
10 | Iconst | ICONST | $$ = $1 | |
11 | AexprConst | Iconst | $$ = makeIntConst($1, @1) | |
12 | c_expr | AexprConst | $$ = $1 | |
13 | a_expr | c_expr | $$ = $1 | |
14 | ; 59 | |||
15 | a_expr | a_expr qual_Op a_expr | $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3, @2) | |
16 | target_el | a_expr | $$ = makeNode(ResTarget) | |
17 | target_list | target_el | $$ = list_make1($1) |
token来源(PG16)
token | lex规则 | lex规则代码 |
---|---|---|
SELECT | {identifier}←{ident_start}{ident_cont}*←[A-Za-z\200-\377_]←[A-Za-z\200-\377_0-9$] | {…return yyextra->keyword_tokens[kwnum];} |
Op | {operator}←{op_chars}←[~!@#^&|`?+-*/%<>=] | {…return Op;} |
2 逻辑
空格不能少
select true and false;
f
解析过程
steps | lex | yacc规则左值 | yacc规则右值 | gram.y规则代码 |
---|---|---|---|---|
1 | SELECT 623 | |||
2 | TRUE_P 679 | |||
3 | AexprConst | TRUE_P | $$ = makeBoolAConst(true, @1) | |
4 | c_expr | AexprConst | $$ = $1 | |
5 | a_expr | c_expr | $$ = $1 | |
6 | AND 289 | |||
7 | FALSE_P 414 | |||
8 | AexprConst | FALSE_P | $$ = makeBoolAConst(false, @1) | |
9 | c_expr | AexprConst | $$ = $1 | |
10 | a_expr | c_expr | $$ = $1 | |
11 | ; 59 | |||
12 | a_expr | a_expr AND a_expr | $$ = makeAndExpr($1, $3, @2) | |
13 | target_el | a_expr | $$ = makeNode(ResTarget) | |
14 | target_list | target_el | $$ = list_make1($1) |
token来源
token | lex规则 | lex规则代码 |
---|---|---|
SELECT | {identifier}←{ident_start}{ident_cont}*←[A-Za-z\200-\377_]←[A-Za-z\200-\377_0-9$] | {…return yyextra->keyword_tokens[kwnum];} |
TRUE_P | {identifier}←{ident_start}{ident_cont}*←[A-Za-z\200-\377_]←[A-Za-z\200-\377_0-9$] | {…return yyextra->keyword_tokens[kwnum];} |
AND | {identifier}←{ident_start}{ident_cont}*←[A-Za-z\200-\377_]←[A-Za-z\200-\377_0-9$] | {…return yyextra->keyword_tokens[kwnum];} |
FALSE_P | {identifier}←{ident_start}{ident_cont}*←[A-Za-z\200-\377_]←[A-Za-z\200-\377_0-9$] | {…return yyextra->keyword_tokens[kwnum];} |
3 大于等于
解析过程
steps | lex | yacc规则左值 | yacc规则右值 | gram.y规则代码 |
---|---|---|---|---|
1 | SELECT 623 | |||
2 | ICONST 266 | |||
3 | Iconst | ICONST | $$ = $1 | |
4 | AexprConst | Iconst | $$ = makeIntConst($1, @1) | |
5 | c_expr | AexprConst | $$ = $1 | |
6 | a_expr | c_expr | $$ = $1 | |
7 | GREATER_EQUALS 273 | |||
8 | ICONST 266 | |||
9 | Iconst | ICONST | $$ = $1 | |
10 | AexprConst | Iconst | $$ = makeIntConst($1, @1) | |
11 | c_expr | AexprConst | $$ = $1 | |
12 | a_expr | c_expr | $$ = $1 | |
13 | ; 59 | |||
14 | a_expr | a_expr GREATER_EQUALS a_expr | $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, “>=”, $1, $3, @2) | |
15 | target_el | a_expr | $$ = makeNode(ResTarget) | |
16 | target_list | target_el | $$ = list_make1($1) |
token来源
token | lex规则 | lex规则代码 |
---|---|---|
SELECT | {identifier}←{ident_start}{ident_cont}*←[A-Za-z\200-\377_]←[A-Za-z\200-\377_0-9$] | {…return yyextra->keyword_tokens[kwnum];} |
GREATER_EQUALS | {greater_equals}←greater_equals “>=” | {return GREATER_EQUALS;} |
相关文章
- Postgresql源码(80)plpgsql中异常处理编译与执行流程分析(sqlstate)
- PostgreSQL数据库导入大量数据时如何优化
- Postgresql源码(88)column definition list语义解析流程分析
- Postgresql实验系列(3)最简脏读插件
- Postgresql源码(95)优化器关键数据结构实例
- PostgreSQL 数据库基础 之 存储过程循环调用方式
- Abp.NHibernate连接PostgreSQl数据库的方法
- PostgreSQL 42P18: indeterminate_datatype 报错 故障修复 远程处理
- PostgreSQL 42725: ambiguous_function 报错 故障修复 远程处理
- pg_ctl — 启动、停止、重启 PostgreSQL详解数据库
- 优势PostgreSQL归档:优势及其应用(postgresql归档)
- 连接 PostgreSQL: 实现高效数据管理的关键技巧(连接postgresql)
- PostgreSQL.conf配置文件详解(postgresql.conf)
- 深入解析PostgreSQL扩展:优化数据库性能与拓展功能(postgresql扩展)
- PostgreSQL 语法简单易懂的使用方法(postgresql语法)
- 深入理解PostgreSQL背后的原理(postgresql原理)
- 深入探索PostgreSQL开发技术(postgresql开发)