PartialSearchFilter: ESCAPE '\' causes ORA-01425 on Oracle
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 62/100
Direzione di ricerca
Inizia individuando ApiPlatform\Doctrine\Orm\Filter\PartialSearchFilter e leggendo le due espressioni LIKE e formatLikeValue(). Verifica come viene costruito il filtro in api-platform/doctrine-orm e api-platform/symfony prima di scegliere tra un carattere di escape configurabile o una gestione specifica per Oracle. Il lavoro è completato quando entrambe le modalità con distinzione tra maiuscole e minuscole generano una clausola ESCAPE accettata da Oracle ed eseguono l’escape in modo coerente di %, _ e del carattere di escape.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
API Platform version(s) affected: 4.3.10
(api-platform/doctrine-orm / api-platform/symfony)
Description
ApiPlatform\Doctrine\Orm\Filter\PartialSearchFilter generates SQL LIKE expressions with ESCAPE '\'.
On Oracle this fails with:
ORA-01425: escape character must be character string of length 1
In the executed SQL the escape clause appears as ESCAPE '\\' / ESCAPE '\\\\' (depending on logging), which Oracle rejects because the escape character is not a single-character string.
This affects both case-sensitive and case-insensitive modes, since both append the same ESCAPE '\' clause.
How to reproduce
- Use API Platform 4.3.x with Doctrine ORM on an Oracle database.
- Configure a collection operation with
PartialSearchFilter:
use ApiPlatform\Doctrine\Orm\Filter\PartialSearchFilter;
use ApiPlatform\Metadata\GetCollection;
use ApiPlatform\Metadata\QueryParameter;
new GetCollection(
uriTemplate: '/items',
parameters: [
'name' => new QueryParameter(
filter: new PartialSearchFilter(),
property: 'name',
),
],
)
- Call:
GET /items?name=test
- Observe the generated SQL containing something like:
LOWER(o.name) LIKE LOWER(:name_p1) ESCAPE '\\'
and Oracle raising ORA-01425.
Relevant code in PartialSearchFilter:
$field.' LIKE :'.$parameterName.' ESCAPE \'\\\''
// and
'LOWER('.$field.') LIKE LOWER(:'.$parameterName.') ESCAPE \'\\\''
with:
private function formatLikeValue(string $value): string
{
return '%'.addcslashes($value, '\\%_').'%';
}
Possible Solution
Make the escape character configurable (constructor option), and/or use a DB-agnostic escape character that Oracle accepts (e.g. !), updating both:
- the
ESCAPE '...'SQL clause formatLikeValue()escaping of%,_, and the escape character itself
Example approach:
public function __construct(
private readonly bool $caseSensitive = false,
private readonly string $escapeCharacter = '\\',
) {}
Then for Oracle consumers:
new PartialSearchFilter(escapeCharacter: '!')
Alternatively, detect the database platform and choose a safe default escape character for Oracle.
Additional Context
- Database: Oracle
- Error:
Doctrine\DBAL\Exception\DriverExceptionwrappingORA-01425 - Workaround used locally: custom filter based on
PartialSearchFilter, replacing\with!as escape character in both the SQLESCAPEclause and value escaping. - Same issue likely impacts any environment where
ESCAPE '\'is not treated as a single-character literal.
- Lingua principale
- PHP
- Stelle
- 2.6k
- Fork
- 982
- Merge medio
- 1g 16h
- PR unite (30g)
- 59
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di api-platform/core
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
api-platform/core#8564 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
api-platform/core#8495 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
api-platform/core#8471 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
api-platform/core#8475 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
api-platform/core#8447 ·
Tutte le issue di api-platform/core
Issue simili
-
Solved site promotion gate fails on runner PHP patch drift (expects 8.2.33, runner installs 8.2.34) Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
Automattic/blocks-engine#2161 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
Automattic/static-site-importer#1824 ·
-
[Chore] Keep one viget-block-generator skill and replicate it, instead of four tracked copies Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
-
Cannot reset column width Aperta0. Needs triage bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
-
0. Needs triage 35-feedback bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100