PostgreSQL 的 语法分析的理解(五)

接上文,从 simple_select 中的 target_list ,再看target_list部分的内容:

复制代码
/*****************************************************************************                                    
 *                                    
 *    target list for SELECT                                
 *                                    
 *****************************************************************************/                                    
                                    
target_list:                                    
            target_el                { $$ = list_make1($1); }        
            | target_list ',' target_el                { $$ = lappend($1, $3); }        
        ;                            
                                    
target_el:    a_expr AS ColLabel                                
                {                    
                    $$ = makeNode(ResTarget);                
                    $$->name = $3;                
                    $$->indirection = NIL;                
                    $$->val = (Node *)$1;                
                    $$->location = @1;                
                }                    
            /*                        
             * We support omitting AS only for column labels that aren't 
             * any known keyword.  There is an ambiguity against postfix 
             * operators: is "a ! b" an infix expression, or a postfix  
             * expression and a column label?  We prefer to resolve this 
             * as an infix expression, which we accomplish by assigning 
             * IDENT a precedence higher than POSTFIXOP.                        
             */                        
            | a_expr IDENT                        
                {                    
                    $$ = makeNode(ResTarget);                
                    $$->name = $2;                
                    $$->indirection = NIL;                
                    $$->val = (Node *)$1;                
                    $$->location = @1;                
                }                    
            | a_expr                        
                {                    
                    $$ = makeNode(ResTarget);                
                    $$->name = NULL;                
                    $$->indirection = NIL;                
                    $$->val = (Node *)$1;                
                    $$->location = @1;                
                }                    
            | '*'                        
                {                    
                    ColumnRef *n = makeNode(ColumnRef);                
                    n->fields = list_make1(makeNode(A_Star));                
                    n->location = @1;                
                                    
                    $$ = makeNode(ResTarget);                
                    $$->name = NULL;                
                    $$->indirection = NIL;                
                    $$->val = (Node *)n;                
                    $$->location = @1;                
                }                    
        ;                            
复制代码
从上面可以看出:

target_list 是一个递归表达式:

target_list:  target_el

                 | target_list  ','  target_el

而具体 target_el又分为以下几种:

         a_expr AS ColLabel

         a_expr  INDENT

         a_expr

         '*'

这个 target_list 就是指我们平时 select col1,col2,col3 ... from table 中的各个列的组合。

         

本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/09/05/2671925.html,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值