*** 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,
