* transformFromClauseItem - * Transform a FROM-clause item, adding any required entries to the * range table list being built in the ParseState, and return the * transformed item ready to include in the joinlist. Also build a * ParseNamespaceItem list describing the names exposed by this item. * This routine can recurse to handle SQL92 JOIN expressions. * * The function return va
| 1266 | * are indeterminate and should be explicitly set by the caller before use.) |
| 1267 | */ |
| 1268 | static Node * |
| 1269 | transformFromClauseItem(ParseState *pstate, Node *n, |
| 1270 | ParseNamespaceItem **top_nsitem, |
| 1271 | List **namespace) |
| 1272 | { |
| 1273 | if (IsA(n, RangeVar)) |
| 1274 | { |
| 1275 | /* Plain relation reference, or perhaps a CTE reference */ |
| 1276 | RangeVar *rv = (RangeVar *) n; |
| 1277 | RangeTblRef *rtr; |
| 1278 | ParseNamespaceItem *nsitem; |
| 1279 | |
| 1280 | /* Check if it's a CTE or tuplestore reference */ |
| 1281 | nsitem = getNSItemForSpecialRelationTypes(pstate, rv); |
| 1282 | |
| 1283 | /* if not found above, must be a table reference */ |
| 1284 | if (!nsitem) |
| 1285 | nsitem = transformTableEntry(pstate, rv); |
| 1286 | |
| 1287 | *top_nsitem = nsitem; |
| 1288 | *namespace = list_make1(nsitem); |
| 1289 | rtr = makeNode(RangeTblRef); |
| 1290 | rtr->rtindex = nsitem->p_rtindex; |
| 1291 | return (Node *) rtr; |
| 1292 | } |
| 1293 | else if (IsA(n, RangeSubselect)) |
| 1294 | { |
| 1295 | /* sub-SELECT is like a plain relation */ |
| 1296 | RangeTblRef *rtr; |
| 1297 | ParseNamespaceItem *nsitem; |
| 1298 | |
| 1299 | nsitem = transformRangeSubselect(pstate, (RangeSubselect *) n); |
| 1300 | *top_nsitem = nsitem; |
| 1301 | *namespace = list_make1(nsitem); |
| 1302 | rtr = makeNode(RangeTblRef); |
| 1303 | rtr->rtindex = nsitem->p_rtindex; |
| 1304 | return (Node *) rtr; |
| 1305 | } |
| 1306 | else if (IsA(n, RangeFunction)) |
| 1307 | { |
| 1308 | /* function is like a plain relation */ |
| 1309 | RangeTblRef *rtr; |
| 1310 | ParseNamespaceItem *nsitem; |
| 1311 | |
| 1312 | nsitem = transformRangeFunction(pstate, (RangeFunction *) n); |
| 1313 | *top_nsitem = nsitem; |
| 1314 | *namespace = list_make1(nsitem); |
| 1315 | rtr = makeNode(RangeTblRef); |
| 1316 | rtr->rtindex = nsitem->p_rtindex; |
| 1317 | return (Node *) rtr; |
| 1318 | } |
| 1319 | else if (IsA(n, RangeTableFunc)) |
| 1320 | { |
| 1321 | /* table function is like a plain relation */ |
| 1322 | RangeTblRef *rtr; |
| 1323 | ParseNamespaceItem *nsitem; |
| 1324 | |
| 1325 | nsitem = transformRangeTableFunc(pstate, (RangeTableFunc *) n); |
no test coverage detected