pullup-group.patch
text/x-patch
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| .gitignore | 1 | 0 |
| src/backend/optimizer/prep/prepjointree.c | 23 | 5 |
diff --git a/.gitignore b/.gitignore
index 81c4d5e..2230d62 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,3 +28,4 @@ win32ver.rc
/pgsql.sln.cache
/Debug/
/Release/
+tags
diff --git a/src/backend/optimizer/prep/prepjointree.c b/src/backend/optimizer/prep/prepjointree.c
index 5d16329..91d6fa0 100644
--- a/src/backend/optimizer/prep/prepjointree.c
+++ b/src/backend/optimizer/prep/prepjointree.c
@@ -877,9 +877,23 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte,
parse->hasSubLinks |= subquery->hasSubLinks;
/*
- * subquery won't be pulled up if it hasAggs or hasWindowFuncs, so no work
- * needed on those flags
+ * For group clauses, reassign the indexes to the targetList, by
+ * adding new junk ones (for now).
*/
+ parse->hasAggs = subquery->hasAggs;
+ parse->groupClause = copyObject(subquery->groupClause);
+ foreach (lc, parse->groupClause)
+ {
+ SortGroupClause *sort = (SortGroupClause *) lfirst(lc);
+ TargetEntry *tle = get_tle_by_resno(subquery->targetList, sort->tleSortGroupRef);
+ TargetEntry *newtle;
+ AttrNumber resno = list_length(parse->targetList);
+
+ Assert(tle != NULL);
+ newtle = makeTargetEntry(tle->expr, resno + 1, tle->resname, true);
+ parse->targetList = lappend(parse->targetList, newtle);
+ sort->tleSortGroupRef = assignSortGroupRef(newtle, parse->targetList);
+ }
/*
* Return the adjusted subquery jointree to replace the RangeTblRef entry
@@ -1071,10 +1085,14 @@ is_simple_subquery(Query *subquery)
* that case the locking was originally declared in the upper query
* anyway.
*/
- if (subquery->hasAggs ||
+ /*
+ * In some cases aggregate query can be pulled up. Need to add code
+ * to make decision for more precise conditions.
+ */
+ if (/*subquery->hasAggs ||*/
subquery->hasWindowFuncs ||
- subquery->groupClause ||
- subquery->havingQual ||
+ /*subquery->groupClause ||
+ subquery->havingQual ||*/
subquery->sortClause ||
subquery->distinctClause ||
subquery->limitOffset ||