pgpool2.git / summary / log / commit / refs

commit    3c19aa92583f00271d3a19efeb0516fbbfd5e7f7
Author:   Yoshiharu Mori <y-mori at sraoss.co.jp>
Date:     Fri Jan 30 00:06:53 2009 +0000

    Add comment


pool_rewrite_query.c | 28 ++++++-- pool_rewrite_query.h | 180 +++++++++++++++++++++++++-------------------------- 2 files changed, 113 insertions(+), 95 deletions(-) diff --git a/pool_rewrite_query.c b/pool_rewrite_query.c index d1488ad2a..5abd43f14 100644 --- a/pool_rewrite_query.c +++ b/pool_rewrite_query.c @@ -38,6 +38,8 @@ static void initMessage(RewriteQuery *message); static void initdblink(ConInfoTodblink *dblink, POOL_CONNECTION_POOL *backend); static void analyze_debug(RewriteQuery *message); + +/* create error message */ char *pool_error_message(char *message) { String *str; @@ -47,6 +49,10 @@ char *pool_error_message(char *message) return str->data; } +/* + * search DistDefInfo(this info is build in starting process + * and get node id where a query send. + */ static int getInsertRule(ListCell *lc,List *list_t ,DistDefInfo *info,int div_key_num) { int loop_counter = 0; @@ -112,7 +118,8 @@ static int getInsertRule(ListCell *lc,List *list_t ,DistDefInfo *info,int div_ke } /* - * This function processes the decision whether to distribute the insert sentence to the node. + * This function processes the decision whether to + * distribute the insert sentence to the node. */ static void examInsertStmt(Node *node,POOL_CONNECTION_POOL *backend, RewriteQuery *message) { @@ -263,6 +270,7 @@ static void examInsertStmt(Node *node,POOL_CONNECTION_POOL *backend, RewriteQuer message->rewrite_query = nodeToString(node); } +/* start of rewriting query */ static void examSelectStmt(Node *node,POOL_CONNECTION_POOL *backend,RewriteQuery *message) { static ConInfoTodblink dblink; @@ -275,10 +283,11 @@ static void examSelectStmt(Node *node,POOL_CONNECTION_POOL *backend,RewriteQuery message->type = node->type; message->r_code = SELECT_DEFAULT; + /* do rewrite query */ nodeToRewriteString(message,&dblink,node); } - +/* initialize Message */ static void initMessage(RewriteQuery *message) { message->r_code = 0; @@ -298,6 +307,7 @@ static void initMessage(RewriteQuery *message) message->ret_num = 0; } +/* set dblink info */ static void initdblink(ConInfoTodblink *dblink,POOL_CONNECTION_POOL *backend) { dblink->dbname = MASTER_CONNECTION(backend)->sp->database; @@ -307,6 +317,7 @@ static void initdblink(ConInfoTodblink *dblink,POOL_CONNECTION_POOL *backend) dblink->password = MASTER_CONNECTION(backend)->con->password; } +/* reference of pg_catalog or not */ int IsSelectpgcatalog(Node *node,POOL_CONNECTION_POOL *backend) { static ConInfoTodblink dblink; @@ -333,6 +344,10 @@ int IsSelectpgcatalog(Node *node,POOL_CONNECTION_POOL *backend) } } +/* + * SELECT statement or INSERT statement is special, + * peculiar process is needed in parallel mode. + */ RewriteQuery *rewrite_query_stmt(Node *node,POOL_CONNECTION *frontend,POOL_CONNECTION_POOL *backend,RewriteQuery *message) { switch(node->type) @@ -341,9 +356,9 @@ RewriteQuery *rewrite_query_stmt(Node *node,POOL_CONNECTION *frontend,POOL_CONNE { SelectStmt *stmt = (SelectStmt *)node; - /* Because "SELECT INTO" cannot be used in a parallel mode, - * the error message is generated and send "ready for query" to frontend. - */ + /* Because "SELECT INTO" cannot be used in a parallel mode, + * the error message is generated and send "ready for query" to frontend. + */ if(stmt->intoClause) { pool_send_error_message(frontend, MAJOR(backend), "XX000", @@ -474,6 +489,8 @@ static int direct_parallel_query(RewriteQuery *message) return 0; } + +/* escape delimiter character */ static char *delimistr(char *str) { char *result; @@ -499,6 +516,7 @@ static char *delimistr(char *str) return result; } +/* for debug */ void analyze_debug(RewriteQuery *message) { int analyze_num,i; diff --git a/pool_rewrite_query.h b/pool_rewrite_query.h index 09f103ea8..2ab76d258 100644 --- a/pool_rewrite_query.h +++ b/pool_rewrite_query.h @@ -30,7 +30,7 @@ #include "parser/pool_string.h" /* return code set */ -#define INSERT_SQL_RESTRICTION 1 +#define INSERT_SQL_RESTRICTION 1 #define SELECT_INIT 2 #define SELECT_BACKEND_CONNECT 3 #define SELECT_NOT_BACKEND_CONNECT 4 @@ -51,46 +51,46 @@ #define SELECT_ANALYZE 19 #define SELECT_DEFAULT_PREP 20 -/* build TARGET-LIST */ +/* build Sub-Select`s target List */ typedef struct { - char **col_list; /* column list */ - char **type_list; /* type list */ - int *return_list; - int col_num; - bool valid; -}SelectDefInfo; + char **col_list; /* column list */ + char **type_list; /* type list */ + int *return_list; /* order of col_list */ + int col_num; /* column number */ + bool valid; /* return to frontend */ +} SelectDefInfo; -/* This struct is used as TARGET-LIST of Sub-Select */ +/* This struct is used as each table/sub-select of FROM-CLUASE */ typedef struct { - DistDefInfo *distinfo; - RepliDefInfo *repliinfo; - SelectDefInfo *selectinfo; - char *alias; - char state; - int ret_num; + DistDefInfo *distinfo; /* distribution table into */ + RepliDefInfo *repliinfo; /* replication table info */ + SelectDefInfo *selectinfo; /* Sub-Select info */ + char *alias; /* alias name */ + char state; /* P = parallel, L = loadbarance S = systemdb(dblink) E = error*/ + int ret_num; /* build column number */ } RangeInfo; /* build Virtual Table of FROM-Cluase */ typedef struct { - char **col_list; /* column list */ - char **type_list; /* type list */ - char **table_list; /* table list */ - char *state_list; - int *column_no; - int *valid; - int col_num; + char **col_list; /* column list */ + char **type_list; /* type list */ + char **table_list; /* table list */ + char *state_list; /* state of each column */ + int *column_no; /* order of column */ + int *valid; /* valid column is true */ + int col_num; /* virtual table column num */ } VirtualTable; /* this struct is used by JOIN Expr */ typedef struct { - char **col_list; /* column list */ - char **type_list; /* type list */ - char **table_list; /* table list */ - char state; - int *valid; - int col_num; - char **using_list; - int using_length; + char **col_list; /* column list */ + char **type_list; /* type list */ + char **table_list; /* table list */ + char state; /* P = parallel, L = loadbarance S = systemdb(dblink) E = error*/ + int *valid; /* valid column is true */ + int col_num; /* number of colum */ + char **using_list; /* if join expr has using-list, column name is listed up */ + int using_length; /* column number of using-list */ } JoinTable; /* this struct is used in optimization of aggregate opr */ @@ -99,78 +99,79 @@ typedef struct { FuncCall **tfunc_p; /* targetlist funcs */ ColumnRef **col_p; /* group by columns */ FuncCall **hfunc_p; /* having funcs */ - int *umapc; - int u_num; /* targetlist columns num */ - int t_num; /* targetlist funcs num */ - int c_num; /* group by column num */ - int h_num; /* having funcs num */ - int hc_num;/* having column num */ - int s_num; /* sort funcs num */ - int sc_num; /* sort column num */ - bool opt; + int *umapc; /* order of number */ + int u_num; /* targetlist columns num */ + int t_num; /* targetlist funcs num */ + int c_num; /* group by column num */ + int h_num; /* having funcs num */ + int hc_num; /* having column num */ + int s_num; /* sort funcs num */ + int sc_num; /* sort column num */ + bool opt; /* optimization flag */ } Aggexpr; /* main struct of alanyzing query */ typedef struct { - int now_select; - int part; - int last_select; - int call_part; - int from_num; - int larg_count; - int rarg_count; - int ret_count; - char state; - char *table_name; - char partstate[8]; - bool select_union; - bool select_range; - bool aggregate; - bool retlock; - Aggexpr *aggexpr; - RangeInfo **range; - int rangeinfo_num; - VirtualTable *virtual; - JoinTable *join; - SelectDefInfo *select_ret; + int now_select; /* rank of select */ + int part; /* the postion of analyzing select statement */ + int last_select; /* caller select rank */ + int call_part; /* caller's potion */ + int from_num; /* number for from-cluase */ + int larg_count; /* left arg count */ + int rarg_count; /* right arg count */ + int ret_count; /* return list count */ + char state; /* final state */ + char *table_name; /* table name or virtual table name */ + char partstate[8]; /* state of analyzing part */ + bool select_union; /* if UNION is used, this flag is true */ + bool select_range; /* RangeSubSelect is used */ + bool aggregate; /* aggregate optimaztion ? */ + bool retlock; /* this is used */ + Aggexpr *aggexpr; /* Aggexpr in this statement*/ + RangeInfo **range; /* RangeInfo in from cluase */ + int rangeinfo_num; /* RangeInfo's number in this select statement*/ + VirtualTable *virtual; /* Virtual Table in this select statment */ + JoinTable *join; /* sumary of join table */ + SelectDefInfo *select_ret; /* build return list */ } AnalyzeSelect; -/* This struct is used as Information that relates +/* + * This struct is used as Information that relates * to distribution processing of parallel query */ typedef struct { - int r_code; - int r_node; - int part; - int rewritelock; - int analyze_num; - int current_select; - int ignore_rewrite; - int column; - int virtual_num; - int ret_num; - bool is_pg_catalog; - bool is_loadbalance; - bool is_parallel; - bool fromClause; - char *table_relname; - char *table_alias; - char *schemaname; - char *dbname; - char *rewrite_query; - char table_state; - POOL_STATUS status; - NodeTag type; - AnalyzeSelect **analyze; + int r_code; /* analyze or rewrite */ + int r_node; /* which node, query is sent */ + int part; /* part of select statment */ + int rewritelock; /* dblink start postion and lock rewrite */ + int analyze_num; /* sum of AnalyzeSelect */ + int current_select; /* postion of analyze[] */ + int ignore_rewrite; /* dont rewrite */ + int column; /* column number */ + int virtual_num; /* Virtual table column number */ + int ret_num; /* expect return cloumn number */ + bool is_pg_catalog; /* reference of pg_catalog */ + bool is_loadbalance; /* load ballance ? */ + bool is_parallel; /* can paralle exec ? */ + bool fromClause; /* having FromCluase ? */ + char *table_relname; /* table name */ + char *table_alias; /* table alias name */ + char *schemaname; /* schema */ + char *dbname; /* connect dbname */ + char *rewrite_query; /* execute query */ + char table_state; /* final state */ + POOL_STATUS status; /* return POOL_STATUS */ + NodeTag type; /* Query Type */ + AnalyzeSelect **analyze; /* point to analyzing result */ } RewriteQuery; /* This info is used in dblink */ typedef struct { - char *hostaddr; - char *dbname; - char *user; - int port; - char *password; + char *hostaddr; /* hostname */ + char *dbname; /* data base name */ + char *user; /* access user name */ + int port; /* access port number */ + char *password; /* passward of connection */ } ConInfoTodblink; extern RewriteQuery *rewrite_query_stmt(Node *node, POOL_CONNECTION *frontend,POOL_CONNECTION_POOL *backend,RewriteQuery *message); @@ -178,6 +179,5 @@ extern void nodeToRewriteString(RewriteQuery *message, ConInfoTodblink *dblink,v char *pool_error_message(char *message); extern int IsSelectpgcatalog(Node *node,POOL_CONNECTION_POOL *backend); extern RewriteQuery *is_parallel_query(Node *node,POOL_CONNECTION_POOL *backend); - extern POOL_STATUS pool_parallel_exec(POOL_CONNECTION *frontend,POOL_CONNECTION_POOL *backend, char *string,Node *node,bool send_to_frontend); [parent: 5ceb5dcf1fc2]