From e8686d9dad6522b30c2aeafb0e6e8dbe91cfb8db Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 15 Nov 2011 22:14:28 +0100 Subject: [PATCH 1/2] [ticket/10296] Add unit test for CROSS JOIN with INNER JOIN PHPBB3-10296 --- tests/dbal/cross_join_test.php | 55 ++++++++++++++++++++++ tests/dbal/fixtures/massmail_crossjoin.xml | 43 +++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 tests/dbal/cross_join_test.php create mode 100644 tests/dbal/fixtures/massmail_crossjoin.xml diff --git a/tests/dbal/cross_join_test.php b/tests/dbal/cross_join_test.php new file mode 100644 index 0000000000..7110c7a2ea --- /dev/null +++ b/tests/dbal/cross_join_test.php @@ -0,0 +1,55 @@ +createXMLDataSet(dirname(__FILE__).'/fixtures/massmail_crossjoin.xml'); + } + + public function test_cross_join() + { + $db = $this->new_dbal(); + + // http://tracker.phpbb.com/browse/PHPBB3-10296 + // Test CROSS JOIN with INNER JOIN + // Failed on Postgres, MSSQL and Oracle + $db->sql_return_on_error(true); + + $sql_ary = array( + 'SELECT' => 'u.username', + 'FROM' => array( + 'phpbb_users' => 'u', + 'phpbb_user_group' => 'ug', + ), + 'LEFT_JOIN' => array( + array( + 'FROM' => array( + 'phpbb_banlist' => 'b', + ), + 'ON' => 'u.user_id = b.ban_userid', + ), + ), + 'WHERE' => 'ug.group_id = 1 + AND u.user_id = ug.user_id + AND b.ban_id IS NULL', + 'ORDER_BY' => 'u.username', + ); + $sql = $db->sql_build_query('SELECT', $sql_ary); + $result = $db->sql_query($sql); + + $db->sql_return_on_error(false); + + $this->assertEquals(array(array('username' => 'mass email')), $db->sql_fetchrowset($result)); + } +} diff --git a/tests/dbal/fixtures/massmail_crossjoin.xml b/tests/dbal/fixtures/massmail_crossjoin.xml new file mode 100644 index 0000000000..801205eb81 --- /dev/null +++ b/tests/dbal/fixtures/massmail_crossjoin.xml @@ -0,0 +1,43 @@ + + + + ban_id + ban_userid + + 1 + 2 + +
+ + user_id + username + username_clean + + 1 + mass email + mass email + + + 2 + banned + banned + + + 3 + not in group + not in group + +
+ + user_id + group_id + + 1 + 1 + + + 2 + 1 + +
+
From 3d893c8222646e95aeae0301d954cfe62aa8486a Mon Sep 17 00:00:00 2001 From: dmauri Date: Tue, 15 Nov 2011 22:19:45 +0100 Subject: [PATCH 2/2] [ticket/10296] Fix CROSS JOIN with INNER JOIN on MSSQL, Postgres and Oracle PHPBB3-10296 --- phpBB/includes/db/dbal.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/includes/db/dbal.php b/phpBB/includes/db/dbal.php index 9b45c085a2..b4c1a72e1c 100644 --- a/phpBB/includes/db/dbal.php +++ b/phpBB/includes/db/dbal.php @@ -609,7 +609,7 @@ class dbal } } - $sql .= $this->_sql_custom_build('FROM', implode(', ', $table_array)); + $sql .= $this->_sql_custom_build('FROM', implode(' CROSS JOIN ', $table_array)); if (!empty($array['LEFT_JOIN'])) {