mirror of
https://github.com/apache/impala.git
synced 2026-01-06 15:01:43 -05:00
The random query generator needs to compare against PostgresQL 9.5 or higher to take advantage of some of the more recent features, especially as it pertains to Impala/Kudu INSERT and UPSERT queries. Developers will need assistance setting up their development environments if they need to use the random query generator. This patch provides instructions on how to do so. We provide instructions, not automation, since this will have side-effects on developers' workstations: we can't presume to know how a developer might want to install or configure postgres, and we haven't tested on anything except our own development environment. Change-Id: I1e3b510120451fcb5af97145fa47ccb4c53f00d9 Reviewed-on: http://gerrit.cloudera.org:8080/4846 Reviewed-by: Alex Behm <alex.behm@cloudera.com> Tested-by: Tim Armstrong <tarmstrong@cloudera.com>
122 lines
4.3 KiB
Plaintext
122 lines
4.3 KiB
Plaintext
Purpose:
|
|
|
|
This package is intended to augment the standard test suite. The standard tests are
|
|
more efficient with regards to features tested versus execution time. However their
|
|
coverage as a test suite still leaves gaps in query coverage. This package provides a
|
|
random query generator to compare the results of a wide range of queries against a
|
|
reference database engine. The queries will range from very simple single table selects to
|
|
extremely complicated with multiple level of nesting. This method of testing will be
|
|
slower but has a larger coverage area.
|
|
|
|
|
|
Requirements:
|
|
|
|
1) It's assumed that Impala is running locally.
|
|
|
|
2) Impyla -- an implementation of DB API 2 for Impala.
|
|
|
|
sudo pip install impyla
|
|
|
|
3) At least one python driver for a reference database.
|
|
|
|
sudo apt-get install python-mysqldb
|
|
sudo apt-get install python-psycopg2 # Postgresql
|
|
|
|
For Impala/Kudu CRUD random query generation and comparison, please see
|
|
the supplemental POSTGRES.txt on setting up PostgresQL 9.5 or higher as
|
|
a reference database.
|
|
|
|
Please see the supplemental ORACLE.txt on setting up Oracle as a reference
|
|
database.
|
|
|
|
|
|
Usage:
|
|
|
|
1) Generate test data
|
|
|
|
./data_generator.py --use-postgresql
|
|
|
|
This will generate tables and data in Postgresql and Impala
|
|
|
|
|
|
2) Run the comparison
|
|
|
|
./discrepancy_searcher.py
|
|
|
|
This will generate queries using the test database and compare the results against
|
|
Postgresql (the default).
|
|
|
|
|
|
Things to Know:
|
|
|
|
1) A good number of queries to run seems to be about 5k. Ideally each test run would
|
|
discover the complete list of known issues. From experience a 1k query test run may
|
|
complete without finding any issues that were discovered in previous runs. 5k seems
|
|
to be about the magic number were most issues will be rediscovered. This can take 1-2
|
|
hours. However as of this writing it's rare to run 1k queries without finding at
|
|
least one discrepancy.
|
|
|
|
2) It's possible to provide a randomization seed so that the randomness is actually
|
|
reproducible. The data generation currently has a default seed so will always produce
|
|
the same tables. This also mean if a new data type is added those generated tables
|
|
will change.
|
|
|
|
3) There is a query log. It's possible that a sequence of queries is required to expose
|
|
a bug. If you come across a failure that can't be reproduced by rerunning the failed
|
|
query, try running the queries leading up to that query as well.
|
|
|
|
|
|
Miscellaneous:
|
|
|
|
1) Instead of generating new random queries with each run, it may be better to reuse a
|
|
list of queries from a previous run that are known to produce results. As of this
|
|
writing only about 50% of queries produce results. So it may be better to trade high
|
|
randomness for higher quality queries. For example it would be possible to build up a
|
|
library of 100k queries that produce results then randomly select 2.5k of those.
|
|
Maybe that would provide testing equivalent to 5k totally random queries in less
|
|
time.
|
|
|
|
This would also be useful in eliminating queries that have known issues above.
|
|
|
|
|
|
Postgresql:
|
|
|
|
1) Supports basically all Impala language features. Exceptions include:
|
|
|
|
a) IGNORE NULLS clause for analytic functions
|
|
|
|
2) Has strange sorting of strings, '-1' > '1'. This may be important if ORDER BY is ever
|
|
used. The databases being compared would need to have the same collation, which is
|
|
probably configurable.
|
|
|
|
MySQL:
|
|
|
|
1) Does not support analytics.
|
|
|
|
2) Has poor boolean support.
|
|
|
|
Oracle:
|
|
|
|
1) No Boolean support.
|
|
|
|
2) Better analytic function support, e.g. "IGNORE NULLS" is supported.
|
|
|
|
3) Strange oddities abound, like no LIMIT clause.
|
|
|
|
Improvements:
|
|
|
|
1) Add the ability to incrementally increase the complexity of query profiles
|
|
automatically during execution. For example, the profile could start with no joins,
|
|
then after 100 or so queries, the number of joins could be increased. This would
|
|
lead to bugs that are not related to joins being found by much simpler queries.
|
|
|
|
2) Add support for simplifying buggy queries. When a random query fails the comparison
|
|
check it is basically always much too complex for directly posting a bug report. It
|
|
is also time consuming to simplify the queries because there is a lot of trial and
|
|
error and manually editing queries.
|
|
|
|
3) Add common built-in functions. Ex: NVL, ...
|
|
|
|
4) Add support for comparing results with codegen enabled and disabled. Uri recently added
|
|
support for query options in Impyla.
|