|
2 | 2 | #include "optimizer/paths.h"
|
3 | 3 | #include "optimizer/pathnode.h"
|
4 | 4 | #include "optimizer/restrictinfo.h"
|
| 5 | +#include "optimizer/tlist.h" |
5 | 6 | #include "utils/tqual.h"
|
6 | 7 | #include "utils/builtins.h"
|
7 | 8 | #include "utils/elog.h"
|
@@ -449,7 +450,7 @@ create_crossmatch_plan(PlannerInfo *root,
|
449 | 450 | cscan->scan.plan.targetlist = tlist;
|
450 | 451 | cscan->scan.plan.qual = joinclauses;
|
451 | 452 | cscan->scan.scanrelid = 0;
|
452 |
| - cscan->custom_scan_tlist = tlist; /* tlist of the 'virtual' join rel |
| 453 | + cscan->custom_scan_tlist = make_tlist_from_pathtarget(&rel->reltarget); /* tlist of the 'virtual' join rel |
453 | 454 | we'll have to build and scan */
|
454 | 455 |
|
455 | 456 | cscan->flags = best_path->flags;
|
@@ -512,8 +513,8 @@ crossmatch_begin(CustomScanState *node, EState *estate, int eflags)
|
512 | 513 | scan_state->outer = heap_open(scan_state->outer_rel, AccessShareLock);
|
513 | 514 | scan_state->inner = heap_open(scan_state->inner_rel, AccessShareLock);
|
514 | 515 |
|
515 |
| - scan_state->values = palloc(sizeof(Datum) * nlist); |
516 |
| - scan_state->nulls = palloc(sizeof(bool) * nlist); |
| 516 | + scan_state->values = palloc0(sizeof(Datum) * nlist); |
| 517 | + scan_state->nulls = palloc0(sizeof(bool) * nlist); |
517 | 518 |
|
518 | 519 | /* Store blank tuple in case scan tlist is empty */
|
519 | 520 | if (scan_state->scan_tlist == NIL)
|
@@ -575,6 +576,7 @@ crossmatch_exec(CustomScanState *node)
|
575 | 576 | if (!htup_outer_ready)
|
576 | 577 | {
|
577 | 578 | htup_outer_ready = true;
|
| 579 | + /* TODO: check result */ |
578 | 580 | heap_fetch(scan_state->outer, SnapshotSelf,
|
579 | 581 | &htup_outer, &buf1, false, NULL);
|
580 | 582 | }
|
@@ -665,6 +667,7 @@ static void
|
665 | 667 | crossmatch_rescan(CustomScanState *node)
|
666 | 668 | {
|
667 | 669 | /* NOTE: nothing to do here? */
|
| 670 | + node->ss.ps.ps_TupFromTlist = false; |
668 | 671 | }
|
669 | 672 |
|
670 | 673 | static void
|
|
0 commit comments