摘要:
上文说到 ColumnRef由于 a_expr 回溯到 c_expr。其对应的 makeColumnRef 需要构建 ColumnRef 型Node, 看看 parsenodes.h:00203 typedef struct ColumnRef00204 {00205 NodeTag type;00206 List *fields; /* field names (Value strings) or A_Star */00207 int location; /* token location, or -1 ... 阅读全文
摘要:
根据 <PostgreSQL 数据库内核分析>200和201页的说法,ResTarget 应该指向 ColumnRef 。这是如何实现的呢?target_list: target_el { $$ = list_make1($1); } | target_list ',' target_el { $$ = lappend($1, $3); } ; ... 阅读全文
摘要:
struct ListCellstruct ListCell{ union { void *ptr_value; int int_value; Oid oid_value; } data; ListCell *next;}由于在 target_list 相关部分,其 ptr_value 指向 ResTargettypedef struct ResTarget{ NodeTag type; char *name; List *indi... 阅读全文
摘要:
simple_select: SELECT ... target_list... { ... n->targetList =$3; ... }修改为:simple_select: SELECT ... target_list... { ... n->targetList =$3; ... if ( n->targetList->head->data.ptr_value == NULL) fprintf(stderr,"ptr_value is NU... 阅读全文
摘要:
从网上查到资料,以作为备忘。当结构体是一个指针时要引用结构体的成员就用-> 而如果不是指针就用. 如:struct msg_st { int a;};struct msg_st msg;struct msg_st *ms;msg.a = 10;ms->a = 20; 阅读全文
摘要:
在gram.y 中, 有如下一段:target_el: a_expr AS ColLabel{ $$=makeNode(Restarget); $$->name =$3; $$->indirection=NIL; ...}...那么,makeNode到底是什么呢?nodes.h 里有这样的宏:#define makeNode(_type_) ((_type_ *) newNode(sizeof(_type_),T_##_type_)) 阅读全文
摘要:
前面我们说过了 listmake1其实是特殊的 lcons,而lcons 函数位于 list.c 中。00259 lcons(void *datum, List *list)00260 {00261 Assert(IsPointerList(list));00262 00263 if (list == NIL)00264 list = new_list(T_List);00265 else00266 new_head_cell(list);00267 00268 lfirst(list->head) = datum;00269 ... 阅读全文
摘要:
看 gram.y 中的 target_list 的定义:target_list: target_el { $$ = list_make1($1); } | target_list ',' target_el { $$ = lappend($1, $3); } ; 而list_make1 到底是什么呢?#define lis... 阅读全文
摘要:
首先看 lappend00128 lappend(List *list, void *datum)00129 {00130 Assert(IsPointerList(list));00131 00132 if (list == NIL)00133 list = new_list(T_List);00134 else00135 new_tail_cell(list);00136 00137 lfirst(list->tail) = datum;00138 check_list_invariants(list);00139 ... 阅读全文
摘要:
最近在学习 PostgreSQL 的语法分析。看到 lappend函数,其中有一句:lappend(List *list, void *datum) { …… lfirst(list->tail) = datum; ……} lfirst 到底是什么,好神秘,函数的返回值被赋值?看到 pg_list.h,才明白:#define lfirst(lc) ((lc)->data.ptr_value)原来如此。 但是令我不解的是, 这么做的目的是什么? 是一种优雅的表达?会不会引起误解? 阅读全文