3
3
* back to source text
4
4
*
5
5
* IDENTIFICATION
6
- * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.187 2004/12 /13 00:33:06 tgl Exp $
6
+ * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.188 2005/01 /13 17:19:10 tgl Exp $
7
7
*
8
8
* This software is copyrighted by Jan Wieck - Hamburg.
9
9
*
@@ -182,7 +182,7 @@ static void get_setop_query(Node *setOp, Query *query,
182
182
static Node * get_rule_sortgroupclause (SortClause * srt , List * tlist ,
183
183
bool force_colno ,
184
184
deparse_context * context );
185
- static void get_names_for_var (Var * var , deparse_context * context ,
185
+ static void get_names_for_var (Var * var , int levelsup , deparse_context * context ,
186
186
char * * schemaname , char * * refname , char * * attname );
187
187
static RangeTblEntry * find_rte_by_refname (const char * refname ,
188
188
deparse_context * context );
@@ -1998,7 +1998,7 @@ get_basic_select_query(Query *query, deparse_context *context,
1998
1998
char * refname ;
1999
1999
char * attname ;
2000
2000
2001
- get_names_for_var (var , context ,
2001
+ get_names_for_var (var , 0 , context ,
2002
2002
& schemaname , & refname , & attname );
2003
2003
tell_as = (attname == NULL ||
2004
2004
strcmp (attname , colname ) != 0 );
@@ -2392,6 +2392,10 @@ get_utility_query_def(Query *query, deparse_context *context)
2392
2392
/*
2393
2393
* Get the schemaname, refname and attname for a (possibly nonlocal) Var.
2394
2394
*
2395
+ * In some cases (currently only when recursing into an unnamed join)
2396
+ * the Var's varlevelsup has to be interpreted with respect to a context
2397
+ * above the current one; levelsup indicates the offset.
2398
+ *
2395
2399
* schemaname is usually returned as NULL. It will be non-null only if
2396
2400
* use of the unqualified refname would find the wrong RTE.
2397
2401
*
@@ -2404,17 +2408,20 @@ get_utility_query_def(Query *query, deparse_context *context)
2404
2408
* distinguish this case.)
2405
2409
*/
2406
2410
static void
2407
- get_names_for_var (Var * var , deparse_context * context ,
2411
+ get_names_for_var (Var * var , int levelsup , deparse_context * context ,
2408
2412
char * * schemaname , char * * refname , char * * attname )
2409
2413
{
2414
+ int netlevelsup ;
2410
2415
deparse_namespace * dpns ;
2411
2416
RangeTblEntry * rte ;
2412
2417
2413
2418
/* Find appropriate nesting depth */
2414
- if (var -> varlevelsup >= list_length (context -> namespaces ))
2415
- elog (ERROR , "bogus varlevelsup: %d" , var -> varlevelsup );
2419
+ netlevelsup = var -> varlevelsup + levelsup ;
2420
+ if (netlevelsup >= list_length (context -> namespaces ))
2421
+ elog (ERROR , "bogus varlevelsup: %d offset %d" ,
2422
+ var -> varlevelsup , levelsup );
2416
2423
dpns = (deparse_namespace * ) list_nth (context -> namespaces ,
2417
- var -> varlevelsup );
2424
+ netlevelsup );
2418
2425
2419
2426
/* Find the relevant RTE */
2420
2427
if (var -> varno >= 1 && var -> varno <= list_length (dpns -> rtable ))
@@ -2467,7 +2474,7 @@ get_names_for_var(Var *var, deparse_context *context,
2467
2474
var -> varattno - 1 );
2468
2475
if (IsA (aliasvar , Var ))
2469
2476
{
2470
- get_names_for_var (aliasvar , context ,
2477
+ get_names_for_var (aliasvar , netlevelsup , context ,
2471
2478
schemaname , refname , attname );
2472
2479
return ;
2473
2480
}
@@ -2867,7 +2874,7 @@ get_rule_expr(Node *node, deparse_context *context,
2867
2874
char * refname ;
2868
2875
char * attname ;
2869
2876
2870
- get_names_for_var (var , context ,
2877
+ get_names_for_var (var , 0 , context ,
2871
2878
& schemaname , & refname , & attname );
2872
2879
if (refname && (context -> varprefix || attname == NULL ))
2873
2880
{
0 commit comments