Merge "Fix Postgres support"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 14 Jun 2017 08:19:53 +0000 (08:19 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 14 Jun 2017 08:19:53 +0000 (08:19 +0000)
1  2 
includes/libs/rdbms/database/DatabasePostgres.php

@@@ -105,10 -105,7 +105,10 @@@ class DatabasePostgres extends Databas
                $this->mDBname = $dbName;
  
                $connectVars = [
 -                      'dbname' => $dbName,
 +                      // pg_connect() user $user as the default database. Since a database is *required*,
 +                      // at least pick a "don't care" database that is more likely to exist. This case
 +                      // arrises when LoadBalancer::getConnection( $i, [], '' ) is used.
 +                      'dbname' => strlen( $dbName ) ? $dbName : 'postgres',
                        'user' => $user,
                        'password' => $password
                ];
                return $this->mConn;
        }
  
 +      public function databasesAreIndependent() {
 +              return true;
 +      }
 +
        /**
         * Postgres doesn't support selectDB in the same way MySQL does. So if the
         * DB name doesn't match the open connection, open a new one
         * @param string $db
         * @return bool
 +       * @throws DBUnexpectedError
         */
        public function selectDB( $db ) {
                if ( $this->mDBname !== $db ) {
@@@ -681,13 -673,14 +681,13 @@@ __INDEXATTR__
         * @param string $fname
         * @param array $insertOptions
         * @param array $selectOptions
 +       * @param array $selectJoinConds
         * @return bool
         */
        public function nativeInsertSelect(
                $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
 -              $insertOptions = [], $selectOptions = []
 +              $insertOptions = [], $selectOptions = [], $selectJoinConds = []
        ) {
 -              $destTable = $this->tableName( $destTable );
 -
                if ( !is_array( $insertOptions ) ) {
                        $insertOptions = [ $insertOptions ];
                }
                        $savepoint->savepoint();
                }
  
 -              if ( !is_array( $selectOptions ) ) {
 -                      $selectOptions = [ $selectOptions ];
 -              }
 -              list( $startOpts, $useIndex, $tailOpts, $ignoreIndex ) =
 -                      $this->makeSelectOptions( $selectOptions );
 -              if ( is_array( $srcTable ) ) {
 -                      $srcTable = implode( ',', array_map( [ $this, 'tableName' ], $srcTable ) );
 -              } else {
 -                      $srcTable = $this->tableName( $srcTable );
 -              }
 -
 -              $sql = "INSERT INTO $destTable (" . implode( ',', array_keys( $varMap ) ) . ')' .
 -                      " SELECT $startOpts " . implode( ',', $varMap ) .
 -                      " FROM $srcTable $useIndex $ignoreIndex ";
 -
 -              if ( $conds != '*' ) {
 -                      $sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
 -              }
 -
 -              $sql .= " $tailOpts";
 +              $res = parent::nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname,
 +                      $insertOptions, $selectOptions, $selectJoinConds );
  
 -              $res = (bool)$this->query( $sql, $fname, $savepoint );
                if ( $savepoint ) {
                        $bar = pg_result_error( $this->mLastResult );
                        if ( $bar != false ) {
                $safeseq = str_replace( "'", "''", $seqName );
                $res = $this->query( "SELECT nextval('$safeseq')" );
                $row = $this->fetchRow( $res );
 -              $this->mInsertId = $row[0];
 +              $this->mInsertId = is_null( $row[0] ) ? null : (int)$row[0];
  
                return $this->mInsertId;
        }
                $oldName = $this->addIdentifierQuotes( $oldName );
  
                return $this->query( 'CREATE ' . ( $temporary ? 'TEMPORARY ' : '' ) . " TABLE $newName " .
 -                      "(LIKE $oldName INCLUDING DEFAULTS)", $fname );
 +                      "(LIKE $oldName INCLUDING DEFAULTS INCLUDING INDEXES)", $fname );
        }
  
        public function listTables( $prefix = null, $fname = __METHOD__ ) {
                if ( $schema === false ) {
                        $schema = $this->getCoreSchema();
                }
+               $table = $this->realTableName( $table, 'raw' );
                $etable = $this->addQuotes( $table );
                $eschema = $this->addQuotes( $schema );
                $sql = "SELECT 1 FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n "