# What the parser guard accepts and refuses ACCEPT SELECT count(*) FROM orders WHERE status = 'paid' ACCEPT SELECT c.country, count(*) FROM customers c JOIN orders o ON o.customer_id = c.id GROUP BY c.country ORDE... ACCEPT WITH big AS (SELECT order_id FROM order_items GROUP BY order_id HAVING sum(quantity) > 5) SELECT count(*)... ACCEPT SELECT * FROM orders WHERE id IN (SELECT order_id FROM order_items WHERE quantity > 2) ACCEPT SELECT 1 /* ; DROP TABLE orders */ ACCEPT SELECT name FROM public.customers REFUSE DELETE FROM orders (only SELECT is allowed, found Delete) REFUSE SELECT * FROM orders; DROP TABLE orders (more than one statement (2)) REFUSE SELECT * FROM api_keys (table api_keys is not allowed) REFUSE SELECT usename FROM pg_user (table pg_user is not allowed) REFUSE SELECT pg_sleep(3) (function pg_sleep is not allowed) REFUSE SELECT pg_read_file('/etc/passwd') (function pg_read_file is not allowed) REFUSE WITH d AS (DELETE FROM orders RETURNING *) SELECT count(*) FROM d (WITH item is not a SELECT (data-modifying CTE)) REFUSE SELECT * FROM orders FOR UPDATE (row locking clause (UPDATE)) REFUSE SELECT * INTO newtab FROM orders (SELECT INTO creates a table) REFUSE SELECT count(*) FROM generate_series(1, 2000000000) (function generate_series is not allowed) REFUSE SELECT set_config('default_transaction_read_only', 'off', false) (function set_config is not allowed) REFUSE SELECT * FROM orders o, "api_keys" k (table "api_keys" is not allowed) REFUSE SELECT date_part('month', ordered_at) FROM orders (function date_part is not allowed) REFUSE SELECT now() (function now is not allowed)