\set ECHO none \pset format unaligned SET search_path TO provsql_test,provsql; -- Start from a clean slate: the overrides table persists across sessions, so -- a previous run (or another test) must not bias the seed listing below. DELETE FROM tool_overrides; -- The registry is seeded (in C) with every external tool ProvSQL can -- invoke: the d-DNNF compilers (d4, d4v2, c2d, minic2d, dsharp), the three -- Panini variants (all running the 'panini' binary), the weighted model -- counters (sharpsat-td, ganak, weightmc, dpmc), and the graph-easy ASCII -- renderer. dpmc has no single binary (it is the htb | dmc pipeline), so its -- executable is empty. The capability triple operations / input_formats / -- output_format uses the KCMCP registry names; `parser` is the CLI decode -- tag (the compilers share the single tolerant `nnf` parser; d4v2 also -- advertises circuit-bcs12 input). The host-dependent `available` column is -- not selected. SELECT name, executable, operations, input_formats, output_format, parser FROM tools ORDER BY name; -- Only a tool that accepts the BC-S1.2 circuit input carries a circuit -- command (argtpl_circuit); today that is d4v2. SELECT name, argtpl_circuit FROM tools WHERE argtpl_circuit <> '' ORDER BY name; -- register_tool (named args): a new compiler added without recompiling, with -- its KCMCP triple, parser and command template. SELECT register_tool('acme-kc', executable => '/opt/acme/akc', operations => ARRAY['compile'], input_formats => ARRAY['dimacs-cnf'], output_format => 'ddnnf-nnf', parser => 'nnf', argtpl => '-dDNNF {in} -out={out}', preference => 120); SELECT name, executable, operations, input_formats, output_format, parser, argtpl, preference FROM tools WHERE name='acme-kc'; -- The registration is persisted (an override row, not a tombstone), so it -- survives across sessions / backends and dump-restore. SELECT name, removed FROM tool_overrides WHERE name='acme-kc'; -- Re-registering the same name replaces the record (no duplicate row). SELECT register_tool('acme-kc', executable => '/usr/bin/akc', operations => ARRAY['compile','wmc'], preference => 5, enabled => false); SELECT count(*) AS rows, max(preference) AS pref, bool_or(enabled) AS enabled FROM tools WHERE name='acme-kc'; -- A NULL executable defaults to the logical name; NULL kind defaults to cli. SELECT register_tool('baretool'); SELECT executable, kind FROM tools WHERE name='baretool'; -- set_tool_enabled / set_tool_preference return void and take effect. SELECT set_tool_enabled('d4', false); SELECT enabled FROM tools WHERE name='d4'; SELECT set_tool_preference('d4', 7); SELECT preference FROM tools WHERE name='d4'; -- They error loudly on an unknown tool name (a typo must not silently no-op). SELECT set_tool_enabled('no-such-tool', false); SELECT set_tool_preference('no-such-tool', 7); -- unregister_tool removes the record; a second call errors (already gone). SELECT unregister_tool('acme-kc'); SELECT count(*) FROM tools WHERE name='acme-kc'; SELECT unregister_tool('acme-kc'); -- Dispatch consults the registry: an unknown compiler, a disabled native -- compiler, and a disabled Panini variant all fail before any tool is -- resolved on PATH, so these are host-independent. CREATE TABLE tr_r(x int); INSERT INTO tr_r VALUES (1); SELECT add_provenance('tr_r'); SELECT probability_evaluate(provsql, 'compilation', 'no-such-compiler') FROM tr_r; SELECT set_tool_enabled('dsharp', false); SELECT probability_evaluate(provsql, 'compilation', 'dsharp') FROM tr_r; SELECT set_tool_enabled('panini-obdd', false); SELECT probability_evaluate(provsql, 'compilation', 'panini-obdd') FROM tr_r; -- With no compiler named, 'compilation' picks the highest-preference available -- one; with every compiler disabled there is none, a host-independent error. SELECT set_tool_enabled('d4', false); SELECT set_tool_enabled('d4v2', false); SELECT set_tool_enabled('c2d', false); SELECT set_tool_enabled('minic2d', false); SELECT set_tool_enabled('panini-obdd-and', false); SELECT set_tool_enabled('panini-decdnnf', false); SELECT probability_evaluate(provsql, 'compilation') FROM tr_r; -- The weighted-model-counting dispatch is generic too (one wmcCount runner): -- an unknown wmc tool and a disabled one both fail in the registry, before -- any PATH lookup. SELECT probability_evaluate(provsql, 'wmc', 'no-such-counter') FROM tr_r; SELECT set_tool_enabled('ganak', false); SELECT probability_evaluate(provsql, 'wmc', 'ganak') FROM tr_r; -- With no tool named, 'wmc' picks the highest-preference available counter -- (preference-ranked selection); with every counter disabled there is none, -- a host-independent error. SELECT set_tool_enabled('sharpsat-td', false); SELECT set_tool_enabled('weightmc', false); SELECT set_tool_enabled('dpmc', false); SELECT probability_evaluate(provsql, 'wmc') FROM tr_r; DROP TABLE tr_r; -- The mutators are superuser-only: execute is revoked from PUBLIC. SELECT has_function_privilege('public', 'provsql.register_tool(text,text,text,text[],text[],text,text,text,text,int,boolean,text)', 'EXECUTE') AS register, has_function_privilege('public', 'provsql.unregister_tool(text)', 'EXECUTE') AS unregister, has_function_privilege('public', 'provsql.set_tool_enabled(text,boolean)', 'EXECUTE') AS set_enabled, has_function_privilege('public', 'provsql.set_tool_preference(text,int)', 'EXECUTE') AS set_preference; -- This test persists overrides; reset so the seed is restored for any later -- test sharing the regression database. DELETE FROM tool_overrides;