function NamedPlaceholderConverterTest::statementsWithParametersProvider

Data for testParse.

File

core/modules/mysqli/tests/src/Unit/NamedPlaceholderConverterTest.php, line 38

Class

NamedPlaceholderConverterTest
Tests \Drupal\mysqli\Driver\Database\mysqli\NamedPlaceholderConverter.

Namespace

Drupal\Tests\mysqli\Unit

Code

public static function statementsWithParametersProvider() : iterable {
  (yield [
    'SELECT ?',
    [
      'foo',
    ],
    'SELECT ?',
    [
      'foo',
    ],
  ]);
  (yield [
    'SELECT * FROM Foo WHERE bar IN (?, ?, ?)',
    [
      'baz',
      'qux',
      'fred',
    ],
    'SELECT * FROM Foo WHERE bar IN (?, ?, ?)',
    [
      'baz',
      'qux',
      'fred',
    ],
  ]);
  (yield [
    'SELECT ? FROM ?',
    [
      'baz',
      'qux',
    ],
    'SELECT ? FROM ?',
    [
      'baz',
      'qux',
    ],
  ]);
  (yield [
    'SELECT "?" FROM foo WHERE bar = ?',
    [
      'baz',
    ],
    'SELECT "?" FROM foo WHERE bar = ?',
    [
      'baz',
    ],
  ]);
  (yield [
    "SELECT '?' FROM foo WHERE bar = ?",
    [
      'baz',
    ],
    "SELECT '?' FROM foo WHERE bar = ?",
    [
      'baz',
    ],
  ]);
  (yield [
    'SELECT `?` FROM foo WHERE bar = ?',
    [
      'baz',
    ],
    'SELECT `?` FROM foo WHERE bar = ?',
    [
      'baz',
    ],
  ]);
  (yield [
    'SELECT [?] FROM foo WHERE bar = ?',
    [
      'baz',
    ],
    'SELECT [?] FROM foo WHERE bar = ?',
    [
      'baz',
    ],
  ]);
  (yield [
    'SELECT * FROM foo WHERE jsonb_exists_any(foo.bar, ARRAY[?])',
    [
      'baz',
    ],
    'SELECT * FROM foo WHERE jsonb_exists_any(foo.bar, ARRAY[?])',
    [
      'baz',
    ],
  ]);
  (yield [
    "SELECT 'foo-bar?' FROM foo WHERE bar = ?",
    [
      'baz',
    ],
    "SELECT 'foo-bar?' FROM foo WHERE bar = ?",
    [
      'baz',
    ],
  ]);
  (yield [
    'SELECT "foo-bar?" FROM foo WHERE bar = ?',
    [
      'baz',
    ],
    'SELECT "foo-bar?" FROM foo WHERE bar = ?',
    [
      'baz',
    ],
  ]);
  (yield [
    'SELECT `foo-bar?` FROM foo WHERE bar = ?',
    [
      'baz',
    ],
    'SELECT `foo-bar?` FROM foo WHERE bar = ?',
    [
      'baz',
    ],
  ]);
  (yield [
    'SELECT [foo-bar?] FROM foo WHERE bar = ?',
    [
      'baz',
    ],
    'SELECT [foo-bar?] FROM foo WHERE bar = ?',
    [
      'baz',
    ],
  ]);
  (yield [
    'SELECT :foo FROM :bar',
    [
      ':foo' => 'baz',
      ':bar' => 'qux',
    ],
    'SELECT ? FROM ?',
    [
      'baz',
      'qux',
    ],
  ]);
  (yield [
    'SELECT * FROM Foo WHERE bar IN (:name1, :name2)',
    [
      ':name1' => 'baz',
      ':name2' => 'qux',
    ],
    'SELECT * FROM Foo WHERE bar IN (?, ?)',
    [
      'baz',
      'qux',
    ],
  ]);
  (yield [
    'SELECT ":foo" FROM Foo WHERE bar IN (:name1, :name2)',
    [
      ':name1' => 'baz',
      ':name2' => 'qux',
    ],
    'SELECT ":foo" FROM Foo WHERE bar IN (?, ?)',
    [
      'baz',
      'qux',
    ],
  ]);
  (yield [
    "SELECT ':foo' FROM Foo WHERE bar IN (:name1, :name2)",
    [
      ':name1' => 'baz',
      ':name2' => 'qux',
    ],
    "SELECT ':foo' FROM Foo WHERE bar IN (?, ?)",
    [
      'baz',
      'qux',
    ],
  ]);
  (yield [
    'SELECT :foo_id',
    [
      ':foo_id' => 'bar',
    ],
    'SELECT ?',
    [
      'bar',
    ],
  ]);
  (yield [
    'SELECT @rank := 1 AS rank, :foo AS foo FROM :bar',
    [
      ':foo' => 'baz',
      ':bar' => 'qux',
    ],
    'SELECT @rank := 1 AS rank, ? AS foo FROM ?',
    [
      'baz',
      'qux',
    ],
  ]);
  (yield [
    'SELECT * FROM Foo WHERE bar > :start_date AND baz > :start_date',
    [
      ':start_date' => 'qux',
    ],
    'SELECT * FROM Foo WHERE bar > ? AND baz > ?',
    [
      'qux',
      'qux',
    ],
  ]);
  (yield [
    'SELECT foo::date as date FROM Foo WHERE bar > :start_date AND baz > :start_date',
    [
      ':start_date' => 'qux',
    ],
    'SELECT foo::date as date FROM Foo WHERE bar > ? AND baz > ?',
    [
      'qux',
      'qux',
    ],
  ]);
  (yield [
    'SELECT `d.ns:col_name` FROM my_table d WHERE `d.date` >= :param1',
    [
      ':param1' => 'qux',
    ],
    'SELECT `d.ns:col_name` FROM my_table d WHERE `d.date` >= ?',
    [
      'qux',
    ],
  ]);
  (yield [
    'SELECT [d.ns:col_name] FROM my_table d WHERE [d.date] >= :param1',
    [
      ':param1' => 'qux',
    ],
    'SELECT [d.ns:col_name] FROM my_table d WHERE [d.date] >= ?',
    [
      'qux',
    ],
  ]);
  (yield [
    'SELECT * FROM foo WHERE jsonb_exists_any(foo.bar, ARRAY[:foo])',
    [
      ':foo' => 'qux',
    ],
    'SELECT * FROM foo WHERE jsonb_exists_any(foo.bar, ARRAY[?])',
    [
      'qux',
    ],
  ]);
  (yield [
    'SELECT * FROM foo WHERE jsonb_exists_any(foo.bar, array[:foo])',
    [
      ':foo' => 'qux',
    ],
    'SELECT * FROM foo WHERE jsonb_exists_any(foo.bar, array[?])',
    [
      'qux',
    ],
  ]);
  (yield [
    "SELECT table.column1, ARRAY['3'] FROM schema.table table WHERE table.f1 = :foo AND ARRAY['3']",
    [
      ':foo' => 'qux',
    ],
    "SELECT table.column1, ARRAY['3'] FROM schema.table table WHERE table.f1 = ? AND ARRAY['3']",
    [
      'qux',
    ],
  ]);
  (yield [
    "SELECT table.column1, ARRAY['3']::integer[] FROM schema.table table WHERE table.f1 = :foo AND ARRAY['3']::integer[]",
    [
      ':foo' => 'qux',
    ],
    "SELECT table.column1, ARRAY['3']::integer[] FROM schema.table table WHERE table.f1 = ? AND ARRAY['3']::integer[]",
    [
      'qux',
    ],
  ]);
  (yield [
    "SELECT table.column1, ARRAY[:foo] FROM schema.table table WHERE table.f1 = :bar AND ARRAY['3']",
    [
      ':foo' => 'qux',
      ':bar' => 'git',
    ],
    "SELECT table.column1, ARRAY[?] FROM schema.table table WHERE table.f1 = ? AND ARRAY['3']",
    [
      'qux',
      'git',
    ],
  ]);
  (yield [
    'SELECT table.column1, ARRAY[:foo]::integer[] FROM schema.table table' . " WHERE table.f1 = :bar AND ARRAY['3']::integer[]",
    [
      ':foo' => 'qux',
      ':bar' => 'git',
    ],
    'SELECT table.column1, ARRAY[?]::integer[] FROM schema.table table' . " WHERE table.f1 = ? AND ARRAY['3']::integer[]",
    [
      'qux',
      'git',
    ],
  ]);
  (yield 'Parameter array with placeholder keys missing starting colon' => [
    'SELECT table.column1, ARRAY[:foo]::integer[] FROM schema.table table' . " WHERE table.f1 = :bar AND ARRAY['3']::integer[]",
    [
      'foo' => 'qux',
      'bar' => 'git',
    ],
    'SELECT table.column1, ARRAY[?]::integer[] FROM schema.table table' . " WHERE table.f1 = ? AND ARRAY['3']::integer[]",
    [
      'qux',
      'git',
    ],
  ]);
  (yield 'Quotes inside literals escaped by doubling' => [
    <<<'SQL'
SELECT * FROM foo
WHERE bar = ':not_a_param1 ''":not_a_param2"'''
   OR bar=:a_param1
   OR bar=:a_param2||':not_a_param3'
   OR bar=':not_a_param4 '':not_a_param5'' :not_a_param6'
   OR bar=''
   OR bar=:a_param3
SQL
,
    [
      ':a_param1' => 'qux',
      ':a_param2' => 'git',
      ':a_param3' => 'foo',
    ],
    <<<'SQL'
SELECT * FROM foo
WHERE bar = ':not_a_param1 ''":not_a_param2"'''
   OR bar=?
   OR bar=?||':not_a_param3'
   OR bar=':not_a_param4 '':not_a_param5'' :not_a_param6'
   OR bar=''
   OR bar=?
SQL
,
    [
      'qux',
      'git',
      'foo',
    ],
  ]);
  (yield [
    'SELECT data.age AS age, data.id AS id, data.name AS name, data.id AS id FROM test_data data WHERE (data.description LIKE :condition_0 ESCAPE \'\\\\\') AND (data.description LIKE :condition_1 ESCAPE \'\\\\\') ORDER BY id ASC',
    [
      ':condition_0' => 'qux',
      ':condition_1' => 'git',
    ],
    'SELECT data.age AS age, data.id AS id, data.name AS name, data.id AS id FROM test_data data WHERE (data.description LIKE ? ESCAPE \'\\\\\') AND (data.description LIKE ? ESCAPE \'\\\\\') ORDER BY id ASC',
    [
      'qux',
      'git',
    ],
  ]);
  (yield [
    'SELECT data.age AS age, data.id AS id, data.name AS name, data.id AS id FROM test_data data WHERE (data.description LIKE :condition_0 ESCAPE "\\\\") AND (data.description LIKE :condition_1 ESCAPE "\\\\") ORDER BY id ASC',
    [
      ':condition_0' => 'qux',
      ':condition_1' => 'git',
    ],
    'SELECT data.age AS age, data.id AS id, data.name AS name, data.id AS id FROM test_data data WHERE (data.description LIKE ? ESCAPE "\\\\") AND (data.description LIKE ? ESCAPE "\\\\") ORDER BY id ASC',
    [
      'qux',
      'git',
    ],
  ]);
  (yield 'Combined single and double quotes' => [
    <<<'SQL'
SELECT data.age AS age, data.id AS id, data.name AS name, data.id AS id
  FROM test_data data
 WHERE (data.description LIKE :condition_0 ESCAPE "\\")
   AND (data.description LIKE :condition_1 ESCAPE '\\') ORDER BY id ASC
SQL
,
    [
      ':condition_0' => 'qux',
      ':condition_1' => 'git',
    ],
    <<<'SQL'
SELECT data.age AS age, data.id AS id, data.name AS name, data.id AS id
  FROM test_data data
 WHERE (data.description LIKE ? ESCAPE "\\")
   AND (data.description LIKE ? ESCAPE '\\') ORDER BY id ASC
SQL
,
    [
      'qux',
      'git',
    ],
  ]);
  (yield [
    'SELECT data.age AS age, data.id AS id, data.name AS name, data.id AS id FROM test_data data WHERE (data.description LIKE :condition_0 ESCAPE `\\\\`) AND (data.description LIKE :condition_1 ESCAPE `\\\\`) ORDER BY id ASC',
    [
      ':condition_0' => 'qux',
      ':condition_1' => 'git',
    ],
    'SELECT data.age AS age, data.id AS id, data.name AS name, data.id AS id FROM test_data data WHERE (data.description LIKE ? ESCAPE `\\\\`) AND (data.description LIKE ? ESCAPE `\\\\`) ORDER BY id ASC',
    [
      'qux',
      'git',
    ],
  ]);
  (yield 'Combined single quotes and backticks' => [
    <<<'SQL'
SELECT data.age AS age, data.id AS id, data.name AS name, data.id AS id
  FROM test_data data
 WHERE (data.description LIKE :condition_0 ESCAPE '\\')
   AND (data.description LIKE :condition_1 ESCAPE `\\`) ORDER BY id ASC
SQL
,
    [
      ':condition_0' => 'qux',
      ':condition_1' => 'git',
    ],
    <<<'SQL'
SELECT data.age AS age, data.id AS id, data.name AS name, data.id AS id
  FROM test_data data
 WHERE (data.description LIKE ? ESCAPE '\\')
   AND (data.description LIKE ? ESCAPE `\\`) ORDER BY id ASC
SQL
,
    [
      'qux',
      'git',
    ],
  ]);
  (yield '? placeholders inside comments' => [
    <<<'SQL'
/*
 * test placeholder ?
 */
SELECT dummy as "dummy?"
  FROM DUAL
 WHERE '?' = '?'
-- AND dummy <> ?
   AND dummy = ?
SQL
,
    [
      'baz',
    ],
    <<<'SQL'
/*
 * test placeholder ?
 */
SELECT dummy as "dummy?"
  FROM DUAL
 WHERE '?' = '?'
-- AND dummy <> ?
   AND dummy = ?
SQL
,
    [
      'baz',
    ],
  ]);
  (yield 'Named placeholders inside comments' => [
    <<<'SQL'
/*
 * test :placeholder
 */
SELECT dummy as "dummy?"
  FROM DUAL
 WHERE '?' = '?'
-- AND dummy <> :dummy
   AND dummy = :key
SQL
,
    [
      ':key' => 'baz',
    ],
    <<<'SQL'
/*
 * test :placeholder
 */
SELECT dummy as "dummy?"
  FROM DUAL
 WHERE '?' = '?'
-- AND dummy <> :dummy
   AND dummy = ?
SQL
,
    [
      'baz',
    ],
  ]);
  (yield 'Escaped question' => [
    <<<'SQL'
SELECT '{"a":null}'::jsonb ?? :key
SQL
,
    [
      ':key' => 'qux',
    ],
    <<<'SQL'
SELECT '{"a":null}'::jsonb ?? ?
SQL
,
    [
      'qux',
    ],
  ]);
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.