接前面,繼續分析:
portalstrategy對 if (isa(stmt, query)) 進行分析:chooseportalstrategy(list *stmts)
else
if(isa(stmt, plannedstmt))
else
}/** portal_one_returning has to allow auxiliary queries added by rewrite.
* choose portal_one_returning if there is exactly one cansettag query and
* it has a returning list.
*/nsettag = 0
;
foreach
(lc, stmts)
if (nsettag == 1
)
return
portal_one_returning;
/*else, it's the general case...
*/return
portal_multi_query;
}
#define isa(nodeptr,_type_) (nodetag(nodeptr) == t_##_type_)
#define nodetag(nodeptr) (((const node*)(nodeptr))->type)從上面看到,就是 獲得計畫樹的head, 把它轉為 node型別指標。
然後看看它的 type是否是 t_query
經過實際測試,滿足條件的是: else if (isa(stmt, plannedstmt)),
也就是說 node指標所指向node結構的 type是 t_plannedstmt。
typedef structnode
node;
typedef struct可以說, list 的頭是乙個node,內有nodetag說明其為何種型別:list
list;
struct
listcell
data;
listcell *next;
};
#define lfirst(lc) ((lc)->data.ptr_value)stmt再被強制轉為 plannedstmt:#define linitial(l) lfirst(list_head(l))
static inline listcell *list_head(
const list *l)
* ----------------由此,再來重點看*plannedstmt node
* * the output of the planner is
a plan tree headed by a plannedstmt node.
* plannedstmt holds the "
one time
"information needed by the executor.
* ----------------
*/typedef
struct
plannedstmt
plannedstmt;
else
if(isa(stmt, plannedstmt)) 判斷分支:
else根據實際執行 select * from tst01 語句,可以得知返回 portal_one_select 型別。if(isa(stmt, plannedstmt))}}
PostgreSQL在何處處理 sql查詢之二十九
接前面,繼續分析 chooseportalstrategy chooseportalstrategy select portal execution strategy given the intended statement list.the list elements can be querys,...
PostgreSQL在何處處理 sql查詢之三十一
回到上乙個層面,繼續看 portalstart的處理 void portalstart portal portal,paramlistinfo params int eflags,bool use active snapshot pg catch pg end try 由之前的分析可以知道,滿足 c...
PostgreSQL在何處處理 sql查詢
如果我開乙個psql視窗,來輸入sql文,它在資料庫的何處被解析?在何處被 真正 處理?postgres.c 的 int postgresmain int argc,char ar const char username 函式中,在 postgresmain 的 for 迴圈中,呼叫 static ...