Skip to content

Commit 0e2e367

Browse files
authored
Fix compensation logic to not early out if child compensations are needed (#3593)
…eded
1 parent c86051d commit 0e2e367

File tree

11 files changed

+177
-143
lines changed

11 files changed

+177
-143
lines changed

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/expressions/GroupByExpression.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,8 @@ public Compensation compensate(@Nonnull final PartialMatch partialMatch,
652652
return Compensation.impossibleCompensation();
653653
}
654654
final var compensatedResult = compensatedResultOptional.get();
655-
if (!compensatedResult.getResultCompensationFunction().isNeeded()) {
655+
if (!childCompensation.isNeeded() &&
656+
!compensatedResult.getResultCompensationFunction().isNeeded()) {
656657
return Compensation.noCompensation();
657658
}
658659

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/expressions/LogicalTypeFilterExpression.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,8 @@ public Compensation compensate(@Nonnull final PartialMatch partialMatch,
205205
return Compensation.impossibleCompensation();
206206
}
207207
final var compensatedResult = compensatedResultOptional.get();
208-
if (!compensatedResult.getResultCompensationFunction().isNeeded()) {
208+
if (!childCompensation.isNeeded() &&
209+
!compensatedResult.getResultCompensationFunction().isNeeded()) {
209210
return Compensation.noCompensation();
210211
}
211212

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/expressions/SelectExpression.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -880,7 +880,8 @@ public Compensation compensate(@Nonnull final PartialMatch partialMatch,
880880
isAnyCompensationFunctionImpossible |= compensatedResult.isCompensationImpossible();
881881

882882
final var isCompensationNeeded =
883-
!unmatchedQuantifiers.isEmpty() ||
883+
childCompensation.isNeeded() ||
884+
!unmatchedQuantifiers.isEmpty() ||
884885
isAnyCompensationFunctionNeeded ||
885886
compensatedResult.getResultCompensationFunction().isNeeded();
886887

yaml-tests/src/test/resources/aggregate-index-tests.metrics.binpb

Lines changed: 45 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
22
H
33
agg-index-tests5EXPLAIN select col1, sum(col2) from T1 group by col1;�
4-
��Ŀ� ���
5-
(@0�,80@YAISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)�
4+
����� ӎ�(@0��080@YAISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)�
65
digraph G {
76
fontname=courier;
87
rankdir=BT;
@@ -15,8 +14,7 @@ digraph G {
1514
}�
1615
=
1716
agg-index-tests*EXPLAIN select col1 from T1 group by col1;�
18-
����
19-
h ��(60�� 8%@ZISCAN(VI1 <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.COL1 AS _0) | MAP (_._0._0 AS COL1)�digraph G {
17+
��ô h ���(60��78%@ZISCAN(VI1 <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.COL1 AS _0) | MAP (_._0._0 AS COL1)�digraph G {
2018
fontname=courier;
2119
rankdir=BT;
2220
splines=polyline;
@@ -32,8 +30,7 @@ digraph G {
3230
}�
3331
B
3432
agg-index-tests/EXPLAIN select sum(col2) from T1 group by col1;�
35-
�ҏ�� ���
36-
(@0��-80@KAISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)�
33+
����� �ޭ (@0��680@KAISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)�
3734
digraph G {
3835
fontname=courier;
3936
rankdir=BT;
@@ -46,7 +43,7 @@ digraph G {
4643
}�
4744
Z
4845
agg-index-testsGEXPLAIN select col1, sum(col2) from T1 group by col1 order by col1 asc;�
49-
����� �ޜ (@0��+80@YAISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)�
46+
��ԛ� ��� (@0��180@YAISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)�
5047
digraph G {
5148
fontname=courier;
5249
rankdir=BT;
@@ -59,7 +56,7 @@ digraph G {
5956
}�
6057
[
6158
agg-index-testsHEXPLAIN select col1, sum(col2) from T1 group by col1 order by col1 desc;�
62-
��؄� �Ԛ (@0Ĩ,80@aAISCAN(MV1 <,> BY_GROUP REVERSE -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)� digraph G {
59+
�ْ�� ���(@0��580@aAISCAN(MV1 <,> BY_GROUP REVERSE -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)� digraph G {
6360
fontname=courier;
6461
rankdir=BT;
6562
splines=polyline;
@@ -71,8 +68,7 @@ digraph G {
7168
}�
7269
L
7370
agg-index-tests9EXPLAIN select col1, sum(col2) + 1 from T1 group by col1;�
74-
����� �ˌ
75-
(@0��,80@]AISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 + 1 AS _1)�
71+
��ԙ� ׇ� (@0��?80@]AISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 + 1 AS _1)�
7672
digraph G {
7773
fontname=courier;
7874
rankdir=BT;
@@ -85,7 +81,7 @@ digraph G {
8581
}�
8682
H
8783
agg-index-tests5EXPLAIN select col1, max(col2) from T1 group by col1;�
88-
�͕�� ��� (B0��282@WAISCAN(MV8 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)�
84+
����� ��� (B0ғ?82@WAISCAN(MV8 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)�
8985
digraph G {
9086
fontname=courier;
9187
rankdir=BT;
@@ -98,7 +94,7 @@ digraph G {
9894
}�
9995
V
10096
agg-index-testsCEXPLAIN select col1, max(col2) from T1 group by col1 order by col1;�
101-
��ނ� ��� (B0��082@WAISCAN(MV8 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)�
97+
����� ��(B0הL82@WAISCAN(MV8 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)�
10298
digraph G {
10399
fontname=courier;
104100
rankdir=BT;
@@ -111,7 +107,7 @@ digraph G {
111107
}�
112108
[
113109
agg-index-testsHEXPLAIN select col1, max(col2) from T1 group by col1 order by col1 desc;�
114-
��ҁ� ��� (B0��082@_AISCAN(MV8 <,> BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)� digraph G {
110+
����� ��� (B0��I82@_AISCAN(MV8 <,> BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)� digraph G {
115111
fontname=courier;
116112
rankdir=BT;
117113
splines=polyline;
@@ -123,7 +119,7 @@ digraph G {
123119
}�
124120
X
125121
agg-index-testsEEXPLAIN select col1, max(col2) from T1 where col1 = 10 group by col1;�
126-
����� (J0��:8F@rAISCAN(MV8 [EQUALS promote(@c13 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)�
122+
����� ��� (J0��P8F@rAISCAN(MV8 [EQUALS promote(@c13 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)�
127123
digraph G {
128124
fontname=courier;
129125
rankdir=BT;
@@ -151,10 +147,10 @@ D
151147
5 -> 4 [ label=<&nbsp;q104> label="q104" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ];
152148
6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ];
153149
2 -> 1 [ label=<&nbsp;q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ];
154-
}�
150+
}�
155151
?
156-
agg-index-tests,EXPLAIN select col2 from T1 where col1 = 10;�
157-
����� ��(E0��O8D@nCOVERING(MV8 [EQUALS promote(@c8 AS LONG)] -> [COL1: KEY[0], COL2: KEY[1], ID: KEY[3]]) | MAP (_.COL2 AS COL2)�
152+
agg-index-tests,EXPLAIN select col2 from T1 where col1 = 10;�
153+
�鑈� ���(E0���8D@nCOVERING(MV8 [EQUALS promote(@c8 AS LONG)] -> [COL1: KEY[0], COL2: KEY[1], ID: KEY[3]]) | MAP (_.COL2 AS COL2)�
158154
digraph G {
159155
fontname=courier;
160156
rankdir=BT;
@@ -167,8 +163,7 @@ digraph G {
167163
}�
168164
R
169165
agg-index-tests?EXPLAIN select col2 from T1 where col1 = 10 order by col2 desc;�
170-
����
171-
X ܛ�(00��8@vCOVERING(MV8 [EQUALS promote(@c8 AS LONG)] REVERSE -> [COL1: KEY[0], COL2: KEY[1], ID: KEY[3]]) | MAP (_.COL2 AS COL2)�
166+
����.X ��&(00��08@vCOVERING(MV8 [EQUALS promote(@c8 AS LONG)] REVERSE -> [COL1: KEY[0], COL2: KEY[1], ID: KEY[3]]) | MAP (_.COL2 AS COL2)�
172167
digraph G {
173168
fontname=courier;
174169
rankdir=BT;
@@ -216,7 +211,7 @@ H
216211
}�
217212
X
218213
agg-index-testsEEXPLAIN select col1, sum(col2) from T1 USE INDEX (vi1) group by col1;�
219-
����B ���(0��8@ISCAN(VI1 <,>) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._0._0 AS COL1, _._1._0 AS _1)�digraph G {
214+
��B ���(0��8@ISCAN(VI1 <,>) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._0._0 AS COL1, _._1._0 AS _1)�digraph G {
220215
fontname=courier;
221216
rankdir=BT;
222217
splines=polyline;
@@ -417,10 +412,10 @@ H
417412
4 -> 3 [ label=<&nbsp;q4> label="q4" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ];
418413
5 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ];
419414
2 -> 1 [ label=<&nbsp;q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ];
420-
}�
415+
}�
421416
M
422-
agg-index-tests:EXPLAIN select col1, max_ever(col2) from T1 group by col1;�
423-
��ڈ� ���(H0��<85@YAISCAN(MV6 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)�
417+
agg-index-tests:EXPLAIN select col1, max_ever(col2) from T1 group by col1;�
418+
����$� ���(H0���85@YAISCAN(MV6 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)�
424419
digraph G {
425420
fontname=courier;
426421
rankdir=BT;
@@ -433,8 +428,8 @@ digraph G {
433428
}�
434429
M
435430
agg-index-tests:EXPLAIN select col1, min_ever(col2) from T1 group by col1;�
436-
����� �͟
437-
(>0��)8*@ZAISCAN(MV12 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)�
431+
����� ���
432+
(>0��98*@ZAISCAN(MV12 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)�
438433
digraph G {
439434
fontname=courier;
440435
rankdir=BT;
@@ -473,7 +468,7 @@ digraph G {
473468
}�
474469
X
475470
agg-index-testsEEXPLAIN select col1, sum(col2) from T1 where col1 > 15 group by col1;�
476-
����� ��� (H0��98D@|AISCAN(MV1 [[GREATER_THAN promote(@c13 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)�
471+
�Ǿ�� ���(H0��v8D@|AISCAN(MV1 [[GREATER_THAN promote(@c13 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)�
477472
digraph G {
478473
fontname=courier;
479474
rankdir=BT;
@@ -486,7 +481,7 @@ digraph G {
486481
}�
487482
R
488483
agg-index-tests?EXPLAIN select sum(col2) from T1 where col1 = 10 group by col1�
489-
����� ��� (H0��:8D@fAISCAN(MV1 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)�
484+
����� (H0��@8D@fAISCAN(MV1 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)�
490485
digraph G {
491486
fontname=courier;
492487
rankdir=BT;
@@ -496,10 +491,24 @@ digraph G {
496491
3 [ label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="8"><tr><td align="left">Index</td></tr><tr><td align="left">MV1</td></tr></table>> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2)" ];
497492
3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ];
498493
2 -> 1 [ label=<&nbsp;q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ];
499-
}�
494+
}�
495+
x
496+
agg-index-testseEXPLAIN select col1 as g, sum(col2) as s from T1 use index (mv1) where col1 in (10, 20) group by col1�
497+
����� �Ʀ ( 0�S8+@�AISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | FILTER _._0 IN promote(@c22 AS ARRAY(LONG)) | MAP (_._0 AS G, _._1 AS S)�digraph G {
498+
fontname=courier;
499+
rankdir=BT;
500+
splines=polyline;
501+
1 [ label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="8"><tr><td align="left">Value Computation</td></tr><tr><td align="left">MAP (q6._0 AS G, q6._1 AS S)</td></tr></table>> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS G, LONG AS S)" ];
502+
2 [ label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="8"><tr><td align="left">Predicate Filter</td></tr><tr><td align="left">WHERE q2._0 IN promote(@c22 AS ARRAY(LONG))</td></tr></table>> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1)" ];
503+
3 [ label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="8"><tr><td align="left">Index Scan</td></tr><tr><td align="left">scan type: BY_GROUP</td></tr><tr><td align="left">range: &lt;-∞, ∞&gt;</td></tr></table>> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1)" ];
504+
4 [ label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="8"><tr><td align="left">Index</td></tr><tr><td align="left">MV1</td></tr></table>> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2)" ];
505+
3 -> 2 [ label=<&nbsp;q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ];
506+
4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ];
507+
2 -> 1 [ label=<&nbsp;q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ];
508+
}�
500509
c
501-
agg-index-testsPEXPLAIN select sum(col2) from T1 where col1 <= 10 group by col1 having col1 > 0;�
502-
��Ŝ� �ǥ (H0��38E@�AISCAN(MV1 [[GREATER_THAN promote(@c19 AS LONG) && LESS_THAN_OR_EQUALS promote(@c12 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)� digraph G {
510+
agg-index-testsPEXPLAIN select sum(col2) from T1 where col1 <= 10 group by col1 having col1 > 0;�
511+
����G� ���6(H0��8E@�AISCAN(MV1 [[GREATER_THAN promote(@c19 AS LONG) && LESS_THAN_OR_EQUALS promote(@c12 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)� digraph G {
503512
fontname=courier;
504513
rankdir=BT;
505514
splines=polyline;
@@ -899,10 +908,10 @@ u
899908
rankDir=LR;
900909
4 -> 3 [ color="red" style="invis" ];
901910
}
902-
}�
911+
}�
903912
�
904-
agg-index-tests�EXPLAIN select b, c, d, e, max(x) from t5 where a = 0 and c = 0 group by a, b, c, d, e having b IN ('foo', 'bar') order by max(x), d�
905-
���ā� ��h(]0��W85@�[IN @c38] INUNION q0 -> { AISCAN(MV18 [EQUALS promote(@c19 AS LONG), EQUALS q0, EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.D, _.B, _.C, _.E)�digraph G {
913+
agg-index-tests�EXPLAIN select b, c, d, e, max(x) from t5 where a = 0 and c = 0 group by a, b, c, d, e having b IN ('foo', 'bar') order by max(x), d�
914+
����e� �әJ(^0��48>@�[IN @c38] INUNION q0 -> { AISCAN(MV18 [EQUALS promote(@c19 AS LONG), EQUALS q0, EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.D, _.B, _.C, _.E)�digraph G {
906915
fontname=courier;
907916
rankdir=BT;
908917
splines=polyline;
@@ -920,10 +929,10 @@ u
920929
rankDir=LR;
921930
5 -> 2 [ color="red" style="invis" ];
922931
}
923-
}�
932+
}�
924933
�
925-
agg-index-tests�EXPLAIN select b, c, d, e, min(x) from t5 where a = 0 and c = 0 group by a, b, c, d, e having b IN ('foo', 'bar') order by min(x), d�
926-
������ ���r(]0��>85@�[IN @c38] INUNION q0 -> { AISCAN(MV19 [EQUALS promote(@c19 AS LONG), EQUALS q0, EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.D, _.B, _.C, _.E)�digraph G {
934+
agg-index-tests�EXPLAIN select b, c, d, e, min(x) from t5 where a = 0 and c = 0 group by a, b, c, d, e having b IN ('foo', 'bar') order by min(x), d�
935+
����y� ��Y(^0��I8>@�[IN @c38] INUNION q0 -> { AISCAN(MV19 [EQUALS promote(@c19 AS LONG), EQUALS q0, EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.D, _.B, _.C, _.E)�digraph G {
927936
fontname=courier;
928937
rankdir=BT;
929938
splines=polyline;

0 commit comments

Comments
 (0)