# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.


# The purpose of this module is to unify a place to settle DB differences in addition to
# differences based on DB API2 libraries (like Impyla vs. psycopg2). Putting the
# handling in a single place will make it easier to track what workarounds exist.

from tests.comparison import db_connection


def setup_ref_database(ref_conn):
  """Set up reference database at query generator runtime.

  Because data_generator.py runs are expensive operations, and reference databases tend
  to persist across runs, this method should support lightweight options to configure
  reference databases as needed, regardless of whether the data is loaded or not. A good
  example is loading optional PostgreSQL modules to support comparison with functions
  added to Impala.

  ref_conn: Open db_connection.DbConnection object. Method assumes no open cursors on
  open connection object. Method will close any cursors opened, and leave connection
  open.
  """

  if ref_conn.db_type == db_connection.POSTGRESQL:
    # IMPALA-7759: The Levenshtein function needs the fuzzystrmatch extension.
    # References:
    # https://www.postgresql.org/docs/9.5/fuzzystrmatch.html
    # https://www.postgresql.org/docs/9.5/sql-createextension.html
    # On Ubuntu 16, postgresql-contrib-9.5 provides fuzzystrmatch and is installed as
    # part of Impala's bin/bootstrap_system.sh.
    with ref_conn.cursor() as cursor:
      cursor.execute('CREATE EXTENSION IF NOT EXISTS fuzzystrmatch')
