A null expression parameter raises TypeError when prepared and renders '' in getSqlString()
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 82/100
Piste de recherche
Commencez dans src/Sql/AbstractSql.php à processExpressionParameterName() (vers la ligne 285) et aux points d'appel autour des lignes 234-242. Élargissez le type du paramètre pour accepter null et renvoyez le littéral SQL NULL au lieu de lever une exception ou de mettre entre guillemets. Mettez à jour l'attente dans PredicateTest, puis exécutez la suite de tests pour vérifier que les modes prepared et getSqlString() rendent NULL correctement.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Package Version
0.6.x-dev @ e022af5c
Php Version
8.3, 8.4, 8.5
Database Engine
Any
Basic Information
AbstractSql::processExpression() renders a Sql\Argument\Value in one of two ways (AbstractSql.php#L234-L242):
- With a parameter container, it calls
processExpressionParameterName(), whose$valueisint|float|string|bool(AbstractSql.php#L285).Value::getValue()can returnnull, which raises aTypeError. - Without one, it calls
quoteValue((string) $argument->getValue()), which turnsnullinto a quoted empty string.
So a = ? with null either fails to prepare or renders a = '', a different query. This affects every predicate holding a null Value, including expression(), equalTo() and the other comparison methods.
Column values already render null as SQL NULL: resolveColumnValue() returns 'NULL' for a null column, so Insert and Update produce VALUES (:id, NULL) in prepared mode too.
The '' expectation in PredicateTest dates from laminas-db (1c5ad3a3, 2022), which recorded what quoting null produced at the time. That test never reaches its assertion on 0.6.x: its helper expects Sql92 to refuse the quote and throw.
Steps to Reproduce
(new Select('t'))->where(new Predicate\Expression('COALESCE(?, 7) = 7', [null])), prepared and executed on SQLite.- The same predicate rendered with
getSqlString()on any driver platform.
Expected Behavior
NULL, i.e. COALESCE(NULL, 7), in both modes, consistent with resolveColumnValue().
Inlining NULL changes the SQL text depending on whether a value is null. The alternative is to bind null as a parameter, which keeps one statement shape for statement caching (see #112). That means widening processExpressionParameterName() to accept null, which breaks subclasses that override it with the current signature. No driver package overrides it.
Actual behavior?
Prepared:
TypeError: PhpDb\Sql\AbstractSql::processExpressionParameterName(): Argument #1 ($value) must be of type string|int|float|bool, null given
getSqlString():
SELECT "t".* FROM "t" WHERE COALESCE('', 7) = 7
- Langage dominant
- PHP
- Étoiles
- 18
- Forks
- 8
- Merge moyen
- 6 j 11 h
- PR mergées (30 j)
- 14
Préparer son environnement
- Fournit un Dockerfile ou un fichier Docker Compose
- Aucun modèle de pull request
- Aucun 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 php-db/phpdb
-
RFC
Difficulté 3/5 1-2 jours Accessibilité débutants 66/100
Les mainteneurs répondent en général sous 1 jour
-
RFC
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 38/100
Les mainteneurs répondent en général sous 1 jour
-
RFC
Difficulté 3/5 1-2 jours Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 1 jour
-
RFC
Difficulté 4/5 3-5 jours Accessibilité débutants 45/100
Les mainteneurs répondent en général sous 1 jour
-
Sql's foreign-table guard raises TypeError when its table is a TableIdentifier or aliased arrayPeut-être pris @simon-mundy l’a pris il y a 1 jour. Ouvertebug
Difficulté 2/5 1-3 heures Accessibilité débutants 50/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de php-db/phpdb
Issues similaires
-
sync-en
Difficulté 1/5 1-3 heures Accessibilité débutants 88/100
Les mainteneurs répondent en général sous 1 jour
-
sync-en
Difficulté 1/5 Moins d'une heure Accessibilité débutants 82/100
Les mainteneurs répondent en général sous 3 jours
-
Settings Support Rotation
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
woocommerce/woocommerce#69424 ·
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
woocommerce/woocommerce-paypal-payments#4779 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
thephpleague/commonmark#1159 ·