///////////////////////////////////////////////////////////////
 * 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.
///////////////////////////////////////////////////////////////

[[extension-indexing-sql-tests,SQL Index/Query Tests]]
= SQL Index/Query Tests =

This file describes how to setup databases for unit testing.

== PostgreSQL ==

- Install PostgreSQL
- Connect to PostgreSQL to the default database as a superuser
- Create a database named 'jdbc_test_db'

    CREATE DATABASE jdbc_test_db;

- Create a jdbc_test_login user with 'password' as password

    CREATE USER jdbc_test_login WITH PASSWORD 'password';

- Give the user all privileges on the database

    GRANT ALL ON DATABASE jdbc_test_db TO jdbc_test_login;

- Disconnect and reconnect to the jdbc_test_db as a superuser
- Activate ltree extension on the created database

    CREATE EXTENSION ltree;


== MySQL ==

    TODO
