|
| 1 | +--TEST-- |
| 2 | +PgSQL PDO Parser: E'' strings next to text containing e/E |
| 3 | +--EXTENSIONS-- |
| 4 | +pdo_pgsql |
| 5 | +--SKIPIF-- |
| 6 | +<?php |
| 7 | +require __DIR__ . '/config.inc'; |
| 8 | +require dirname(__DIR__, 2) . '/pdo/tests/pdo_test.inc'; |
| 9 | +PDOTest::skip(); |
| 10 | +?> |
| 11 | +--FILE-- |
| 12 | +<?php |
| 13 | +require dirname(__DIR__, 2) . '/pdo/tests/pdo_test.inc'; |
| 14 | +$db = PDOTest::test_factory(__DIR__ . '/common.phpt'); |
| 15 | +$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
| 16 | +$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); |
| 17 | + |
| 18 | +$queries = [ |
| 19 | + // The "?" and ":name" inside the E'' strings must not be treated as placeholders |
| 20 | + ["SELECT E'here\\'s a ?' AS selected_e, ? AS value_e", ['one']], |
| 21 | + ["SELECT 'x'||e'\\'?' AS concat_e, :name AS reference_e", ['name' => 'two']], |
| 22 | + ["SELECT ('a%' LIKE 'a!%' ESCAPE'!')::text AS escape_e, E'\\\\:e' AS e, :e AS ee", ['e' => 'three']], |
| 23 | + ["SELECT date'2026-10-14' AS date_e, ?::text AS where_else", ['four']], |
| 24 | + ["SELECT ? AS e, ? AS E2 WHERE TRUE", ['five', 'six']], |
| 25 | + ["SELECT /* e'? */ :value AS value_e -- e'?", ['value' => 'seven']], |
| 26 | +]; |
| 27 | + |
| 28 | +foreach ([true, false] as $emulate) { |
| 29 | + $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, $emulate); |
| 30 | + echo $emulate ? "emulated:\n" : "native:\n"; |
| 31 | + foreach ($queries as [$sql, $params]) { |
| 32 | + $stmt = $db->prepare($sql); |
| 33 | + $stmt->execute($params); |
| 34 | + echo json_encode($stmt->fetch()), "\n"; |
| 35 | + } |
| 36 | +} |
| 37 | +?> |
| 38 | +--EXPECT-- |
| 39 | +emulated: |
| 40 | +{"selected_e":"here's a ?","value_e":"one"} |
| 41 | +{"concat_e":"x'?","reference_e":"two"} |
| 42 | +{"escape_e":"true","e":"\\:e","ee":"three"} |
| 43 | +{"date_e":"2026-10-14","where_else":"four"} |
| 44 | +{"e":"five","e2":"six"} |
| 45 | +{"value_e":"seven"} |
| 46 | +native: |
| 47 | +{"selected_e":"here's a ?","value_e":"one"} |
| 48 | +{"concat_e":"x'?","reference_e":"two"} |
| 49 | +{"escape_e":"true","e":"\\:e","ee":"three"} |
| 50 | +{"date_e":"2026-10-14","where_else":"four"} |
| 51 | +{"e":"five","e2":"six"} |
| 52 | +{"value_e":"seven"} |
0 commit comments