Skip to content

Commit cde6423

Browse files
keulinhoclxmstaab
andauthored
Fix QueryPlanAnalyser with dynamic offset and limit params (#390)
* Fix QueryPlanAnalyser with dynamic offset and limit params The QueryPlanAnalyser does not strip trailing limits and offsets. If limits and offsets are set via parameters it would escape the limits and offsets as strings. This resulted in incorrect SQL being analysed. * revert fix * fix Co-authored-by: Markus Staab <[email protected]>
1 parent 3a19d10 commit cde6423

22 files changed

+6916
-1009
lines changed

.phpstan-dba-mysqli.cache

Lines changed: 4 additions & 475 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.phpstan-dba-pdo-mysql.cache

Lines changed: 22 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/QueryReflection/QueryResolver.php renamed to src/Analyzer/QueryPlanQueryResolver.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@
22

33
declare(strict_types=1);
44

5-
namespace staabm\PHPStanDba\QueryReflection;
5+
namespace staabm\PHPStanDba\Analyzer;
66

77
use PhpParser\Node\Expr;
88
use PHPStan\Analyser\Scope;
99
use PHPStan\Type\Type;
10+
use staabm\PHPStanDba\QueryReflection\QueryReflection;
11+
use staabm\PHPStanDba\QueryReflection\QuerySimulation;
1012
use staabm\PHPStanDba\UnresolvableQueryException;
1113

12-
final class QueryResolver
14+
final class QueryPlanQueryResolver
1315
{
1416
/**
1517
* @return iterable<string>
@@ -32,7 +34,11 @@ public function resolve(Scope $scope, Expr $queryExpr, ?Type $parameterTypes): i
3234
}
3335

3436
foreach ($queryStrings as $queryString) {
35-
yield $queryString;
37+
$normalizedQuery = QuerySimulation::stripTrailers($queryString);
38+
39+
if (null !== $normalizedQuery) {
40+
yield $normalizedQuery;
41+
}
3642
}
3743
}
3844
}

src/QueryReflection/QueryReflection.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use PHPStan\Type\TypeUtils;
1616
use PHPStan\Type\UnionType;
1717
use staabm\PHPStanDba\Analyzer\QueryPlanAnalyzerMysql;
18+
use staabm\PHPStanDba\Analyzer\QueryPlanQueryResolver;
1819
use staabm\PHPStanDba\Analyzer\QueryPlanResult;
1920
use staabm\PHPStanDba\DbaException;
2021
use staabm\PHPStanDba\Error;
@@ -430,7 +431,7 @@ public function analyzeQueryPlan(Scope $scope, Expr $queryExpr, ?Type $parameter
430431
}
431432
$queryPlanAnalyzer = new QueryPlanAnalyzerMysql($ds);
432433

433-
$queryResolver = new QueryResolver();
434+
$queryResolver = new QueryPlanQueryResolver();
434435
foreach ($queryResolver->resolve($scope, $queryExpr, $parameterTypes) as $queryString) {
435436
if ('' === $queryString) {
436437
continue;

src/QueryReflection/QuerySimulation.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ public static function simulateParamValueType(Type $paramType, bool $preparedPar
124124

125125
public static function simulate(string $queryString): ?string
126126
{
127-
$queryString = self::stripTraillingLimit($queryString);
127+
$queryString = self::stripTrailers($queryString);
128128

129129
if (null === $queryString) {
130130
return null;
@@ -134,7 +134,7 @@ public static function simulate(string $queryString): ?string
134134
return $queryString;
135135
}
136136

137-
private static function stripTraillingLimit(string $queryString): ?string
137+
public static function stripTrailers(string $queryString): ?string
138138
{
139139
// XXX someday we will use a proper SQL parser
140140
$queryString = rtrim($queryString);

src/Rules/QueryPlanAnalyzerRule.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,12 @@
1616
use PHPStan\Type\MixedType;
1717
use PHPStan\Type\ObjectType;
1818
use staabm\PHPStanDba\QueryReflection\QueryReflection;
19+
use staabm\PHPStanDba\Tests\QueryPlanAnalyzerRuleTest;
1920

2021
/**
2122
* @implements Rule<CallLike>
23+
*
24+
* @see QueryPlanAnalyzerRuleTest
2225
*/
2326
final class QueryPlanAnalyzerRule implements Rule
2427
{

0 commit comments

Comments
 (0)