Skip to main content

SQL Fuzzing Module

Project description

AMOEBA-6422

Environment Setup

  1. Install dependencies
  • Install postgresql-12 (https://www.postgresql.org/download/)
  • Download demo data from dropbox and unzip it to data folder
  • Start postgresql server with data folder: /usr/lib/postgresql/12/bin/pg_ctl -D ./data start
    • If you install postgresql-12 from apt, stop it via sudo systemctl stop postgresql.service and give permission to the lock file via sudo chmod o+w /var/run/postgresql
  • Install dependencies
  1. Setup environment
  • Installation of direnv is needed. And run eval "$(direnv hook bash)" to setup the environment (replace bash with zsh or any shell you're using).
  • Build the MUTATOR of AMOEBA (only necessary if you make changes to the MUTATOR)
    cd /workspace/calcite-fuzzing && ./gradlew build -x core:checkstyleMain -x test -x core:checkstyleTest -x core:forbiddenApisTest -x core:autostyleJavaCheck
    

Quick Start

AMOEBA is configurable, a launch command template looks like the following:

$ timeout {total_timeout} ./test_driver.py --workers {num_workers} --output {outputfolder} --queries {num_queries_per_worker} --rewriter ./calcite-fuzzing --dbms={dbms_undertest} --validate --num_loops={num_feedbackloops} --feedback={conf_feedback} --dbconf=db_conf_demo.json --query_timeout {per_query_timeout}

You can customize the value of the following options:

  • {total_timeout}: timeout for the entire run of AMOEBA (unit is seconds)
  • {workers}: number of parallel workers to invoke GENERATOR and MUTATOR
  • {output}: location to store the intermediate results and bug reports
  • {queries}: number of base queries that are generated by each GENERATOR instance
  • {dbms}: DBMS that AMOEBA will evaluate on (i.e., postgresql or cockroachdb)
  • {num_loops}: number of feedback loops
  • {validate}: a boolean argument that decides whether to invoke the VALIDATOR after generating the equivalent query pairs
  • {feedback}: what types of feedbacks to utilize (i.e., both, none, mutator, or validator)
  • {query_timeout}: timeout for executing each query (unit is seconds)

For example, you can launch AMOEBA with the following command:

timeout 3600 ./test_driver.py --workers 1 --output /home/postgres/exp/1 --queries 200 --rewriter ./calcite-fuzzing --dbms=postgresql --validate --num_loops=100 --feedback=none --dbconf=db_conf_demo.json --query_timeout 30

If AMOEBA is working correctly, you should expect to see the following progress information is printed:

start query generator
['mutator.py --prob_table=/home/postgres/test/190156/prob_table_190156.json --db_info=/workspace/amoeba_conf/db_conf_demo.json -s seq --queries 100 1>/home/postgres/test/190156/0/log_sa0 2>/home/postgres/test/190156/0/input.sql']
finish query generator
start query rewriter
['java -cp calcite-core-1.22.0-SNAPSHOT-tests.jar:./*:. org.apache.calcite.test.Transformer /home/postgres/test/190156/0']
finish query rewriter
start validator
begin compare plan cost of equivalent queries
compare plan cost /home/postgres/test/190156/0/out/q20.sql
find plan diff /home/postgres/test/190156/0/out/q20.sql
compare plan cost /home/postgres/test/190156/0/out/q13.sql
find plan diff /home/postgres/test/190156/0/out/q13.sql
compare plan cost /home/postgres/test/190156/0/out/q18.sql
compare plan cost /home/postgres/test/190156/0/out/q23.sql

This example command should complete within 20 minutes. You can check the generated intermediate results in /home/postgres/exp/1. If AMOEBA discovers potential performance bugs, the generated bug report will live at /home/postgres/exp/1/bugs.md.

The shortcut CTRL+C can be used to terminate AMOEBA manually. Otherwise, AMOEBA will terminate either after a specified experiment timeout is reached or after a specified number of base queries have been examined. The option total_timeout controls the experiment timeout. The options workers, queries, and num_loops altogether determine the number of base queries that AMOEBA is going to examine.

Note

  • calcite part is based on Apache Calcite 1.22 and the only new class is added on core/src/test/java/org/apache/calcite/test/Transformer.java
  • need to remove all dependencies in this repo and ask users to download it as needed.
  • grant appropriate permission to your user to access the database. ref: https://stackoverflow.com/a/23934693/10180666

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

amoeba-db-0.0.1.tar.gz (3.5 kB view details)

Uploaded Source

Built Distribution

amoeba_db-0.0.1-py3-none-any.whl (3.1 kB view details)

Uploaded Python 3

File details

Details for the file amoeba-db-0.0.1.tar.gz.

File metadata

  • Download URL: amoeba-db-0.0.1.tar.gz
  • Upload date:
  • Size: 3.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.8.6

File hashes

Hashes for amoeba-db-0.0.1.tar.gz
Algorithm Hash digest
SHA256 b8fcee2634b537997cf82587174d29d00770ae3577f49c8f308f99666f06f76a
MD5 a1d0bac4d3a75076718a5d4643602ced
BLAKE2b-256 62cfd5eec022a0806012a2b74aeac1e3b1d1add2df959c0d0ab8c2e61963a857

See more details on using hashes here.

File details

Details for the file amoeba_db-0.0.1-py3-none-any.whl.

File metadata

  • Download URL: amoeba_db-0.0.1-py3-none-any.whl
  • Upload date:
  • Size: 3.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.8.6

File hashes

Hashes for amoeba_db-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 babc0653115ca892aa161f5e7194ff1414674766a3f42688f76aeb4ca9620f20
MD5 7b1fbac7fad43f95950f176b5c621223
BLAKE2b-256 6148195752a2f224c211deaebe3269860789ad92d6b1eff656ded23908165902

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page