Skip to content

Commit 68c2d02

Browse files
author
Etienne V. Labelle
committed
Add failing tests demonstrating CTE (WITH …) queries return mixed
1 parent 42562f5 commit 68c2d02

2 files changed

Lines changed: 71 additions & 0 deletions

File tree

tests/default/DbaInferenceTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ public function dataFileAsserts(): iterable
7474
yield from $this->gatherAssertTypes(__DIR__ . '/data/pdo-union-result.php');
7575
yield from $this->gatherAssertTypes(__DIR__ . '/data/pdo-default-fetch-types.php');
7676
yield from $this->gatherAssertTypes(__DIR__ . '/data/bug372.php');
77+
yield from $this->gatherAssertTypes(__DIR__ . '/data/pdo-cte.php');
7778
}
7879

7980
/**

tests/default/data/pdo-cte.php

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?php
2+
3+
namespace PdoCteTest;
4+
5+
use PDO;
6+
use function PHPStan\Testing\assertType;
7+
8+
class Foo
9+
{
10+
public function simpleCte(PDO $pdo)
11+
{
12+
$query = 'WITH active_ada AS (SELECT email, adaid FROM ada WHERE gesperrt = 0) '
13+
.'SELECT email, adaid FROM active_ada';
14+
$stmt = $pdo->query($query, PDO::FETCH_ASSOC);
15+
foreach ($stmt as $row) {
16+
assertType('array{email: string, adaid: int<-32768, 32767>}', $row);
17+
}
18+
}
19+
20+
public function cteSelectStar(PDO $pdo)
21+
{
22+
$query = 'WITH cte AS (SELECT email, adaid FROM ada) SELECT * FROM cte';
23+
$stmt = $pdo->query($query, PDO::FETCH_ASSOC);
24+
foreach ($stmt as $row) {
25+
assertType('array{email: string, adaid: int<-32768, 32767>}', $row);
26+
}
27+
}
28+
29+
public function multipleCtes(PDO $pdo)
30+
{
31+
$query = 'WITH '
32+
.'emails AS (SELECT adaid, email FROM ada), '
33+
.'unlocked AS (SELECT adaid FROM ada WHERE gesperrt = 0) '
34+
.'SELECT e.email, e.adaid FROM emails e JOIN unlocked u ON u.adaid = e.adaid';
35+
$stmt = $pdo->query($query, PDO::FETCH_ASSOC);
36+
foreach ($stmt as $row) {
37+
assertType('array{email: string, adaid: int<-32768, 32767>}', $row);
38+
}
39+
}
40+
41+
public function cteWithAggregation(PDO $pdo)
42+
{
43+
$query = 'WITH counts AS (SELECT gesperrt, COUNT(*) AS total FROM ada GROUP BY gesperrt) '
44+
.'SELECT gesperrt, total FROM counts';
45+
$stmt = $pdo->query($query, PDO::FETCH_ASSOC);
46+
foreach ($stmt as $row) {
47+
assertType('array{gesperrt: int<-128, 127>, total: int}', $row);
48+
}
49+
}
50+
51+
public function recursiveCte(PDO $pdo)
52+
{
53+
$query = 'WITH RECURSIVE cnt(n) AS ('
54+
.'SELECT 1 UNION ALL SELECT n + 1 FROM cnt WHERE n < 5'
55+
.') SELECT n FROM cnt';
56+
$stmt = $pdo->query($query, PDO::FETCH_ASSOC);
57+
foreach ($stmt as $row) {
58+
assertType('array{n: int|null}', $row);
59+
}
60+
}
61+
62+
public function cteFetchNumeric(PDO $pdo)
63+
{
64+
$query = 'WITH cte AS (SELECT email, adaid FROM ada) SELECT email, adaid FROM cte';
65+
$stmt = $pdo->query($query, PDO::FETCH_NUM);
66+
foreach ($stmt as $row) {
67+
assertType('array{string, int<-32768, 32767>}', $row);
68+
}
69+
}
70+
}

0 commit comments

Comments
 (0)