-- Regression tests for prepareable statements. We query the content
-- of the pg_prepared_statements view as prepared statements are
-- created and removed.
SELECT
    name,
    statement,
    parameter_types
FROM
    pg_prepared_statements;

PREPARE q1 AS
SELECT
    1 AS a;

EXECUTE q1;

SELECT
    name,
    statement,
    parameter_types
FROM
    pg_prepared_statements;

-- should fail
PREPARE q1 AS
SELECT
    2;

-- should succeed
DEALLOCATE q1;

PREPARE q1 AS
SELECT
    2;

EXECUTE q1;

PREPARE q2 AS
SELECT
    2 AS b;

SELECT
    name,
    statement,
    parameter_types
FROM
    pg_prepared_statements;

-- sql92 syntax
DEALLOCATE PREPARE q1;

SELECT
    name,
    statement,
    parameter_types
FROM
    pg_prepared_statements;

DEALLOCATE PREPARE q2;

-- the view should return the empty set again
SELECT
    name,
    statement,
    parameter_types
FROM
    pg_prepared_statements;

-- parameterized queries
PREPARE q2 (text) AS
SELECT
    datname,
    datistemplate,
    datallowconn
FROM
    pg_database
WHERE
    datname = $1;

EXECUTE q2 ('postgres');

PREPARE q3 (text,
    int,
    float,
    boolean,
    smallint) AS
SELECT
    *
FROM
    tenk1
WHERE
    string4 = $1
    AND (four = $2
        OR ten = $3::bigint
        OR TRUE = $4
        OR odd = $5::int)
ORDER BY
    unique1;

EXECUTE q3 ('AAAAxx',
    5::smallint,
    10.5::float,
    FALSE,
    4::bigint);

-- too few params
EXECUTE q3 ('bool');

-- too many params
EXECUTE q3 ('bytea',
    5::smallint,
    10.5::float,
    FALSE,
    4::bigint,
    TRUE);

-- wrong param types
EXECUTE q3 (5::smallint,
    10.5::float,
    FALSE,
    4::bigint,
    'bytea');

-- invalid type
PREPARE q4 (nonexistenttype) AS
SELECT
    $1;

-- create table as execute
PREPARE q5 (int,
    text) AS
SELECT
    *
FROM
    tenk1
WHERE
    unique1 = $1
    OR stringu1 = $2
ORDER BY
    unique1;

CREATE TEMPORARY TABLE q5_prep_results AS
EXECUTE q5 (
    200,
    'DTAAAA'
);

SELECT
    *
FROM
    q5_prep_results;

CREATE TEMPORARY TABLE q5_prep_nodata AS
EXECUTE q5 (
    200,
    'DTAAAA'
)
WITH NO DATA;

SELECT
    *
FROM
    q5_prep_nodata;

-- unknown or unspecified parameter types: should succeed
PREPARE q6 AS
SELECT
    *
FROM
    tenk1
WHERE
    unique1 = $1
    AND stringu1 = $2;

PREPARE q7 (unknown) AS
SELECT
    *
FROM
    road
WHERE
    thepath = $1;

SELECT
    name,
    statement,
    parameter_types
FROM
    pg_prepared_statements
ORDER BY
    name;

-- test DEALLOCATE ALL;
DEALLOCATE ALL;

SELECT
    name,
    statement,
    parameter_types
FROM
    pg_prepared_statements
ORDER BY
    name;

