Incorrect type in SelectStatement::$expr when query has CASE-clause in selected fields
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Accessibilité débutants
- 35/100
Piste de recherche
Commencez par la reproduction de Parser dans l’issue et examinez comment SelectStatement::$expr est alimenté lorsqu’une clause CASE est sélectionnée. Comparez les types Expression et CaseExpression et vérifiez le contrat attendu en réexécutant le script fourni ; c’est terminé lorsque le TypeError signalé ne se produit plus et que la liste d’expressions reste correctement typée.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
The public field SelectStatement::$expr is defined in a PHP docblock as an Expression[]. When parsing a query with a CASE statement, a CaseExpression object is present in this list, despite CaseExpression not extending Expression. This causes issues when explicitly requiring the Expression type as should be returned by SelectStatement::$expr.
Reproduction case
<?php
declare(strict_types=1);
use PhpMyAdmin\SqlParser\Components\Expression;
use PhpMyAdmin\SqlParser\Parser;
use PhpMyAdmin\SqlParser\Statements\SelectStatement;
include_once 'vendor/autoload.php';
$p = new Parser('SELECT a, CASE WHEN b IS NOT NULL THEN 1 ELSE 0 END as c FROM t');
$stmt = $p->statements[0];
if (! $stmt instanceof SelectStatement) {
throw new Exception('Could not parse select statement');
}
function acceptExpression(Expression $e): void {}
$expressions = $stmt->expr;
foreach ($expressions as $expression) {
acceptExpression($expression);
}
Expected behavior
I would expect this script to not error out as the $stmt->expr returns Expression[] according to its PHP docblock. Each element should therefore be compatible with Expression in my acceptExpression function.
Real behavior
$ php test.php
PHP Fatal error: Uncaught TypeError: acceptExpression(): Argument #1 ($e) must be of type PhpMyAdmin\SqlParser\Components\Expression, PhpMyAdmin\SqlParser\Components\CaseExpression given, called in /path/to/test.php on line 22 and defined in /path/to/test.php:18
Stack trace:
#0 /path/to/test.php(22): acceptExpression()
#1 {main}
thrown in /path/to/test.php on line 18
- Langage dominant
- PHP
- Étoiles
- 485
- Forks
- 119
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de phpmyadmin/sql-parser
-
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
phpmyadmin/sql-parser#655 · 1 réaction ·
-
Difficulté 3/5 1-2 jours Accessibilité débutants 55/100
phpmyadmin/sql-parser#666 ·
-
Difficulté 3/5 1-2 jours Accessibilité débutants 65/100
phpmyadmin/sql-parser#662 · 2 réactions ·
-
MariaDB and MySQL contexts Ouvertekind/support
Difficulté 3/5 1-2 jours Accessibilité débutants 45/100
phpmyadmin/sql-parser#653 · 1 réaction ·
-
Difficulté 3/5 1-2 jours Accessibilité débutants 70/100
phpmyadmin/sql-parser#649 ·
Toutes les issues de phpmyadmin/sql-parser
Issues similaires
-
Solved site promotion gate fails on runner PHP patch drift (expects 8.2.33, runner installs 8.2.34) Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
Automattic/blocks-engine#2161 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
Automattic/static-site-importer#1824 ·
-
[Chore] Keep one viget-block-generator skill and replicate it, instead of four tracked copies Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
-
Cannot reset column width Ouverte0. Needs triage bug
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
-
0. Needs triage 35-feedback bug
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100