*** C:\pgdev\pgsql\src\backend\catalog\pg_proc.c.orig 2007-09-03 02:39:14.000000000 +0200 --- C:\pgdev\pgsql\src\backend\catalog\pg_proc.c 2007-11-02 12:43:52.551746600 +0100 *************** *** 533,538 **** --- 533,543 ---- ErrorContextCallback sqlerrcontext; bool haspolyarg; int i; + int numargs; + Oid *argtypes; + char **argnames; + char *argmodes; + tuple = SearchSysCache(PROCOID, ObjectIdGetDatum(funcoid), *************** *** 597,605 **** */ if (!haspolyarg) { querytree_list = pg_parse_and_rewrite(prosrc, proc->proargtypes.values, ! proc->pronargs); (void) check_sql_fn_retval(funcoid, proc->prorettype, querytree_list, NULL); } --- 602,614 ---- */ if (!haspolyarg) { + numargs = get_func_arg_info(tuple, + &argtypes, &argnames, &argmodes); + querytree_list = pg_parse_and_rewrite(prosrc, proc->proargtypes.values, ! proc->pronargs, ! argnames); (void) check_sql_fn_retval(funcoid, proc->prorettype, querytree_list, NULL); } *** C:\pgdev\pgsql\src\backend\commands\copy.c.orig 2007-09-12 22:49:27.000000000 +0200 --- C:\pgdev\pgsql\src\backend\commands\copy.c 2007-11-02 12:51:17.566244800 +0100 *************** *** 1006,1013 **** * function and is executed repeatedly. (See also the same hack in * DECLARE CURSOR and PREPARE.) XXX FIXME someday. */ rewritten = pg_analyze_and_rewrite((Node *) copyObject(stmt->query), ! queryString, NULL, 0); /* We don't expect more or less than one result query */ if (list_length(rewritten) != 1) --- 1006,1014 ---- * function and is executed repeatedly. (See also the same hack in * DECLARE CURSOR and PREPARE.) XXX FIXME someday. */ + //TODO: Check here rewritten = pg_analyze_and_rewrite((Node *) copyObject(stmt->query), ! queryString, NULL, 0,NULL); /* We don't expect more or less than one result query */ if (list_length(rewritten) != 1) *** C:\pgdev\pgsql\src\backend\commands\explain.c.orig 2007-08-15 23:39:50.000000000 +0200 --- C:\pgdev\pgsql\src\backend\commands\explain.c 2007-11-02 12:51:17.616303800 +0100 *************** *** 99,106 **** * function and is executed repeatedly. (See also the same hack in * DECLARE CURSOR and PREPARE.) XXX FIXME someday. */ rewritten = pg_analyze_and_rewrite((Node *) copyObject(stmt->query), ! queryString, param_types, num_params); /* prepare for projection of tuples */ tstate = begin_tup_output_tupdesc(dest, ExplainResultDesc(stmt)); --- 99,107 ---- * function and is executed repeatedly. (See also the same hack in * DECLARE CURSOR and PREPARE.) XXX FIXME someday. */ + //TODO: Check here rewritten = pg_analyze_and_rewrite((Node *) copyObject(stmt->query), ! queryString, param_types, num_params,NULL); /* prepare for projection of tuples */ tstate = begin_tup_output_tupdesc(dest, ExplainResultDesc(stmt)); *** C:\pgdev\pgsql\src\backend\commands\view.c.orig 2007-08-27 05:36:08.000000000 +0200 --- C:\pgdev\pgsql\src\backend\commands\view.c 2007-11-02 12:51:17.676374600 +0100 *************** *** 362,369 **** * Since parse analysis scribbles on its input, copy the raw parse tree; * this ensures we don't corrupt a prepared statement, for example. */ viewParse = parse_analyze((Node *) copyObject(stmt->query), ! queryString, NULL, 0); /* * The grammar should ensure that the result is a single SELECT Query. --- 362,370 ---- * Since parse analysis scribbles on its input, copy the raw parse tree; * this ensures we don't corrupt a prepared statement, for example. */ + //TODO: Check here viewParse = parse_analyze((Node *) copyObject(stmt->query), ! queryString, NULL, 0,NULL); /* * The grammar should ensure that the result is a single SELECT Query. *** C:\pgdev\pgsql\src\backend\executor\functions.c.orig 2007-06-17 20:57:29.000000000 +0200 --- C:\pgdev\pgsql\src\backend\executor\functions.c 2007-11-02 13:03:51.244537000 +0100 *************** *** 163,168 **** --- 163,172 ---- List *queryTree_list; Datum tmp; bool isNull; + int numargs; + Oid *argtypes; + char **argnames; + char *argmodes; fcache = (SQLFunctionCachePtr) palloc0(sizeof(SQLFunctionCache)); *************** *** 248,254 **** /* * Parse and rewrite the queries in the function text. */ ! queryTree_list = pg_parse_and_rewrite(fcache->src, argOidVect, nargs); /* * Check that the function returns the type it claims to. Although --- 252,261 ---- /* * Parse and rewrite the queries in the function text. */ ! ! numargs = get_func_arg_info(procedureTuple, ! &argtypes, &argnames, &argmodes); ! queryTree_list = pg_parse_and_rewrite(fcache->src, argOidVect, nargs,argnames); /* * Check that the function returns the type it claims to. Although *** C:\pgdev\pgsql\src\backend\executor\spi.c.orig 2007-10-25 15:48:57.000000000 +0200 --- C:\pgdev\pgsql\src\backend\executor\spi.c 2007-11-02 13:03:51.354666800 +0100 *************** *** 1409,1416 **** CachedPlan *cplan; /* Need a copyObject here to keep parser from modifying raw tree */ stmt_list = pg_analyze_and_rewrite(copyObject(parsetree), ! src, argtypes, nargs); stmt_list = pg_plan_queries(stmt_list, cursor_options, NULL, false); plansource = (CachedPlanSource *) palloc0(sizeof(CachedPlanSource)); --- 1409,1417 ---- CachedPlan *cplan; /* Need a copyObject here to keep parser from modifying raw tree */ + //TODO: Check Here stmt_list = pg_analyze_and_rewrite(copyObject(parsetree), ! src, argtypes, nargs,NULL); stmt_list = pg_plan_queries(stmt_list, cursor_options, NULL, false); plansource = (CachedPlanSource *) palloc0(sizeof(CachedPlanSource)); *** C:\pgdev\pgsql\src\backend\optimizer\util\clauses.c.orig 2007-10-11 23:27:49.000000000 +0200 --- C:\pgdev\pgsql\src\backend\optimizer\util\clauses.c 2007-11-02 13:05:18.517397600 +0100 *************** *** 18,24 **** */ #include "postgres.h" ! #include "access/heapam.h" #include "catalog/pg_aggregate.h" #include "catalog/pg_language.h" --- 18,24 ---- */ #include "postgres.h" ! #include "funcapi.h" #include "access/heapam.h" #include "catalog/pg_aggregate.h" #include "catalog/pg_language.h" *************** *** 2916,2921 **** --- 2916,2924 ---- int *usecounts; ListCell *arg; int i; + int numargs; + char **argnames; + char *argmodes; /* * Forget it if the function is not SQL-language or has other showstopper *************** *** 2987,2994 **** if (list_length(raw_parsetree_list) != 1) goto fail; querytree = parse_analyze(linitial(raw_parsetree_list), src, ! argtypes, funcform->pronargs); /* * The single command must be a simple "SELECT expression". --- 2990,3000 ---- if (list_length(raw_parsetree_list) != 1) goto fail; + numargs = get_func_arg_info(func_tuple, + &argtypes, &argnames, &argmodes); + querytree = parse_analyze(linitial(raw_parsetree_list), src, ! argtypes, funcform->pronargs,argnames); /* * The single command must be a simple "SELECT expression". *** C:\pgdev\pgsql\src\backend\parser\analyze.c.orig 2007-10-25 15:48:57.000000000 +0200 --- C:\pgdev\pgsql\src\backend\parser\analyze.c 2007-11-02 12:42:00.669881600 +0100 *************** *** 83,89 **** */ Query * parse_analyze(Node *parseTree, const char *sourceText, ! Oid *paramTypes, int numParams) { ParseState *pstate = make_parsestate(NULL); Query *query; --- 83,89 ---- */ Query * parse_analyze(Node *parseTree, const char *sourceText, ! Oid *paramTypes, int numParams,char **argnames) { ParseState *pstate = make_parsestate(NULL); Query *query; *************** *** 91,96 **** --- 91,97 ---- pstate->p_sourcetext = sourceText; pstate->p_paramtypes = paramTypes; pstate->p_numparams = numParams; + pstate->p_argnames = argnames; pstate->p_variableparams = false; query = transformStmt(pstate, parseTree); *** C:\pgdev\pgsql\src\backend\parser\parse_expr.c.orig 2007-06-24 00:12:51.000000000 +0200 --- C:\pgdev\pgsql\src\backend\parser\parse_expr.c 2007-11-02 15:25:46.130260000 +0100 *************** *** 349,354 **** --- 349,355 ---- int numnames = list_length(cref->fields); Node *node; int levels_up; + int i; /*---------- * The allowed syntaxes are: *************** *** 410,423 **** --- 411,445 ---- */ if (refnameRangeTblEntry(pstate, NULL, name, &levels_up) != NULL) + { node = transformWholeRowRef(pstate, NULL, name, cref->location); + } + else if(pstate->p_argnames != NULL) + { + /* try a final check to match the columnref to + * function argument names + */ + for(i = 0; i < pstate->p_numparams; i++) + { + if(strcmp(pstate->p_argnames[i],name) == 0) + { + ParamRef pref; + pref.type = T_ParamRef; + pref.number = i+1; + node = transformParamRef(pstate,&pref); + break; + } + } + } else + { ereport(ERROR, (errcode(ERRCODE_UNDEFINED_COLUMN), errmsg("column \"%s\" does not exist", name), parser_errposition(pstate, cref->location))); + } } break; } *** C:\pgdev\pgsql\src\backend\tcop\postgres.c.orig 2007-08-03 01:39:44.000000000 +0200 --- C:\pgdev\pgsql\src\backend\tcop\postgres.c 2007-11-02 13:01:35.304316600 +0100 *************** *** 500,506 **** List * pg_parse_and_rewrite(const char *query_string, /* string to execute */ Oid *paramTypes, /* parameter types */ ! int numParams) /* number of parameters */ { List *raw_parsetree_list; List *querytree_list; --- 500,507 ---- List * pg_parse_and_rewrite(const char *query_string, /* string to execute */ Oid *paramTypes, /* parameter types */ ! int numParams, ! char **argnames) /* number of parameters */ { List *raw_parsetree_list; List *querytree_list; *************** *** 519,529 **** { Node *parsetree = (Node *) lfirst(list_item); querytree_list = list_concat(querytree_list, pg_analyze_and_rewrite(parsetree, query_string, paramTypes, ! numParams)); } return querytree_list; --- 520,532 ---- { Node *parsetree = (Node *) lfirst(list_item); + //TODO: Check Here querytree_list = list_concat(querytree_list, pg_analyze_and_rewrite(parsetree, query_string, paramTypes, ! numParams, ! argnames)); } return querytree_list; *************** *** 582,588 **** */ List * pg_analyze_and_rewrite(Node *parsetree, const char *query_string, ! Oid *paramTypes, int numParams) { Query *query; List *querytree_list; --- 585,591 ---- */ List * pg_analyze_and_rewrite(Node *parsetree, const char *query_string, ! Oid *paramTypes, int numParams,char **argnames) { Query *query; List *querytree_list; *************** *** 593,599 **** if (log_parser_stats) ResetUsage(); ! query = parse_analyze(parsetree, query_string, paramTypes, numParams); if (log_parser_stats) ShowUsage("PARSE ANALYSIS STATISTICS"); --- 596,602 ---- if (log_parser_stats) ResetUsage(); ! query = parse_analyze(parsetree, query_string, paramTypes, numParams,argnames); if (log_parser_stats) ShowUsage("PARSE ANALYSIS STATISTICS"); *************** *** 896,903 **** */ oldcontext = MemoryContextSwitchTo(MessageContext); querytree_list = pg_analyze_and_rewrite(parsetree, query_string, ! NULL, 0); plantree_list = pg_plan_queries(querytree_list, 0, NULL, true); --- 899,907 ---- */ oldcontext = MemoryContextSwitchTo(MessageContext); + //TODO: Check here querytree_list = pg_analyze_and_rewrite(parsetree, query_string, ! NULL, 0,NULL); plantree_list = pg_plan_queries(querytree_list, 0, NULL, true); *** C:\pgdev\pgsql\src\backend\utils\cache\plancache.c.orig 2007-10-11 20:05:27.000000000 +0200 --- C:\pgdev\pgsql\src\backend\utils\cache\plancache.c 2007-11-02 13:01:35.274281200 +0100 *************** *** 474,483 **** * parse_analyze_varparams(), assuming that the caller never wants the * parameter types to change from the original values. */ slist = pg_analyze_and_rewrite(copyObject(plansource->raw_parse_tree), plansource->query_string, plansource->param_types, ! plansource->num_params); if (plansource->fully_planned) { --- 474,485 ---- * parse_analyze_varparams(), assuming that the caller never wants the * parameter types to change from the original values. */ + //TODO: Check here slist = pg_analyze_and_rewrite(copyObject(plansource->raw_parse_tree), plansource->query_string, plansource->param_types, ! plansource->num_params, ! NULL); if (plansource->fully_planned) { *** C:\pgdev\pgsql\src\include\parser\analyze.h.orig 2007-06-24 00:12:52.000000000 +0200 --- C:\pgdev\pgsql\src\include\parser\analyze.h 2007-11-02 12:42:00.419586600 +0100 *************** *** 18,24 **** extern Query *parse_analyze(Node *parseTree, const char *sourceText, ! Oid *paramTypes, int numParams); extern Query *parse_analyze_varparams(Node *parseTree, const char *sourceText, Oid **paramTypes, int *numParams); --- 18,24 ---- extern Query *parse_analyze(Node *parseTree, const char *sourceText, ! Oid *paramTypes, int numParams,char **argnames); extern Query *parse_analyze_varparams(Node *parseTree, const char *sourceText, Oid **paramTypes, int *numParams); *** C:\pgdev\pgsql\src\include\parser\parse_node.h.orig 2007-06-24 00:12:52.000000000 +0200 --- C:\pgdev\pgsql\src\include\parser\parse_node.h 2007-11-02 12:42:00.519704600 +0100 *************** *** 69,74 **** --- 69,75 ---- List *p_relnamespace; /* current namespace for relations */ List *p_varnamespace; /* current namespace for columns */ Oid *p_paramtypes; /* OIDs of types for $n parameter symbols */ + const char **p_argnames; /* names of function arguments */ int p_numparams; /* allocated size of p_paramtypes[] */ int p_next_resno; /* next targetlist resno to assign */ List *p_locking_clause; /* raw FOR UPDATE/FOR SHARE info */ *** C:\pgdev\pgsql\src\include\tcop\tcopprot.h.orig 2007-07-25 14:22:54.000000000 +0200 --- C:\pgdev\pgsql\src\include\tcop\tcopprot.h 2007-11-02 12:42:00.299445000 +0100 *************** *** 45,54 **** extern LogStmtLevel log_statement; extern List *pg_parse_and_rewrite(const char *query_string, ! Oid *paramTypes, int numParams); extern List *pg_parse_query(const char *query_string); extern List *pg_analyze_and_rewrite(Node *parsetree, const char *query_string, ! Oid *paramTypes, int numParams); extern PlannedStmt *pg_plan_query(Query *querytree, int cursorOptions, ParamListInfo boundParams); extern List *pg_plan_queries(List *querytrees, int cursorOptions, --- 45,54 ---- extern LogStmtLevel log_statement; extern List *pg_parse_and_rewrite(const char *query_string, ! Oid *paramTypes, int numParams,char **argnames); extern List *pg_parse_query(const char *query_string); extern List *pg_analyze_and_rewrite(Node *parsetree, const char *query_string, ! Oid *paramTypes, int numParams,char **argnames); extern PlannedStmt *pg_plan_query(Query *querytree, int cursorOptions, ParamListInfo boundParams); extern List *pg_plan_queries(List *querytrees, int cursorOptions,