zoukankan      html  css  js  c++  java
  • PostgreSQL 的 语法分析的理解(二)

    对于PostgreSQL的语法分析,修改其 gram.y后,

    opt_distinct:                                
                DISTINCT        { $$ = list_make1(NIL); }        
                | DISTINCT ON '(' expr_list ')'    { $$ = $4; }        
                | ALL            { $$ = NIL; }        
                | /*EMPTY*/      { $$ = NIL; }
    simple_select:                                        
                SELECT    opt_distinct    target_list                            
                into_clause     from_clause     where_clause 
                group_clause     having_clause    window_clause 
                    {                        
                        SelectStmt *n = makeNode(SelectStmt);                    
                        n->distinctClause = $2;                    
                        n->targetList = $3;                    
                        n->intoClause = $4;                    
                        n->fromClause = $5;                    
                        n->whereClause = $6;                    
                        n->groupClause = $7;                    
                        n->havingClause = $8;                    
                        n->windowClause = $9;                    
                        $$ = (Node *)n;                    
                    }                        
                | values_clause   { $$ = $1; }
                | TABLE relation_expr                            
                    {                        
                        /* same as SELECT * FROM relation_expr */                    
                        ColumnRef *cr = makeNode(ColumnRef);                    
                        ResTarget *rt = makeNode(ResTarget);                    
                        SelectStmt *n = makeNode(SelectStmt);                    
                                            
                        cr->fields = list_make1(makeNode(A_Star));                    
                        cr->location = -1;                    
                                            
                        rt->name = NULL;                    
                        rt->indirection = NIL;                    
                        rt->val = (Node *)cr;                    
                        rt->location = -1;                    
                                            
                        n->targetList = list_make1(rt);                    
                        n->fromClause = list_make1($2);                    
                        $$ = (Node *)n;                    
                    }                        
                | select_clause UNION opt_all select_clause                            
                    {                        
                        $$ = makeSetOp(SETOP_UNION, $3, $1, $4);                    
                    }                        
                | select_clause INTERSECT opt_all select_clause 
                    {                        
                        $$ = makeSetOp(SETOP_INTERSECT, $3, $1, $4);                    
                    }                        
                | select_clause EXCEPT opt_all select_clause   
                    {                        
                        $$ = makeSetOp(SETOP_EXCEPT, $3, $1, $4);                    
                    }                        
            ;                             

    -->


    opt_distinct: DISTINCT { $$
    = list_make1(NIL);
    fprintf(stderr,"In opt_distinct\n");
    }
    | DISTINCT ON '(' expr_list ')' { $$ = $4; } | ALL { $$ = NIL; } | /*EMPTY*/ { $$ = NIL; }

    -->


    simple_select: SELECT opt_distinct target_list into_clause from_clause where_clause group_clause having_clause window_clause { SelectStmt
    *n = makeNode(SelectStmt); n->distinctClause = $2; n->targetList = $3; n->intoClause = $4; n->fromClause = $5; n->whereClause = $6; n->groupClause = $7; n->havingClause = $8; n->windowClause = $9; $$ = (Node *)n;
    fprintf(stderr,"In simple select\n“); }
    | values_clause { $$ = $1; } | TABLE relation_expr { /* same as SELECT * FROM relation_expr */ ColumnRef *cr = makeNode(ColumnRef); ResTarget *rt = makeNode(ResTarget); SelectStmt *n = makeNode(SelectStmt); cr->fields = list_make1(makeNode(A_Star)); cr->location = -1; rt->name = NULL; rt->indirection = NIL; rt->val = (Node *)cr; rt->location = -1; n->targetList = list_make1(rt); n->fromClause = list_make1($2); $$ = (Node *)n; } | select_clause UNION opt_all select_clause { $$ = makeSetOp(SETOP_UNION, $3, $1, $4); } | select_clause INTERSECT opt_all select_clause { $$ = makeSetOp(SETOP_INTERSECT, $3, $1, $4); } | select_clause EXCEPT opt_all select_clause { $$ = makeSetOp(SETOP_EXCEPT, $3, $1, $4); } ;

     在psql执行查询:select  distinct id from a6;

    在后台会显示:

    In opt_distinct  

    In simple select

  • 相关阅读:
    第11条:用zip函数同时遍历两个迭代器
    第10条:尽量用enumerate取代range
    第9条:用生成器表达式来改写数据量较大的列表推导式
    MySQL的约束
    VMware下所有的系统网卡启动不起来
    windows下的mysql闪退问题
    大型网站架构模式
    MySQL的information_schema库
    mysql复制表结构和内容
    希尔排序 堆排序 归并排序
  • 原文地址:https://www.cnblogs.com/gaojian/p/2671715.html
Copyright © 2011-2022 走看看