Anomie has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/394140 )

Change subject: Database: Fix degenerate parenthesized joins
......................................................................

Database: Fix degenerate parenthesized joins

The SQL standard supports parenthesized joins like

    a JOIN (b JOIN c ON (...)) ON (...)

But it doesn't support parenthesizing a single table name, i.e. a
one-table "join", like

    a JOIN (b) ON (...)

Detect the degenerate single-table case and omit the parentheses.

Bug: T181674
Change-Id: I82cacd80465092aa67ff19bdcfd6682001bf12ab
---
M includes/libs/rdbms/database/Database.php
M tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php
2 files changed, 20 insertions(+), 3 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core 
refs/changes/40/394140/1

diff --git a/includes/libs/rdbms/database/Database.php 
b/includes/libs/rdbms/database/Database.php
index e04566e..b936779 100644
--- a/includes/libs/rdbms/database/Database.php
+++ b/includes/libs/rdbms/database/Database.php
@@ -2019,9 +2019,19 @@
 
                        if ( is_array( $table ) ) {
                                // A parenthesized group
-                               $joinedTable = '('
-                                       . 
$this->tableNamesWithIndexClauseOrJOIN( $table, $use_index, $ignore_index, 
$join_conds )
-                                       . ')';
+                               if ( count( $table ) > 1 ) {
+                                       $joinedTable = '('
+                                               . 
$this->tableNamesWithIndexClauseOrJOIN( $table, $use_index, $ignore_index, 
$join_conds )
+                                               . ')';
+                               } else {
+                                       // Degenerate case
+                                       $innerTable = reset( $table );
+                                       $innerAlias = key( $table );
+                                       $joinedTable = 
$this->tableNameWithAlias(
+                                               $innerTable,
+                                               is_string( $innerAlias ) ? 
$innerAlias : $innerTable
+                                       );
+                               }
                        } else {
                                $joinedTable = $this->tableNameWithAlias( 
$table, $alias );
                        }
diff --git a/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php 
b/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php
index ee7ad2f..7933f19 100644
--- a/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php
+++ b/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php
@@ -120,6 +120,13 @@
                                ],
                                'table1 LEFT JOIN (table2 JOIN table3 ON 
((t2_id = t3_id))) ON ((t1_id = t2_id))'
                        ],
+                       'join with degenerate parenthesized group' => [
+                               [ 'table1', 'n' => [ 't2' => 'table2' ] ],
+                               [
+                                       'n' => [ 'LEFT JOIN', 't1_id = t2_id' ],
+                               ],
+                               'table1 LEFT JOIN table2 t2 ON ((t1_id = 
t2_id))'
+                       ],
                ];
        }
 

-- 
To view, visit https://gerrit.wikimedia.org/r/394140
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I82cacd80465092aa67ff19bdcfd6682001bf12ab
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Anomie <bjor...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to