PostgreSQL在何處處理 sql查詢之三十

2021-09-22 10:58:57 字數 2003 閱讀 7661

接前面,繼續分析:

portalstrategy

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;

}

對  if (isa(stmt, 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 struct

node

node;

typedef struct

list

list;

struct

listcell

data;

listcell *next;

};

可以說, list 的頭是乙個node,內有nodetag說明其為何種型別:

#define lfirst(lc)                 ((lc)->data.ptr_value)

#define linitial(l) lfirst(list_head(l))

static inline listcell *list_head(

const list *l)

stmt再被強制轉為 plannedstmt:

* ----------------

*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

if(isa(stmt, plannedstmt))}}

根據實際執行 select * from tst01 語句,可以得知返回 portal_one_select 型別。

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 ...