@ -7249,22 +7249,28 @@ get_name_for_var_field(Var *var, int fieldno,
* Recurse into the sub - select to see what its Var
* Recurse into the sub - select to see what its Var
* refers to . We have to build an additional level of
* refers to . We have to build an additional level of
* namespace to keep in step with varlevelsup in the
* namespace to keep in step with varlevelsup in the
* subselect .
* subselect ; furthermore , the subquery RTE might be
* from an outer query level , in which case the
* namespace for the subselect must have that outer
* level as parent namespace .
*/
*/
List * save_nslist = context - > namespaces ;
List * parent_namespaces ;
deparse_namespace mydpns ;
deparse_namespace mydpns ;
const char * result ;
const char * result ;
parent_namespaces = list_copy_tail ( context - > namespaces ,
netlevelsup ) ;
set_deparse_for_query ( & mydpns , rte - > subquery ,
set_deparse_for_query ( & mydpns , rte - > subquery ,
context - > namespaces ) ;
parent_ namespaces) ;
context - > namespaces = lcons ( & mydpns ,
context - > namespaces = lcons ( & mydpns , parent_namespaces ) ;
context - > namespaces ) ;
result = get_name_for_var_field ( ( Var * ) expr , fieldno ,
result = get_name_for_var_field ( ( Var * ) expr , fieldno ,
0 , context ) ;
0 , context ) ;
context - > namespaces =
context - > namespaces = save_nslist ;
list_delete_first ( context - > namespaces ) ;
return result ;
return result ;
}
}
@ -7356,7 +7362,7 @@ get_name_for_var_field(Var *var, int fieldno,
attnum ) ;
attnum ) ;
if ( ste = = NULL | | ste - > resjunk )
if ( ste = = NULL | | ste - > resjunk )
elog ( ERROR , " subquery %s does not have attribute %d" ,
elog ( ERROR , " CTE %s does not have attribute %d" ,
rte - > eref - > aliasname , attnum ) ;
rte - > eref - > aliasname , attnum ) ;
expr = ( Node * ) ste - > expr ;
expr = ( Node * ) ste - > expr ;
if ( IsA ( expr , Var ) )
if ( IsA ( expr , Var ) )
@ -7364,21 +7370,22 @@ get_name_for_var_field(Var *var, int fieldno,
/*
/*
* Recurse into the CTE to see what its Var refers to .
* Recurse into the CTE to see what its Var refers to .
* We have to build an additional level of namespace
* We have to build an additional level of namespace
* to keep in step with varlevelsup in the CTE .
* to keep in step with varlevelsup in the CTE ;
* F urthermore it could be an outer CTE , so we may
* f urthermore it could be an outer CTE ( compare
* have to delete some levels of namespace .
* SUBQUERY case above ) .
*/
*/
List * save_nslist = context - > namespaces ;
List * save_nslist = context - > namespaces ;
List * new_nslist ;
List * parent_namespaces ;
deparse_namespace mydpns ;
deparse_namespace mydpns ;
const char * result ;
const char * result ;
parent_namespaces = list_copy_tail ( context - > namespaces ,
ctelevelsup ) ;
set_deparse_for_query ( & mydpns , ctequery ,
set_deparse_for_query ( & mydpns , ctequery ,
context - > namespaces ) ;
parent_ namespaces) ;
new_nslist = list_copy_tail ( context - > namespaces ,
context - > namespaces = lcons ( & mydpns , parent_namespaces ) ;
ctelevelsup ) ;
context - > namespaces = lcons ( & mydpns , new_nslist ) ;
result = get_name_for_var_field ( ( Var * ) expr , fieldno ,
result = get_name_for_var_field ( ( Var * ) expr , fieldno ,
0 , context ) ;
0 , context ) ;