Skip to content

Commit 0ebf142

Browse files
committed
Fix group-sorted optimization for data types with different equal values
1 parent 8aca5f4 commit 0ebf142

3 files changed

Lines changed: 47 additions & 7 deletions

File tree

h2/src/main/org/h2/command/Prepared.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ public void setCteCleanups(List<TableView> cteCleanups) {
444444
this.cteCleanups = cteCleanups;
445445
}
446446

447-
public SessionLocal getSession() {
447+
public final SessionLocal getSession() {
448448
return session;
449449
}
450450

h2/src/main/org/h2/command/query/Select.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1884,9 +1884,10 @@ protected Value[] fetchNextRow() {
18841884
setCurrentRowNumber(rowNumber + 1);
18851885
if (isConditionMet()) {
18861886
rowNumber++;
1887-
Value[] keyValues = new Value[groupIndex.length];
1887+
int groupSize = groupIndex.length;
1888+
Value[] keyValues = new Value[groupSize];
18881889
// update group
1889-
for (int i = 0; i < groupIndex.length; i++) {
1890+
for (int i = 0; i < groupSize; i++) {
18901891
int idx = groupIndex[i];
18911892
Expression expr = expressions.get(idx);
18921893
keyValues[i] = expr.getValue(getSession());
@@ -1896,10 +1897,16 @@ protected Value[] fetchNextRow() {
18961897
if (previousKeyValues == null) {
18971898
previousKeyValues = keyValues;
18981899
groupData.nextLazyGroup();
1899-
} else if (!Arrays.equals(previousKeyValues, keyValues)) {
1900-
row = createGroupSortedRow(previousKeyValues, columnCount);
1901-
previousKeyValues = keyValues;
1902-
groupData.nextLazyGroup();
1900+
} else {
1901+
SessionLocal session = getSession();
1902+
for (int i = 0; i < groupSize; i++) {
1903+
if (session.compare(previousKeyValues[i], keyValues[i]) != 0) {
1904+
row = createGroupSortedRow(previousKeyValues, columnCount);
1905+
previousKeyValues = keyValues;
1906+
groupData.nextLazyGroup();
1907+
break;
1908+
}
1909+
}
19031910
}
19041911
groupData.nextLazyRow();
19051912
updateAgg(columnCount, DataAnalysisOperation.STAGE_GROUP);

h2/src/test/org/h2/test/scripts/queries/query-optimisations.sql

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,3 +175,36 @@ SET TIME ZONE LOCAL;
175175

176176
DROP TABLE A, B;
177177
> ok
178+
179+
CREATE TABLE TEST(T TIMESTAMP WITH TIME ZONE) AS VALUES
180+
NULL,
181+
TIMESTAMP WITH TIME ZONE '2020-01-01 00:00:00+00',
182+
TIMESTAMP WITH TIME ZONE '2020-01-01 01:00:00+01',
183+
TIMESTAMP WITH TIME ZONE '2020-01-01 02:00:00+01',
184+
NULL;
185+
> ok
186+
187+
SELECT T AT TIME ZONE 'UTC' FROM TEST GROUP BY T;
188+
> T AT TIME ZONE 'UTC'
189+
> ----------------------
190+
> 2020-01-01 00:00:00+00
191+
> 2020-01-01 01:00:00+00
192+
> null
193+
> rows: 3
194+
195+
CREATE INDEX TEST_T_IDX ON TEST(T);
196+
> ok
197+
198+
SELECT T AT TIME ZONE 'UTC' FROM TEST GROUP BY T;
199+
> T AT TIME ZONE 'UTC'
200+
> ----------------------
201+
> 2020-01-01 00:00:00+00
202+
> 2020-01-01 01:00:00+00
203+
> null
204+
> rows: 3
205+
206+
EXPLAIN SELECT T AT TIME ZONE 'UTC' FROM TEST GROUP BY T;
207+
>> SELECT "T" AT TIME ZONE 'UTC' FROM "PUBLIC"."TEST" /* PUBLIC.TEST_T_IDX */ GROUP BY "T" /* group sorted */
208+
209+
DROP TABLE TEST;
210+
> ok

0 commit comments

Comments
 (0)