Skip to content

Commit 2d1adbf

Browse files
committed
Postgre: fix even literal inferring
1 parent fffa94f commit 2d1adbf

File tree

2 files changed

+50
-46
lines changed

2 files changed

+50
-46
lines changed

Diff for: src/Type/Doctrine/Query/QueryResultTypeWalker.php

+4-1
Original file line numberDiff line numberDiff line change
@@ -1114,7 +1114,10 @@ public function walkLiteral($literal): string
11141114

11151115
case AST\Literal::BOOLEAN:
11161116
$value = strtolower($literal->value) === 'true' ? 1 : 0;
1117-
$type = new ConstantIntegerType($value);
1117+
$type = TypeCombinator::union(
1118+
new ConstantIntegerType($value),
1119+
new BooleanType()
1120+
);
11181121
break;
11191122

11201123
case AST\Literal::NUMERIC:

Diff for: tests/Platform/QueryResultTypeWalkerFetchTypeMatrixTest.php

+46-45
Original file line numberDiff line numberDiff line change
@@ -180,60 +180,61 @@ public function provideCases(): iterable
180180
// Notes:
181181
// - Any direct column fetch uses the type declared in entity, but when passed to a function, the driver decides the type
182182

183-
$testData = [ // mysql, sqlite, pdo_pgsql, pgsql, stringified, stringifiedOldPostgre
183+
$testData = [ // mysql, sqlite, pdo_pgsql, pgsql, stringified, stringifiedOldPostgre
184184
// bool-ish
185-
't.col_bool' => ['bool', 'bool', 'bool', 'bool', 'bool', 'bool'],
186-
'COALESCE(t.col_bool, TRUE)' => ['int', 'int', 'bool', 'bool', 'string', 'bool'],
185+
'(TRUE)' => ['int', 'int', 'bool', 'bool', 'string', 'bool'],
186+
't.col_bool' => ['bool', 'bool', 'bool', 'bool', 'bool', 'bool'],
187+
'COALESCE(t.col_bool, TRUE)' => ['int', 'int', 'bool', 'bool', 'string', 'bool'],
187188

188189
// float-ish
189-
't.col_float' => ['float', 'float', 'float', 'float', 'float', 'float'],
190-
'AVG(t.col_float)' => ['float', 'float', 'string', 'float', 'string', 'string'],
191-
'SUM(t.col_float)' => ['float', 'float', 'string', 'float', 'string', 'string'],
192-
'MIN(t.col_float)' => ['float', 'float', 'string', 'float', 'string', 'string'],
193-
'MAX(t.col_float)' => ['float', 'float', 'string', 'float', 'string', 'string'],
194-
'SQRT(t.col_float)' => ['float', 'float', 'string', 'float', 'string', 'string'],
195-
'ABS(t.col_float)' => ['float', 'float', 'string', 'float', 'string', 'string'],
190+
't.col_float' => ['float', 'float', 'float', 'float', 'float', 'float'],
191+
'AVG(t.col_float)' => ['float', 'float', 'string', 'float', 'string', 'string'],
192+
'SUM(t.col_float)' => ['float', 'float', 'string', 'float', 'string', 'string'],
193+
'MIN(t.col_float)' => ['float', 'float', 'string', 'float', 'string', 'string'],
194+
'MAX(t.col_float)' => ['float', 'float', 'string', 'float', 'string', 'string'],
195+
'SQRT(t.col_float)' => ['float', 'float', 'string', 'float', 'string', 'string'],
196+
'ABS(t.col_float)' => ['float', 'float', 'string', 'float', 'string', 'string'],
196197

197198
// decimal-ish
198-
't.col_decimal' => ['string', 'string', 'string', 'string', 'string', 'string'],
199-
'0.1' => ['string', 'float', 'string', 'string', 'string', 'string'],
200-
'0.125e0' => ['float', 'float', 'string', 'string', 'string', 'string'],
201-
'AVG(t.col_decimal)' => ['string', 'float', 'string', 'string', 'string', 'string'],
202-
'AVG(t.col_int)' => ['string', 'float', 'string', 'string', 'string', 'string'],
203-
'AVG(t.col_bigint)' => ['string', 'float', 'string', 'string', 'string', 'string'],
204-
'SUM(t.col_decimal)' => ['string', 'float', 'string', 'string', 'string', 'string'],
205-
'MIN(t.col_decimal)' => ['string', 'float', 'string', 'string', 'string', 'string'],
206-
'MAX(t.col_decimal)' => ['string', 'float', 'string', 'string', 'string', 'string'],
207-
'SQRT(t.col_decimal)' => ['float', 'float', 'string', 'string', 'string', 'string'],
208-
'SQRT(t.col_int)' => ['float', 'float', 'string', 'float', 'string', 'string'],
209-
'SQRT(t.col_bigint)' => ['float', null, 'string', 'float', null, null], // sqlite3 returns float, but pdo_sqlite returns NULL
210-
'ABS(t.col_decimal)' => ['string', 'float', 'string', 'string', 'string', 'string'],
199+
't.col_decimal' => ['string', 'string', 'string', 'string', 'string', 'string'],
200+
'0.1' => ['string', 'float', 'string', 'string', 'string', 'string'],
201+
'0.125e0' => ['float', 'float', 'string', 'string', 'string', 'string'],
202+
'AVG(t.col_decimal)' => ['string', 'float', 'string', 'string', 'string', 'string'],
203+
'AVG(t.col_int)' => ['string', 'float', 'string', 'string', 'string', 'string'],
204+
'AVG(t.col_bigint)' => ['string', 'float', 'string', 'string', 'string', 'string'],
205+
'SUM(t.col_decimal)' => ['string', 'float', 'string', 'string', 'string', 'string'],
206+
'MIN(t.col_decimal)' => ['string', 'float', 'string', 'string', 'string', 'string'],
207+
'MAX(t.col_decimal)' => ['string', 'float', 'string', 'string', 'string', 'string'],
208+
'SQRT(t.col_decimal)' => ['float', 'float', 'string', 'string', 'string', 'string'],
209+
'SQRT(t.col_int)' => ['float', 'float', 'string', 'float', 'string', 'string'],
210+
'SQRT(t.col_bigint)' => ['float', null, 'string', 'float', null, null], // sqlite3 returns float, but pdo_sqlite returns NULL
211+
'ABS(t.col_decimal)' => ['string', 'float', 'string', 'string', 'string', 'string'],
211212

212213
// int-ish
213-
'1' => ['int', 'int', 'int', 'int', 'string', 'string'],
214-
'2147483648' => ['int', 'int', 'int', 'int', 'string', 'string'],
215-
't.col_int' => ['int', 'int', 'int', 'int', 'int', 'int'],
216-
't.col_bigint' => ['string', 'string', 'string', 'string', 'string', 'string'],
217-
'SUM(t.col_int)' => ['string', 'int', 'int', 'int', 'string', 'string'],
218-
'SUM(t.col_bigint)' => ['string', 'int', 'string', 'string', 'string', 'string'],
219-
"LENGTH('')" => ['int', 'int', 'int', 'int', 'int', 'int'],
220-
'COUNT(t)' => ['int', 'int', 'int', 'int', 'int', 'int'],
221-
'COUNT(1)' => ['int', 'int', 'int', 'int', 'int', 'int'],
222-
'COUNT(t.col_int)' => ['int', 'int', 'int', 'int', 'int', 'int'],
223-
'MIN(t.col_int)' => ['int', 'int', 'int', 'int', 'string', 'string'],
224-
'MIN(t.col_bigint)' => ['int', 'int', 'int', 'int', 'string', 'string'],
225-
'MAX(t.col_int)' => ['int', 'int', 'int', 'int', 'string', 'string'],
226-
'MAX(t.col_bigint)' => ['int', 'int', 'int', 'int', 'string', 'string'],
227-
'MOD(t.col_int, 2)' => ['int', 'int', 'int', 'int', 'string', 'string'],
228-
'MOD(t.col_bigint, 2)' => ['int', 'int', 'int', 'int', 'string', 'string'],
229-
'ABS(t.col_int)' => ['int', 'int', 'int', 'int', 'string', 'string'],
230-
'ABS(t.col_bigint)' => ['int', 'int', 'int', 'int', 'string', 'string'],
214+
'1' => ['int', 'int', 'int', 'int', 'string', 'string'],
215+
'2147483648' => ['int', 'int', 'int', 'int', 'string', 'string'],
216+
't.col_int' => ['int', 'int', 'int', 'int', 'int', 'int'],
217+
't.col_bigint' => ['string', 'string', 'string', 'string', 'string', 'string'],
218+
'SUM(t.col_int)' => ['string', 'int', 'int', 'int', 'string', 'string'],
219+
'SUM(t.col_bigint)' => ['string', 'int', 'string', 'string', 'string', 'string'],
220+
"LENGTH('')" => ['int', 'int', 'int', 'int', 'int', 'int'],
221+
'COUNT(t)' => ['int', 'int', 'int', 'int', 'int', 'int'],
222+
'COUNT(1)' => ['int', 'int', 'int', 'int', 'int', 'int'],
223+
'COUNT(t.col_int)' => ['int', 'int', 'int', 'int', 'int', 'int'],
224+
'MIN(t.col_int)' => ['int', 'int', 'int', 'int', 'string', 'string'],
225+
'MIN(t.col_bigint)' => ['int', 'int', 'int', 'int', 'string', 'string'],
226+
'MAX(t.col_int)' => ['int', 'int', 'int', 'int', 'string', 'string'],
227+
'MAX(t.col_bigint)' => ['int', 'int', 'int', 'int', 'string', 'string'],
228+
'MOD(t.col_int, 2)' => ['int', 'int', 'int', 'int', 'string', 'string'],
229+
'MOD(t.col_bigint, 2)' => ['int', 'int', 'int', 'int', 'string', 'string'],
230+
'ABS(t.col_int)' => ['int', 'int', 'int', 'int', 'string', 'string'],
231+
'ABS(t.col_bigint)' => ['int', 'int', 'int', 'int', 'string', 'string'],
231232

232233
// string
233-
't.col_string' => ['string', 'string', 'string', 'string', 'string', 'string'],
234-
'LOWER(t.col_string)' => ['string', 'string', 'string', 'string', 'string', 'string'],
235-
'UPPER(t.col_string)' => ['string', 'string', 'string', 'string', 'string', 'string'],
236-
'TRIM(t.col_string)' => ['string', 'string', 'string', 'string', 'string', 'string'],
234+
't.col_string' => ['string', 'string', 'string', 'string', 'string', 'string'],
235+
'LOWER(t.col_string)' => ['string', 'string', 'string', 'string', 'string', 'string'],
236+
'UPPER(t.col_string)' => ['string', 'string', 'string', 'string', 'string', 'string'],
237+
'TRIM(t.col_string)' => ['string', 'string', 'string', 'string', 'string', 'string'],
237238
];
238239

239240
$selects = array_keys($testData);

0 commit comments

Comments
 (0)