2012-08-15 13:16:09 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Test the abstract database layer
|
2013-04-13 14:40:04 +00:00
|
|
|
* This is a non DBMS depending test.
|
2012-08-15 13:16:09 +00:00
|
|
|
*/
|
|
|
|
|
class DatabaseSQLTest extends MediaWikiTestCase {
|
2016-08-27 17:10:46 +00:00
|
|
|
/** @var DatabaseTestHelper */
|
2013-04-13 14:40:04 +00:00
|
|
|
private $database;
|
|
|
|
|
|
2012-10-08 10:56:20 +00:00
|
|
|
protected function setUp() {
|
2012-12-06 16:57:37 +00:00
|
|
|
parent::setUp();
|
2016-08-27 17:10:46 +00:00
|
|
|
$this->database = new DatabaseTestHelper( __CLASS__, [ 'cliMode' => true ] );
|
2013-04-13 14:40:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected function assertLastSql( $sqlText ) {
|
|
|
|
|
$this->assertEquals(
|
|
|
|
|
$this->database->getLastSqls(),
|
|
|
|
|
$sqlText
|
|
|
|
|
);
|
2012-08-15 13:16:09 +00:00
|
|
|
}
|
|
|
|
|
|
2016-08-27 17:10:46 +00:00
|
|
|
protected function assertLastSqlDb( $sqlText, $db ) {
|
|
|
|
|
$this->assertEquals( $db->getLastSqls(), $sqlText );
|
|
|
|
|
}
|
|
|
|
|
|
2012-08-15 13:16:09 +00:00
|
|
|
/**
|
2013-04-13 14:40:04 +00:00
|
|
|
* @dataProvider provideSelect
|
2013-10-18 10:36:09 +00:00
|
|
|
* @covers DatabaseBase::select
|
2012-08-15 13:16:09 +00:00
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
public function testSelect( $sql, $sqlText ) {
|
2013-04-13 14:40:04 +00:00
|
|
|
$this->database->select(
|
|
|
|
|
$sql['tables'],
|
|
|
|
|
$sql['fields'],
|
2016-02-17 09:09:32 +00:00
|
|
|
isset( $sql['conds'] ) ? $sql['conds'] : [],
|
2012-08-15 13:16:09 +00:00
|
|
|
__METHOD__,
|
2016-02-17 09:09:32 +00:00
|
|
|
isset( $sql['options'] ) ? $sql['options'] : [],
|
|
|
|
|
isset( $sql['join_conds'] ) ? $sql['join_conds'] : []
|
2013-04-13 14:40:04 +00:00
|
|
|
);
|
|
|
|
|
$this->assertLastSql( $sqlText );
|
2012-08-15 13:16:09 +00:00
|
|
|
}
|
|
|
|
|
|
2013-04-13 14:40:04 +00:00
|
|
|
public static function provideSelect() {
|
2016-02-17 09:09:32 +00:00
|
|
|
return [
|
|
|
|
|
[
|
|
|
|
|
[
|
2012-08-15 13:16:09 +00:00
|
|
|
'tables' => 'table',
|
2016-02-17 09:09:32 +00:00
|
|
|
'fields' => [ 'field', 'alias' => 'field2' ],
|
|
|
|
|
'conds' => [ 'alias' => 'text' ],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"SELECT field,field2 AS alias " .
|
|
|
|
|
"FROM table " .
|
2013-02-14 13:10:38 +00:00
|
|
|
"WHERE alias = 'text'"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
2012-08-15 13:16:09 +00:00
|
|
|
'tables' => 'table',
|
2016-02-17 09:09:32 +00:00
|
|
|
'fields' => [ 'field', 'alias' => 'field2' ],
|
|
|
|
|
'conds' => [ 'alias' => 'text' ],
|
|
|
|
|
'options' => [ 'LIMIT' => 1, 'ORDER BY' => 'field' ],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"SELECT field,field2 AS alias " .
|
|
|
|
|
"FROM table " .
|
|
|
|
|
"WHERE alias = 'text' " .
|
2013-02-14 13:10:38 +00:00
|
|
|
"ORDER BY field " .
|
|
|
|
|
"LIMIT 1"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
|
|
|
|
'tables' => [ 'table', 't2' => 'table2' ],
|
|
|
|
|
'fields' => [ 'tid', 'field', 'alias' => 'field2', 't2.id' ],
|
|
|
|
|
'conds' => [ 'alias' => 'text' ],
|
|
|
|
|
'options' => [ 'LIMIT' => 1, 'ORDER BY' => 'field' ],
|
|
|
|
|
'join_conds' => [ 't2' => [
|
2012-08-15 13:16:09 +00:00
|
|
|
'LEFT JOIN', 'tid = t2.id'
|
2016-02-17 09:09:32 +00:00
|
|
|
] ],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"SELECT tid,field,field2 AS alias,t2.id " .
|
|
|
|
|
"FROM table LEFT JOIN table2 t2 ON ((tid = t2.id)) " .
|
|
|
|
|
"WHERE alias = 'text' " .
|
2013-02-14 13:10:38 +00:00
|
|
|
"ORDER BY field " .
|
|
|
|
|
"LIMIT 1"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
|
|
|
|
'tables' => [ 'table', 't2' => 'table2' ],
|
|
|
|
|
'fields' => [ 'tid', 'field', 'alias' => 'field2', 't2.id' ],
|
|
|
|
|
'conds' => [ 'alias' => 'text' ],
|
|
|
|
|
'options' => [ 'LIMIT' => 1, 'GROUP BY' => 'field', 'HAVING' => 'COUNT(*) > 1' ],
|
|
|
|
|
'join_conds' => [ 't2' => [
|
2012-08-31 18:12:19 +00:00
|
|
|
'LEFT JOIN', 'tid = t2.id'
|
2016-02-17 09:09:32 +00:00
|
|
|
] ],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"SELECT tid,field,field2 AS alias,t2.id " .
|
|
|
|
|
"FROM table LEFT JOIN table2 t2 ON ((tid = t2.id)) " .
|
|
|
|
|
"WHERE alias = 'text' " .
|
2013-02-14 13:10:38 +00:00
|
|
|
"GROUP BY field HAVING COUNT(*) > 1 " .
|
|
|
|
|
"LIMIT 1"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
|
|
|
|
'tables' => [ 'table', 't2' => 'table2' ],
|
|
|
|
|
'fields' => [ 'tid', 'field', 'alias' => 'field2', 't2.id' ],
|
|
|
|
|
'conds' => [ 'alias' => 'text' ],
|
|
|
|
|
'options' => [
|
2014-04-24 16:06:21 +00:00
|
|
|
'LIMIT' => 1,
|
2016-02-17 09:09:32 +00:00
|
|
|
'GROUP BY' => [ 'field', 'field2' ],
|
|
|
|
|
'HAVING' => [ 'COUNT(*) > 1', 'field' => 1 ]
|
|
|
|
|
],
|
|
|
|
|
'join_conds' => [ 't2' => [
|
2012-08-31 18:12:19 +00:00
|
|
|
'LEFT JOIN', 'tid = t2.id'
|
2016-02-17 09:09:32 +00:00
|
|
|
] ],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"SELECT tid,field,field2 AS alias,t2.id " .
|
|
|
|
|
"FROM table LEFT JOIN table2 t2 ON ((tid = t2.id)) " .
|
|
|
|
|
"WHERE alias = 'text' " .
|
2013-02-14 13:10:38 +00:00
|
|
|
"GROUP BY field,field2 HAVING (COUNT(*) > 1) AND field = '1' " .
|
|
|
|
|
"LIMIT 1"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
|
|
|
|
'tables' => [ 'table' ],
|
|
|
|
|
'fields' => [ 'alias' => 'field' ],
|
|
|
|
|
'conds' => [ 'alias' => [ 1, 2, 3, 4 ] ],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"SELECT field AS alias " .
|
|
|
|
|
"FROM table " .
|
|
|
|
|
"WHERE alias IN ('1','2','3','4')"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
];
|
2013-04-13 14:40:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider provideUpdate
|
2013-10-18 10:36:09 +00:00
|
|
|
* @covers DatabaseBase::update
|
2013-04-13 14:40:04 +00:00
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
public function testUpdate( $sql, $sqlText ) {
|
2013-04-13 14:40:04 +00:00
|
|
|
$this->database->update(
|
|
|
|
|
$sql['table'],
|
|
|
|
|
$sql['values'],
|
|
|
|
|
$sql['conds'],
|
|
|
|
|
__METHOD__,
|
2016-02-17 09:09:32 +00:00
|
|
|
isset( $sql['options'] ) ? $sql['options'] : []
|
2013-04-13 14:40:04 +00:00
|
|
|
);
|
|
|
|
|
$this->assertLastSql( $sqlText );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function provideUpdate() {
|
2016-02-17 09:09:32 +00:00
|
|
|
return [
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'table' => 'table',
|
2016-02-17 09:09:32 +00:00
|
|
|
'values' => [ 'field' => 'text', 'field2' => 'text2' ],
|
|
|
|
|
'conds' => [ 'alias' => 'text' ],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"UPDATE table " .
|
|
|
|
|
"SET field = 'text'" .
|
|
|
|
|
",field2 = 'text2' " .
|
|
|
|
|
"WHERE alias = 'text'"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'table' => 'table',
|
2016-02-17 09:09:32 +00:00
|
|
|
'values' => [ 'field = other', 'field2' => 'text2' ],
|
|
|
|
|
'conds' => [ 'id' => '1' ],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"UPDATE table " .
|
|
|
|
|
"SET field = other" .
|
|
|
|
|
",field2 = 'text2' " .
|
|
|
|
|
"WHERE id = '1'"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'table' => 'table',
|
2016-02-17 09:09:32 +00:00
|
|
|
'values' => [ 'field = other', 'field2' => 'text2' ],
|
2013-04-13 14:40:04 +00:00
|
|
|
'conds' => '*',
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"UPDATE table " .
|
|
|
|
|
"SET field = other" .
|
|
|
|
|
",field2 = 'text2'"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
];
|
2013-04-13 14:40:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider provideDelete
|
2013-10-18 10:36:09 +00:00
|
|
|
* @covers DatabaseBase::delete
|
2013-04-13 14:40:04 +00:00
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
public function testDelete( $sql, $sqlText ) {
|
2013-04-13 14:40:04 +00:00
|
|
|
$this->database->delete(
|
|
|
|
|
$sql['table'],
|
|
|
|
|
$sql['conds'],
|
|
|
|
|
__METHOD__
|
|
|
|
|
);
|
|
|
|
|
$this->assertLastSql( $sqlText );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function provideDelete() {
|
2016-02-17 09:09:32 +00:00
|
|
|
return [
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'table' => 'table',
|
2016-02-17 09:09:32 +00:00
|
|
|
'conds' => [ 'alias' => 'text' ],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"DELETE FROM table " .
|
|
|
|
|
"WHERE alias = 'text'"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'table' => 'table',
|
|
|
|
|
'conds' => '*',
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"DELETE FROM table"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
];
|
2013-04-13 14:40:04 +00:00
|
|
|
}
|
|
|
|
|
|
2013-06-04 18:34:49 +00:00
|
|
|
/**
|
|
|
|
|
* @dataProvider provideUpsert
|
2013-10-18 10:36:09 +00:00
|
|
|
* @covers DatabaseBase::upsert
|
2013-06-04 18:34:49 +00:00
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
public function testUpsert( $sql, $sqlText ) {
|
2013-06-04 18:34:49 +00:00
|
|
|
$this->database->upsert(
|
|
|
|
|
$sql['table'],
|
|
|
|
|
$sql['rows'],
|
|
|
|
|
$sql['uniqueIndexes'],
|
|
|
|
|
$sql['set'],
|
|
|
|
|
__METHOD__
|
|
|
|
|
);
|
|
|
|
|
$this->assertLastSql( $sqlText );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function provideUpsert() {
|
2016-02-17 09:09:32 +00:00
|
|
|
return [
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-06-04 18:34:49 +00:00
|
|
|
'table' => 'upsert_table',
|
2016-02-17 09:09:32 +00:00
|
|
|
'rows' => [ 'field' => 'text', 'field2' => 'text2' ],
|
|
|
|
|
'uniqueIndexes' => [ 'field' ],
|
|
|
|
|
'set' => [ 'field' => 'set' ],
|
|
|
|
|
],
|
2013-06-04 18:34:49 +00:00
|
|
|
"BEGIN; " .
|
|
|
|
|
"UPDATE upsert_table " .
|
|
|
|
|
"SET field = 'set' " .
|
|
|
|
|
"WHERE ((field = 'text')); " .
|
|
|
|
|
"INSERT IGNORE INTO upsert_table " .
|
|
|
|
|
"(field,field2) " .
|
|
|
|
|
"VALUES ('text','text2'); " .
|
|
|
|
|
"COMMIT"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
];
|
2013-06-04 18:34:49 +00:00
|
|
|
}
|
|
|
|
|
|
2013-04-13 14:40:04 +00:00
|
|
|
/**
|
|
|
|
|
* @dataProvider provideDeleteJoin
|
2013-10-18 10:36:09 +00:00
|
|
|
* @covers DatabaseBase::deleteJoin
|
2013-04-13 14:40:04 +00:00
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
public function testDeleteJoin( $sql, $sqlText ) {
|
2013-04-13 14:40:04 +00:00
|
|
|
$this->database->deleteJoin(
|
|
|
|
|
$sql['delTable'],
|
|
|
|
|
$sql['joinTable'],
|
|
|
|
|
$sql['delVar'],
|
|
|
|
|
$sql['joinVar'],
|
|
|
|
|
$sql['conds'],
|
|
|
|
|
__METHOD__
|
|
|
|
|
);
|
|
|
|
|
$this->assertLastSql( $sqlText );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function provideDeleteJoin() {
|
2016-02-17 09:09:32 +00:00
|
|
|
return [
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'delTable' => 'table',
|
|
|
|
|
'joinTable' => 'table_join',
|
|
|
|
|
'delVar' => 'field',
|
|
|
|
|
'joinVar' => 'field_join',
|
2016-02-17 09:09:32 +00:00
|
|
|
'conds' => [ 'alias' => 'text' ],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"DELETE FROM table " .
|
|
|
|
|
"WHERE field IN (" .
|
2013-04-26 12:00:22 +00:00
|
|
|
"SELECT field_join FROM table_join WHERE alias = 'text'" .
|
2013-04-13 14:40:04 +00:00
|
|
|
")"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'delTable' => 'table',
|
|
|
|
|
'joinTable' => 'table_join',
|
|
|
|
|
'delVar' => 'field',
|
|
|
|
|
'joinVar' => 'field_join',
|
|
|
|
|
'conds' => '*',
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"DELETE FROM table " .
|
|
|
|
|
"WHERE field IN (" .
|
2013-04-26 12:00:22 +00:00
|
|
|
"SELECT field_join FROM table_join " .
|
2013-04-13 14:40:04 +00:00
|
|
|
")"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
];
|
2013-04-13 14:40:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider provideInsert
|
2013-10-18 10:36:09 +00:00
|
|
|
* @covers DatabaseBase::insert
|
2013-04-13 14:40:04 +00:00
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
public function testInsert( $sql, $sqlText ) {
|
2013-04-13 14:40:04 +00:00
|
|
|
$this->database->insert(
|
|
|
|
|
$sql['table'],
|
|
|
|
|
$sql['rows'],
|
|
|
|
|
__METHOD__,
|
2016-02-17 09:09:32 +00:00
|
|
|
isset( $sql['options'] ) ? $sql['options'] : []
|
2013-04-13 14:40:04 +00:00
|
|
|
);
|
|
|
|
|
$this->assertLastSql( $sqlText );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function provideInsert() {
|
2016-02-17 09:09:32 +00:00
|
|
|
return [
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'table' => 'table',
|
2016-02-17 09:09:32 +00:00
|
|
|
'rows' => [ 'field' => 'text', 'field2' => 2 ],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"INSERT INTO table " .
|
|
|
|
|
"(field,field2) " .
|
|
|
|
|
"VALUES ('text','2')"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'table' => 'table',
|
2016-02-17 09:09:32 +00:00
|
|
|
'rows' => [ 'field' => 'text', 'field2' => 2 ],
|
2013-04-13 14:40:04 +00:00
|
|
|
'options' => 'IGNORE',
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"INSERT IGNORE INTO table " .
|
|
|
|
|
"(field,field2) " .
|
|
|
|
|
"VALUES ('text','2')"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'table' => 'table',
|
2016-02-17 09:09:32 +00:00
|
|
|
'rows' => [
|
|
|
|
|
[ 'field' => 'text', 'field2' => 2 ],
|
|
|
|
|
[ 'field' => 'multi', 'field2' => 3 ],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
'options' => 'IGNORE',
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"INSERT IGNORE INTO table " .
|
|
|
|
|
"(field,field2) " .
|
|
|
|
|
"VALUES " .
|
2013-04-26 12:00:22 +00:00
|
|
|
"('text','2')," .
|
|
|
|
|
"('multi','3')"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
];
|
2013-04-13 14:40:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider provideInsertSelect
|
2013-10-18 10:36:09 +00:00
|
|
|
* @covers DatabaseBase::insertSelect
|
2013-04-13 14:40:04 +00:00
|
|
|
*/
|
2016-08-27 17:10:46 +00:00
|
|
|
public function testInsertSelect( $sql, $sqlTextNative, $sqlSelect, $sqlInsert ) {
|
2013-04-13 14:40:04 +00:00
|
|
|
$this->database->insertSelect(
|
|
|
|
|
$sql['destTable'],
|
|
|
|
|
$sql['srcTable'],
|
|
|
|
|
$sql['varMap'],
|
|
|
|
|
$sql['conds'],
|
|
|
|
|
__METHOD__,
|
2016-02-17 09:09:32 +00:00
|
|
|
isset( $sql['insertOptions'] ) ? $sql['insertOptions'] : [],
|
|
|
|
|
isset( $sql['selectOptions'] ) ? $sql['selectOptions'] : []
|
2013-04-13 14:40:04 +00:00
|
|
|
);
|
2016-08-27 17:10:46 +00:00
|
|
|
$this->assertLastSql( $sqlTextNative );
|
|
|
|
|
|
|
|
|
|
$dbWeb = new DatabaseTestHelper( __CLASS__, [ 'cliMode' => false ] );
|
|
|
|
|
$dbWeb->forceNextResult( [
|
|
|
|
|
array_flip( array_keys( $sql['varMap'] ) )
|
|
|
|
|
] );
|
|
|
|
|
$dbWeb->insertSelect(
|
|
|
|
|
$sql['destTable'],
|
|
|
|
|
$sql['srcTable'],
|
|
|
|
|
$sql['varMap'],
|
|
|
|
|
$sql['conds'],
|
|
|
|
|
__METHOD__,
|
|
|
|
|
isset( $sql['insertOptions'] ) ? $sql['insertOptions'] : [],
|
|
|
|
|
isset( $sql['selectOptions'] ) ? $sql['selectOptions'] : []
|
|
|
|
|
);
|
|
|
|
|
$this->assertLastSqlDb( implode( '; ', [ $sqlSelect, $sqlInsert ] ), $dbWeb );
|
2013-04-13 14:40:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function provideInsertSelect() {
|
2016-02-17 09:09:32 +00:00
|
|
|
return [
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'destTable' => 'insert_table',
|
|
|
|
|
'srcTable' => 'select_table',
|
2016-02-17 09:09:32 +00:00
|
|
|
'varMap' => [ 'field_insert' => 'field_select', 'field' => 'field2' ],
|
2013-04-13 14:40:04 +00:00
|
|
|
'conds' => '*',
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"INSERT INTO insert_table " .
|
|
|
|
|
"(field_insert,field) " .
|
|
|
|
|
"SELECT field_select,field2 " .
|
2016-08-27 17:10:46 +00:00
|
|
|
"FROM select_table",
|
|
|
|
|
"SELECT field_select AS field_insert,field2 AS field " .
|
|
|
|
|
"FROM select_table WHERE * FOR UPDATE",
|
|
|
|
|
"INSERT INTO insert_table (field_insert,field) VALUES ('0','1')"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'destTable' => 'insert_table',
|
|
|
|
|
'srcTable' => 'select_table',
|
2016-02-17 09:09:32 +00:00
|
|
|
'varMap' => [ 'field_insert' => 'field_select', 'field' => 'field2' ],
|
|
|
|
|
'conds' => [ 'field' => 2 ],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"INSERT INTO insert_table " .
|
|
|
|
|
"(field_insert,field) " .
|
|
|
|
|
"SELECT field_select,field2 " .
|
2013-04-26 12:00:22 +00:00
|
|
|
"FROM select_table " .
|
2016-08-27 17:10:46 +00:00
|
|
|
"WHERE field = '2'",
|
|
|
|
|
"SELECT field_select AS field_insert,field2 AS field FROM " .
|
|
|
|
|
"select_table WHERE field = '2' FOR UPDATE",
|
|
|
|
|
"INSERT INTO insert_table (field_insert,field) VALUES ('0','1')"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'destTable' => 'insert_table',
|
|
|
|
|
'srcTable' => 'select_table',
|
2016-02-17 09:09:32 +00:00
|
|
|
'varMap' => [ 'field_insert' => 'field_select', 'field' => 'field2' ],
|
|
|
|
|
'conds' => [ 'field' => 2 ],
|
2013-04-13 14:40:04 +00:00
|
|
|
'insertOptions' => 'IGNORE',
|
2016-02-17 09:09:32 +00:00
|
|
|
'selectOptions' => [ 'ORDER BY' => 'field' ],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"INSERT IGNORE INTO insert_table " .
|
|
|
|
|
"(field_insert,field) " .
|
|
|
|
|
"SELECT field_select,field2 " .
|
2013-04-26 12:00:22 +00:00
|
|
|
"FROM select_table " .
|
|
|
|
|
"WHERE field = '2' " .
|
2016-08-27 17:10:46 +00:00
|
|
|
"ORDER BY field",
|
|
|
|
|
"SELECT field_select AS field_insert,field2 AS field " .
|
|
|
|
|
"FROM select_table WHERE field = '2' ORDER BY field FOR UPDATE",
|
|
|
|
|
"INSERT IGNORE INTO insert_table (field_insert,field) VALUES ('0','1')"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
];
|
2013-04-13 14:40:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider provideReplace
|
2013-10-18 10:36:09 +00:00
|
|
|
* @covers DatabaseBase::replace
|
2013-04-13 14:40:04 +00:00
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
public function testReplace( $sql, $sqlText ) {
|
2013-04-13 14:40:04 +00:00
|
|
|
$this->database->replace(
|
|
|
|
|
$sql['table'],
|
|
|
|
|
$sql['uniqueIndexes'],
|
|
|
|
|
$sql['rows'],
|
|
|
|
|
__METHOD__
|
|
|
|
|
);
|
|
|
|
|
$this->assertLastSql( $sqlText );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function provideReplace() {
|
2016-02-17 09:09:32 +00:00
|
|
|
return [
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'table' => 'replace_table',
|
2016-02-17 09:09:32 +00:00
|
|
|
'uniqueIndexes' => [ 'field' ],
|
|
|
|
|
'rows' => [ 'field' => 'text', 'field2' => 'text2' ],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"DELETE FROM replace_table " .
|
|
|
|
|
"WHERE ( field='text' ); " .
|
|
|
|
|
"INSERT INTO replace_table " .
|
2013-04-26 12:00:22 +00:00
|
|
|
"(field,field2) " .
|
|
|
|
|
"VALUES ('text','text2')"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'table' => 'module_deps',
|
2016-02-17 09:09:32 +00:00
|
|
|
'uniqueIndexes' => [ [ 'md_module', 'md_skin' ] ],
|
|
|
|
|
'rows' => [
|
2013-04-13 14:40:04 +00:00
|
|
|
'md_module' => 'module',
|
|
|
|
|
'md_skin' => 'skin',
|
|
|
|
|
'md_deps' => 'deps',
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"DELETE FROM module_deps " .
|
|
|
|
|
"WHERE ( md_module='module' AND md_skin='skin' ); " .
|
|
|
|
|
"INSERT INTO module_deps " .
|
2013-04-26 12:00:22 +00:00
|
|
|
"(md_module,md_skin,md_deps) " .
|
|
|
|
|
"VALUES ('module','skin','deps')"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'table' => 'module_deps',
|
2016-02-17 09:09:32 +00:00
|
|
|
'uniqueIndexes' => [ [ 'md_module', 'md_skin' ] ],
|
|
|
|
|
'rows' => [
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'md_module' => 'module',
|
|
|
|
|
'md_skin' => 'skin',
|
|
|
|
|
'md_deps' => 'deps',
|
2016-02-17 09:09:32 +00:00
|
|
|
], [
|
2013-04-13 14:40:04 +00:00
|
|
|
'md_module' => 'module2',
|
|
|
|
|
'md_skin' => 'skin2',
|
|
|
|
|
'md_deps' => 'deps2',
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"DELETE FROM module_deps " .
|
|
|
|
|
"WHERE ( md_module='module' AND md_skin='skin' ); " .
|
|
|
|
|
"INSERT INTO module_deps " .
|
2013-04-26 12:00:22 +00:00
|
|
|
"(md_module,md_skin,md_deps) " .
|
|
|
|
|
"VALUES ('module','skin','deps'); " .
|
|
|
|
|
"DELETE FROM module_deps " .
|
2013-04-13 14:40:04 +00:00
|
|
|
"WHERE ( md_module='module2' AND md_skin='skin2' ); " .
|
|
|
|
|
"INSERT INTO module_deps " .
|
2013-04-26 12:00:22 +00:00
|
|
|
"(md_module,md_skin,md_deps) " .
|
|
|
|
|
"VALUES ('module2','skin2','deps2')"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'table' => 'module_deps',
|
2016-02-17 09:09:32 +00:00
|
|
|
'uniqueIndexes' => [ 'md_module', 'md_skin' ],
|
|
|
|
|
'rows' => [
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'md_module' => 'module',
|
|
|
|
|
'md_skin' => 'skin',
|
|
|
|
|
'md_deps' => 'deps',
|
2016-02-17 09:09:32 +00:00
|
|
|
], [
|
2013-04-13 14:40:04 +00:00
|
|
|
'md_module' => 'module2',
|
|
|
|
|
'md_skin' => 'skin2',
|
|
|
|
|
'md_deps' => 'deps2',
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"DELETE FROM module_deps " .
|
|
|
|
|
"WHERE ( md_module='module' ) OR ( md_skin='skin' ); " .
|
|
|
|
|
"INSERT INTO module_deps " .
|
2013-04-26 12:00:22 +00:00
|
|
|
"(md_module,md_skin,md_deps) " .
|
|
|
|
|
"VALUES ('module','skin','deps'); " .
|
|
|
|
|
"DELETE FROM module_deps " .
|
2013-04-13 14:40:04 +00:00
|
|
|
"WHERE ( md_module='module2' ) OR ( md_skin='skin2' ); " .
|
|
|
|
|
"INSERT INTO module_deps " .
|
2013-04-26 12:00:22 +00:00
|
|
|
"(md_module,md_skin,md_deps) " .
|
|
|
|
|
"VALUES ('module2','skin2','deps2')"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'table' => 'module_deps',
|
2016-02-17 09:09:32 +00:00
|
|
|
'uniqueIndexes' => [],
|
|
|
|
|
'rows' => [
|
2013-04-13 14:40:04 +00:00
|
|
|
'md_module' => 'module',
|
|
|
|
|
'md_skin' => 'skin',
|
|
|
|
|
'md_deps' => 'deps',
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"INSERT INTO module_deps " .
|
|
|
|
|
"(md_module,md_skin,md_deps) " .
|
|
|
|
|
"VALUES ('module','skin','deps')"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
];
|
2013-04-13 14:40:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider provideNativeReplace
|
2013-10-18 10:36:09 +00:00
|
|
|
* @covers DatabaseBase::nativeReplace
|
2013-04-13 14:40:04 +00:00
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
public function testNativeReplace( $sql, $sqlText ) {
|
2013-04-13 14:40:04 +00:00
|
|
|
$this->database->nativeReplace(
|
|
|
|
|
$sql['table'],
|
|
|
|
|
$sql['rows'],
|
|
|
|
|
__METHOD__
|
|
|
|
|
);
|
|
|
|
|
$this->assertLastSql( $sqlText );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function provideNativeReplace() {
|
2016-02-17 09:09:32 +00:00
|
|
|
return [
|
|
|
|
|
[
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'table' => 'replace_table',
|
2016-02-17 09:09:32 +00:00
|
|
|
'rows' => [ 'field' => 'text', 'field2' => 'text2' ],
|
|
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"REPLACE INTO replace_table " .
|
|
|
|
|
"(field,field2) " .
|
|
|
|
|
"VALUES ('text','text2')"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
];
|
2012-08-15 13:16:09 +00:00
|
|
|
}
|
2012-08-25 18:24:59 +00:00
|
|
|
|
|
|
|
|
/**
|
2012-10-08 10:56:20 +00:00
|
|
|
* @dataProvider provideConditional
|
2013-10-18 10:36:09 +00:00
|
|
|
* @covers DatabaseBase::conditional
|
2012-08-25 18:24:59 +00:00
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
public function testConditional( $sql, $sqlText ) {
|
2013-04-13 14:40:04 +00:00
|
|
|
$this->assertEquals( trim( $this->database->conditional(
|
2012-08-25 18:24:59 +00:00
|
|
|
$sql['conds'],
|
|
|
|
|
$sql['true'],
|
|
|
|
|
$sql['false']
|
|
|
|
|
) ), $sqlText );
|
|
|
|
|
}
|
|
|
|
|
|
2012-10-08 10:56:20 +00:00
|
|
|
public static function provideConditional() {
|
2016-02-17 09:09:32 +00:00
|
|
|
return [
|
|
|
|
|
[
|
|
|
|
|
[
|
|
|
|
|
'conds' => [ 'field' => 'text' ],
|
2012-08-25 18:24:59 +00:00
|
|
|
'true' => 1,
|
|
|
|
|
'false' => 'NULL',
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
2012-08-25 18:24:59 +00:00
|
|
|
"(CASE WHEN field = 'text' THEN 1 ELSE NULL END)"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
|
|
|
|
'conds' => [ 'field' => 'text', 'field2' => 'anothertext' ],
|
2012-08-31 18:12:19 +00:00
|
|
|
'true' => 1,
|
|
|
|
|
'false' => 'NULL',
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
2012-08-31 18:12:19 +00:00
|
|
|
"(CASE WHEN field = 'text' AND field2 = 'anothertext' THEN 1 ELSE NULL END)"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
2012-08-25 18:24:59 +00:00
|
|
|
'conds' => 'field=1',
|
|
|
|
|
'true' => 1,
|
|
|
|
|
'false' => 'NULL',
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
2012-08-25 18:24:59 +00:00
|
|
|
"(CASE WHEN field=1 THEN 1 ELSE NULL END)"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
];
|
2012-08-25 18:24:59 +00:00
|
|
|
}
|
2013-04-13 14:40:04 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider provideBuildConcat
|
2013-10-18 10:36:09 +00:00
|
|
|
* @covers DatabaseBase::buildConcat
|
2013-04-13 14:40:04 +00:00
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
public function testBuildConcat( $stringList, $sqlText ) {
|
2013-04-13 14:40:04 +00:00
|
|
|
$this->assertEquals( trim( $this->database->buildConcat(
|
|
|
|
|
$stringList
|
|
|
|
|
) ), $sqlText );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function provideBuildConcat() {
|
2016-02-17 09:09:32 +00:00
|
|
|
return [
|
|
|
|
|
[
|
|
|
|
|
[ 'field', 'field2' ],
|
2013-04-13 14:40:04 +00:00
|
|
|
"CONCAT(field,field2)"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[ "'test'", 'field2' ],
|
2013-04-13 14:40:04 +00:00
|
|
|
"CONCAT('test',field2)"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
];
|
2013-04-13 14:40:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider provideBuildLike
|
2013-10-18 10:36:09 +00:00
|
|
|
* @covers DatabaseBase::buildLike
|
2013-04-13 14:40:04 +00:00
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
public function testBuildLike( $array, $sqlText ) {
|
2013-04-13 14:40:04 +00:00
|
|
|
$this->assertEquals( trim( $this->database->buildLike(
|
|
|
|
|
$array
|
|
|
|
|
) ), $sqlText );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function provideBuildLike() {
|
2016-02-17 09:09:32 +00:00
|
|
|
return [
|
|
|
|
|
[
|
2013-04-13 14:40:04 +00:00
|
|
|
'text',
|
|
|
|
|
"LIKE 'text'"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[ 'text', new LikeMatch( '%' ) ],
|
2013-04-13 14:40:04 +00:00
|
|
|
"LIKE 'text%'"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[ 'text', new LikeMatch( '%' ), 'text2' ],
|
2013-04-13 14:40:04 +00:00
|
|
|
"LIKE 'text%text2'"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[ 'text', new LikeMatch( '_' ) ],
|
2013-04-13 14:40:04 +00:00
|
|
|
"LIKE 'text_'"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
];
|
2013-04-13 14:40:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider provideUnionQueries
|
2013-10-18 10:36:09 +00:00
|
|
|
* @covers DatabaseBase::unionQueries
|
2013-04-13 14:40:04 +00:00
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
public function testUnionQueries( $sql, $sqlText ) {
|
2013-04-13 14:40:04 +00:00
|
|
|
$this->assertEquals( trim( $this->database->unionQueries(
|
|
|
|
|
$sql['sqls'],
|
|
|
|
|
$sql['all']
|
|
|
|
|
) ), $sqlText );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function provideUnionQueries() {
|
2016-02-17 09:09:32 +00:00
|
|
|
return [
|
|
|
|
|
[
|
|
|
|
|
[
|
|
|
|
|
'sqls' => [ 'RAW SQL', 'RAW2SQL' ],
|
2013-04-13 14:40:04 +00:00
|
|
|
'all' => true,
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"(RAW SQL) UNION ALL (RAW2SQL)"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
|
|
|
|
'sqls' => [ 'RAW SQL', 'RAW2SQL' ],
|
2013-04-13 14:40:04 +00:00
|
|
|
'all' => false,
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"(RAW SQL) UNION (RAW2SQL)"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[
|
|
|
|
|
'sqls' => [ 'RAW SQL', 'RAW2SQL', 'RAW3SQL' ],
|
2013-04-13 14:40:04 +00:00
|
|
|
'all' => false,
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
2013-04-13 14:40:04 +00:00
|
|
|
"(RAW SQL) UNION (RAW2SQL) UNION (RAW3SQL)"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
];
|
2013-04-13 14:40:04 +00:00
|
|
|
}
|
|
|
|
|
|
2013-10-18 10:36:09 +00:00
|
|
|
/**
|
|
|
|
|
* @covers DatabaseBase::commit
|
|
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
public function testTransactionCommit() {
|
2013-04-13 14:40:04 +00:00
|
|
|
$this->database->begin( __METHOD__ );
|
|
|
|
|
$this->database->commit( __METHOD__ );
|
|
|
|
|
$this->assertLastSql( 'BEGIN; COMMIT' );
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-18 10:36:09 +00:00
|
|
|
/**
|
|
|
|
|
* @covers DatabaseBase::rollback
|
|
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
public function testTransactionRollback() {
|
2013-04-13 14:40:04 +00:00
|
|
|
$this->database->begin( __METHOD__ );
|
|
|
|
|
$this->database->rollback( __METHOD__ );
|
|
|
|
|
$this->assertLastSql( 'BEGIN; ROLLBACK' );
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-18 10:36:09 +00:00
|
|
|
/**
|
|
|
|
|
* @covers DatabaseBase::dropTable
|
|
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
public function testDropTable() {
|
2016-02-17 09:09:32 +00:00
|
|
|
$this->database->setExistingTables( [ 'table' ] );
|
2013-04-13 14:40:04 +00:00
|
|
|
$this->database->dropTable( 'table', __METHOD__ );
|
|
|
|
|
$this->assertLastSql( 'DROP TABLE table' );
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-18 10:36:09 +00:00
|
|
|
/**
|
|
|
|
|
* @covers DatabaseBase::dropTable
|
|
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
public function testDropNonExistingTable() {
|
2013-04-13 14:40:04 +00:00
|
|
|
$this->assertFalse(
|
|
|
|
|
$this->database->dropTable( 'non_existing', __METHOD__ )
|
|
|
|
|
);
|
|
|
|
|
}
|
2014-12-29 20:00:02 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider provideMakeList
|
|
|
|
|
* @covers DatabaseBase::makeList
|
|
|
|
|
*/
|
|
|
|
|
public function testMakeList( $list, $mode, $sqlText ) {
|
|
|
|
|
$this->assertEquals( trim( $this->database->makeList(
|
|
|
|
|
$list, $mode
|
|
|
|
|
) ), $sqlText );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function provideMakeList() {
|
2016-02-17 09:09:32 +00:00
|
|
|
return [
|
|
|
|
|
[
|
|
|
|
|
[ 'value', 'value2' ],
|
2014-12-29 20:00:02 +00:00
|
|
|
LIST_COMMA,
|
|
|
|
|
"'value','value2'"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[ 'field', 'field2' ],
|
2014-12-29 20:00:02 +00:00
|
|
|
LIST_NAMES,
|
|
|
|
|
"field,field2"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[ 'field' => 'value', 'field2' => 'value2' ],
|
2014-12-29 20:00:02 +00:00
|
|
|
LIST_AND,
|
|
|
|
|
"field = 'value' AND field2 = 'value2'"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[ 'field' => null, "field2 != 'value2'" ],
|
2014-12-29 20:00:02 +00:00
|
|
|
LIST_AND,
|
|
|
|
|
"field IS NULL AND (field2 != 'value2')"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[ 'field' => [ 'value', null, 'value2' ], 'field2' => 'value2' ],
|
2014-12-23 21:34:36 +00:00
|
|
|
LIST_AND,
|
|
|
|
|
"(field IN ('value','value2') OR field IS NULL) AND field2 = 'value2'"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[ 'field' => [ null ], 'field2' => null ],
|
2014-12-23 21:34:36 +00:00
|
|
|
LIST_AND,
|
|
|
|
|
"field IS NULL AND field2 IS NULL"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[ 'field' => 'value', 'field2' => 'value2' ],
|
2014-12-29 20:00:02 +00:00
|
|
|
LIST_OR,
|
|
|
|
|
"field = 'value' OR field2 = 'value2'"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[ 'field' => 'value', 'field2' => null ],
|
2014-12-29 20:00:02 +00:00
|
|
|
LIST_OR,
|
|
|
|
|
"field = 'value' OR field2 IS NULL"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[ 'field' => [ 'value', 'value2' ], 'field2' => [ 'value' ] ],
|
2014-12-29 20:00:02 +00:00
|
|
|
LIST_OR,
|
|
|
|
|
"field IN ('value','value2') OR field2 = 'value'"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[ 'field' => [ null, 'value', null, 'value2' ], "field2 != 'value2'" ],
|
2014-12-23 21:34:36 +00:00
|
|
|
LIST_OR,
|
|
|
|
|
"(field IN ('value','value2') OR field IS NULL) OR (field2 != 'value2')"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[ 'field' => 'value', 'field2' => 'value2' ],
|
2014-12-29 20:00:02 +00:00
|
|
|
LIST_SET,
|
|
|
|
|
"field = 'value',field2 = 'value2'"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[ 'field' => 'value', 'field2' => null ],
|
2014-12-29 20:00:02 +00:00
|
|
|
LIST_SET,
|
|
|
|
|
"field = 'value',field2 = NULL"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
[ 'field' => 'value', "field2 != 'value2'" ],
|
2014-12-29 20:00:02 +00:00
|
|
|
LIST_SET,
|
|
|
|
|
"field = 'value',field2 != 'value2'"
|
2016-02-17 09:09:32 +00:00
|
|
|
],
|
|
|
|
|
];
|
2014-12-29 20:00:02 +00:00
|
|
|
}
|
2013-01-28 10:27:15 +00:00
|
|
|
}
|