Skip to content

Commit 7a91f9c

Browse files
staabmclxmstaab
andauthored
cover more unresolvable-query cases (#165)
Co-authored-by: Markus Staab <[email protected]>
1 parent ed42d9c commit 7a91f9c

8 files changed

+82
-22
lines changed

src/Rules/PdoStatementExecuteMethodRule.php

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use PHPStan\Rules\Rule;
1313
use PHPStan\Rules\RuleError;
1414
use PHPStan\Rules\RuleErrorBuilder;
15+
use PHPStan\Type\MixedType;
1516
use staabm\PHPStanDba\PdoReflection\PdoStatementReflection;
1617
use staabm\PHPStanDba\QueryReflection\PlaceholderValidation;
1718
use staabm\PHPStanDba\QueryReflection\QueryReflection;
@@ -63,6 +64,9 @@ private function checkErrors(MethodReflection $methodReflection, MethodCall $met
6364
if (null === $queryExpr) {
6465
return [];
6566
}
67+
if ($scope->getType($queryExpr) instanceof MixedType) {
68+
return [];
69+
}
6670

6771
$args = $methodCall->getArgs();
6872
if (\count($args) < 1) {
@@ -78,13 +82,19 @@ private function checkErrors(MethodReflection $methodReflection, MethodCall $met
7882
}
7983
}
8084

81-
$errors = [];
82-
$placeholderReflection = new PlaceholderValidation();
83-
foreach ($queryReflection->resolveQueryStrings($queryExpr, $scope) as $queryString) {
84-
foreach ($placeholderReflection->checkErrors($queryString, $parameters) as $error) {
85-
// make error messages unique
86-
$errors[$error] = $error;
85+
try {
86+
$errors = [];
87+
$placeholderReflection = new PlaceholderValidation();
88+
foreach ($queryReflection->resolveQueryStrings($queryExpr, $scope) as $queryString) {
89+
foreach ($placeholderReflection->checkErrors($queryString, $parameters) as $error) {
90+
// make error messages unique
91+
$errors[$error] = $error;
92+
}
8793
}
94+
} catch (UnresolvableQueryException $exception) {
95+
return [
96+
RuleErrorBuilder::message($exception->asRuleMessage())->tip(UnresolvableQueryException::RULE_TIP)->line($methodCall->getLine())->build(),
97+
];
8898
}
8999

90100
$ruleErrors = [];

src/Rules/SyntaxErrorInPreparedStatementMethodRule.php

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use PHPStan\Rules\Rule;
1414
use PHPStan\Rules\RuleError;
1515
use PHPStan\Rules\RuleErrorBuilder;
16+
use PHPStan\Type\MixedType;
1617
use PHPStan\Type\ObjectType;
1718
use staabm\PHPStanDba\QueryReflection\PlaceholderValidation;
1819
use staabm\PHPStanDba\QueryReflection\QueryReflection;
@@ -95,9 +96,13 @@ private function checkErrors(CallLike $callLike, Scope $scope): array
9596
}
9697

9798
$queryExpr = $args[0]->value;
98-
$parameterTypes = $scope->getType($args[1]->value);
99+
100+
if ($scope->getType($queryExpr) instanceof MixedType) {
101+
return [];
102+
}
99103

100104
$queryReflection = new QueryReflection();
105+
$parameterTypes = $scope->getType($args[1]->value);
101106
try {
102107
$parameters = $queryReflection->resolveParameters($parameterTypes) ?? [];
103108
} catch (UnresolvableQueryException $exception) {
@@ -108,25 +113,31 @@ private function checkErrors(CallLike $callLike, Scope $scope): array
108113

109114
$errors = [];
110115
$placeholderReflection = new PlaceholderValidation();
111-
foreach ($queryReflection->resolvePreparedQueryStrings($queryExpr, $parameterTypes, $scope) as $queryString) {
112-
$queryError = $queryReflection->validateQueryString($queryString);
113-
if (null !== $queryError) {
114-
$error = $queryError->asRuleMessage();
115-
$errors[$error] = $error;
116+
try {
117+
foreach ($queryReflection->resolvePreparedQueryStrings($queryExpr, $parameterTypes, $scope) as $queryString) {
118+
$queryError = $queryReflection->validateQueryString($queryString);
119+
if (null !== $queryError) {
120+
$error = $queryError->asRuleMessage();
121+
$errors[$error] = $error;
122+
}
116123
}
117-
}
118124

119-
foreach ($queryReflection->resolveQueryStrings($queryExpr, $scope) as $queryString) {
120-
foreach ($placeholderReflection->checkErrors($queryString, $parameters) as $error) {
121-
$errors[$error] = $error;
125+
foreach ($queryReflection->resolveQueryStrings($queryExpr, $scope) as $queryString) {
126+
foreach ($placeholderReflection->checkErrors($queryString, $parameters) as $error) {
127+
$errors[$error] = $error;
128+
}
122129
}
123-
}
124130

125-
$ruleErrors = [];
126-
foreach ($errors as $error) {
127-
$ruleErrors[] = RuleErrorBuilder::message($error)->line($callLike->getLine())->build();
128-
}
131+
$ruleErrors = [];
132+
foreach ($errors as $error) {
133+
$ruleErrors[] = RuleErrorBuilder::message($error)->line($callLike->getLine())->build();
134+
}
129135

130-
return $ruleErrors;
136+
return $ruleErrors;
137+
} catch (UnresolvableQueryException $exception) {
138+
return [
139+
RuleErrorBuilder::message($exception->asRuleMessage())->tip(UnresolvableQueryException::RULE_TIP)->line($callLike->getLine())->build(),
140+
];
141+
}
131142
}
132143
}

src/Rules/SyntaxErrorInQueryFunctionRule.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PHPStan\Reflection\ReflectionProvider;
1111
use PHPStan\Rules\Rule;
1212
use PHPStan\Rules\RuleErrorBuilder;
13+
use PHPStan\Type\MixedType;
1314
use staabm\PHPStanDba\QueryReflection\QueryReflection;
1415
use staabm\PHPStanDba\Tests\SyntaxErrorInQueryFunctionRuleTest;
1516
use staabm\PHPStanDba\UnresolvableQueryException;
@@ -77,6 +78,10 @@ public function processNode(Node $node, Scope $scope): array
7778
return [];
7879
}
7980

81+
if ($scope->getType($args[$queryArgPosition]->value) instanceof MixedType) {
82+
return [];
83+
}
84+
8085
$queryReflection = new QueryReflection();
8186
try {
8287
foreach ($queryReflection->resolveQueryStrings($args[$queryArgPosition]->value, $scope) as $queryString) {

src/Rules/SyntaxErrorInQueryMethodRule.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use PHPStan\Analyser\Scope;
1010
use PHPStan\Rules\Rule;
1111
use PHPStan\Rules\RuleErrorBuilder;
12+
use PHPStan\Type\MixedType;
1213
use staabm\PHPStanDba\QueryReflection\QueryReflection;
1314
use staabm\PHPStanDba\UnresolvableQueryException;
1415

@@ -69,6 +70,10 @@ public function processNode(Node $node, Scope $scope): array
6970
return [];
7071
}
7172

73+
if ($scope->getType($args[$queryArgPosition]->value) instanceof MixedType) {
74+
return [];
75+
}
76+
7277
try {
7378
$queryReflection = new QueryReflection();
7479
$queryStrings = $queryReflection->resolveQueryStrings($args[$queryArgPosition]->value, $scope);

tests/data/unresolvable-pdo-statement.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,12 @@ public function mixedParam(PDO $pdo, $mixed)
1212
$stmt = $pdo->prepare($query);
1313
$stmt->execute([':gesperrt' => $mixed]);
1414
}
15+
16+
public function noErrorOnMixedQuery(PDO $pdo, $mixed)
17+
{
18+
// we should not report a error here, as this is like a call somewhere in between software layers
19+
// which don't know anything about the actual query
20+
$stmt = $pdo->prepare($mixed);
21+
$stmt->execute([]);
22+
}
1523
}

tests/data/unresolvable-query-in-function.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,11 @@ public function mixedParam2(DbCredentials $dbCredentials, $mixed)
1616
$query = 'SELECT email adaid WHERE gesperrt freigabe1u1 FROM ada gesperrt='.$mixed;
1717
\Deployer\runMysqlQuery($query, $dbCredentials);
1818
}
19+
20+
public function noErrorOnMixedQuery(DbCredentials $dbCredentials, $mixed)
21+
{
22+
// we should not report a error here, as this is like a call somewhere in between software layers
23+
// which don't know anything about the actual query
24+
\Deployer\runMysqlQuery($mixed, $dbCredentials);
25+
}
1926
}

tests/data/unresolvable-query-in-method.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,11 @@ public function mixedParam2(PDO $pdo, $mixed)
1616
$query = 'SELECT email FROM ada WHERE gesperrt='.$mixed;
1717
$pdo->query($query);
1818
}
19+
20+
public function noErrorOnMixedQuery(PDO $pdo, $mixed)
21+
{
22+
// we should not report a error here, as this is like a call somewhere in between software layers
23+
// which don't know anything about the actual query
24+
$pdo->query($mixed);
25+
}
1926
}

tests/data/unresolvable-statement.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,11 @@ public function mixedParam(Connection $connection, $mixed)
1212
'gesperrt' => $mixed,
1313
]);
1414
}
15+
16+
public function noErrorOnMixedQuery(Connection $connection, $mixed)
17+
{
18+
// we should not report a error here, as this is like a call somewhere in between software layers
19+
// which don't know anything about the actual query
20+
$connection->preparedQuery($mixed, []);
21+
}
1522
}

0 commit comments

Comments
 (0)