Getting ProvSQL
===============
There are three ways to run ProvSQL:
* `Installing from Source`_ (recommended) – full-featured, suitable for
production use and development.
* `Via PGXN`_ – the PostgreSQL Extension Network wraps the source build
behind a one-line ``pgxn install provsql`` command.
* `Docker Container`_ – no installation required, ideal for quickly trying
ProvSQL without modifying your system.
.. tip::
Just want to try ProvSQL without installing anything? The **ProvSQL
Playground** runs PostgreSQL, ProvSQL and ProvSQL Studio entirely in
your browser (WebAssembly) at
`provsql.org/playground/ `_, on demo
databases. It needs a recent browser with WebAssembly JSPI; the
Playground's landing page lists current browser support. For real use,
install locally as below.
Installing from Source
-----------------------
This is the recommended approach. It gives full access to all features,
including external knowledge-compilation tools.
Getting the Source
^^^^^^^^^^^^^^^^^^
Releases are available on the `ProvSQL website `_
and on the `GitHub releases page
`_.
The source repository is hosted at
``_.
To clone the development version directly:
.. code-block:: bash
git clone https://github.com/PierreSenellart/provsql.git
Prerequisites
^^^^^^^^^^^^^
1. **PostgreSQL ≥ 11.** ProvSQL has been tested with versions 11–18 under
Linux, macOS (x86-64 and ARM), and Windows Subsystem for Linux.
2. **Build tools.** ``make``, a C/C++ compiler supporting C++17, and
PostgreSQL development headers (e.g., ``postgresql-server-dev-XX`` on
Debian-based systems, or the ``postgresql`` Homebrew formula on macOS).
3. `uuid-ossp `_
PostgreSQL extension (included with most PostgreSQL packages; compile
``contrib/`` when building from source).
4. **Boost libraries** – ``libboost-dev`` and ``libboost-serialization-dev``
(Debian/Ubuntu), or equivalent.
5. **(Optional) Knowledge-compilation tools** for probability computation:
* `c2d `_
* `d4 `_ and its rewrite
`d4v2 `_
* `dsharp `_
* `minic2d `_ (also requires
``hgr2htree``)
* `Panini (KCBox) `_
* `weightmc `_,
`Ganak `_,
`SharpSAT-TD `_,
`DPMC `_ (weighted model counters)
All of these are optional: ProvSQL ships with an in-process
tree-decomposition compiler that needs no external binary. One of
them is, however, the **final-fallback compiler** of
:sqlfunc:`probability_evaluate` (default ``d4``, configurable via
``provsql.fallback_compiler``; see :doc:`configuration`): if you
install only one knowledge compiler, install that one.
Each tool must be installed as an executable reachable in the PATH of
the PostgreSQL server process (e.g., ``/usr/local/bin/``). If the tools
live outside that PATH (a Conda environment, ``$HOME/local/bin``,
``/opt/...``), point ProvSQL at them with the
``provsql.tool_search_path`` GUC; see :doc:`configuration`.
6. **(Optional) graph-easy** for circuit visualisation (``libgraph-easy-perl``
on Debian-based systems, or CPAN). Same PATH considerations as above
apply.
Installation
^^^^^^^^^^^^
1. Compile:
.. code-block:: bash
make
To select a specific PostgreSQL installation, adjust the ``pg_config``
path in ``Makefile.internal``.
2. Install (as a user with write access to the PostgreSQL directories):
.. code-block:: bash
make install
3. Enable the extension hook. Add the following line to
`postgresql.conf `_
(typically ``/etc/postgresql/VERSION/main/postgresql.conf`` on Linux):
.. code-block:: ini
shared_preload_libraries = 'provsql'
Then restart the PostgreSQL server:
.. code-block:: bash
service postgresql restart
.. important::
The `shared_preload_libraries `_
step is mandatory. ProvSQL installs a planner hook that rewrites
queries transparently; without it the extension loads but provenance
tracking is silently disabled.
4. In each database where you want to use ProvSQL, load the extension:
.. code-block:: postgresql
CREATE EXTENSION provsql CASCADE;
The ``CASCADE`` keyword automatically installs the required
``uuid-ossp`` extension if it is not already present.
5. Make sure ``provsql`` is in your ``search_path``. ProvSQL's
operators and functions live in the ``provsql`` schema and are
resolved through ``search_path`` (see :ref:`search-path` for what
goes wrong without it). ``CREATE EXTENSION`` prints a ``NOTICE``
if it is missing; the easiest fix is the bundled helper:
.. code-block:: postgresql
SELECT provsql.setup_search_path();
which appends ``provsql`` to the database's ``search_path`` (only
new sessions are affected). See :ref:`search-path` for the manual
alternative and the details.
Upgrading an Existing Installation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Starting with **1.2.1**, ProvSQL ships PostgreSQL extension upgrade
scripts covering every released version from ``1.0.0`` onwards (see
``sql/upgrades/`` in the source tree for the exact chain available in
your checkout). To upgrade an existing installation:
1. Check out the new source, build, and install (as a user with write
access to the PostgreSQL directories):
.. code-block:: bash
make
make install
2. **If you are upgrading across 1.3.0** (i.e., from any pre-1.3.0
release), migrate the on-disk provenance store before restarting
PostgreSQL: from 1.3.0, the flat ``$PGDATA/provsql_*.mmap`` files
are replaced by per-database files under ``$PGDATA/base//``.
Build and run the bundled migration tool as the ``postgres`` system
user with the server stopped (adjust the connection string for your
socket directory if different):
.. code-block:: bash
make provsql_migrate_mmap
sudo -u postgres ./provsql_migrate_mmap -D $PGDATA -c "host=/var/run/postgresql"
The tool removes the old flat files on success. Skip this step
when upgrading between 1.3.0+ releases.
3. Restart PostgreSQL so the new shared library is loaded:
.. code-block:: bash
service postgresql restart
4. In each database where ``provsql`` is already installed, issue:
.. code-block:: postgresql
ALTER EXTENSION provsql UPDATE;
The provenance circuit is kept. A major-version PostgreSQL upgrade
with ``pg_upgrade``, on the other hand, does not carry it; see
:doc:`persistence`.
.. note::
Upgrades from **pre-1.0.0** development snapshots are not
supported: no upgrade script is provided and you must
``DROP EXTENSION provsql CASCADE; CREATE EXTENSION provsql``
instead. Any provenance tokens previously stored in user tables
become orphans and will not be resolvable against the new
circuit store.
.. note::
On **PostgreSQL 11**, ``ALTER EXTENSION provsql UPDATE`` fails
across a release that adds gate types (1.5.0 and several later
ones); fresh installs work.
Upgrade PostgreSQL first, carrying the circuit as described in
:doc:`persistence`, or drop and recreate the extension (losing
stored provenance).
Testing Your Installation
^^^^^^^^^^^^^^^^^^^^^^^^^
Run the full regression suite as a PostgreSQL superuser:
.. code-block:: bash
make test
If tests fail, the pager (usually ``less``) is launched on the diff between
expected and actual output.
.. note::
To run the tests as a non-default user, grant yourself superuser rights
first:
.. code-block:: postgresql
ALTER USER your_login WITH SUPERUSER;
This assumes ``your_login`` is already a PostgreSQL user; on Debian-based
systems you can create it by running ``createuser your_login`` as the
``postgres`` system user.
If your PostgreSQL server does not listen on the default port (5432), add
``--port=xxxx`` to the ``EXTRA_REGRESS_OPTS`` line of ``Makefile.internal``.
Tests that depend on optional external tools (``c2d``, ``d4``, ``dsharp``,
``minic2d``, ``weightmc``, ``graph-easy``) are automatically skipped if the
tool is not found in ``$PATH``.
Uninstalling
^^^^^^^^^^^^
.. code-block:: bash
make uninstall
Then remove the ``provsql`` entry from ``shared_preload_libraries`` in
``postgresql.conf`` and restart the server.
Via PGXN
--------
ProvSQL is distributed on the `PostgreSQL Extension Network
`_. If you have the
`pgxnclient `_ tool installed,
a single command (run as a user with write access to the PostgreSQL
directories) downloads, builds, and installs the extension:
.. code-block:: bash
pgxn install provsql
You still need the build prerequisites (C++17 compiler, Boost
headers, PostgreSQL server development headers, and a working
``pg_config`` on your ``PATH``) and you still need to add ``provsql``
to ``shared_preload_libraries`` in ``postgresql.conf`` and restart
the server afterwards -- ``pgxn install`` wraps the source build but
does not modify your server configuration.
To install a specific version:
.. code-block:: bash
pgxn install provsql=X.Y.Z
.. _docker-container:
Docker Container
----------------
For a quick trial without any local installation, a demonstration Docker
container is available. Alongside the extension and a pre-installed ProvSQL
Studio it bundles a set of the optional external tools: the ``d4`` and
``dsharp`` knowledge compilers, the ``ganak``, ``sharpsat-td`` and
``weightmc`` weighted model counters, and ``graph-easy`` for ASCII circuit
rendering.
.. code-block:: bash
docker run -p 5433:5432 -p 8001:8000 inriavalda/provsql
The ``-p host:container`` flags publish the container's PostgreSQL (5432) and
ProvSQL Studio (8000) on host ports of your choice; this works with native
Docker, Docker Desktop and rootless podman. The example maps them to ``5433``
and ``8001`` to avoid clashing with a local PostgreSQL or Studio on the
default ``5432`` / ``8000``; any free host ports will do. To use a specific release version:
.. code-block:: bash
docker run -p 5433:5432 -p 8001:8000 inriavalda/provsql:X.Y.Z
Connect with a PostgreSQL client (``psql -h localhost -p 5433 tutorial test``)
or open Studio at ``http://localhost:8001`` (matching the host ports you
chose); the container also prints these instructions on startup.
The image is seeded with the same tutorial and case-study databases as the
ProvSQL Playground (``tutorial``, ``cs1``, ``cs2``, ``cs4``–``cs7``). Studio
lands on ``tutorial``; switch between them from its connection chip, or point
``psql`` at any of them (e.g., ``psql -h localhost -p 5433 cs1 test``).
ProvSQL Studio
--------------
ProvSQL Studio is a Python-backed web UI for ProvSQL, distributed as a
separate package on PyPI. It connects to any ProvSQL-enabled database
and provides interactive provenance inspection (Where mode), circuit
visualisation (Circuit mode), and on-the-fly semiring evaluation. See
:doc:`studio` for installation and usage.
License
-------
ProvSQL is open-source software distributed under the **MIT License**.
See the ``LICENSE`` file at the root of the repository or
`view it on GitHub `_.