statement ok
CREATE PROCEDURE p_test_drop() LANGUAGE SQL AS 'SELECT 1'

statement ok
CREATE PROCEDURE p_test_drop(int) LANGUAGE SQL AS 'SELECT 1'

statement ok
CREATE SCHEMA sc1

statement ok
CREATE PROCEDURE sc1.p_test_drop(int) LANGUAGE SQL AS 'SELECT 1'

statement ok
SET search_path = public,sc1

query T
SELECT create_statement FROM [SHOW CREATE PROCEDURE public.p_test_drop] ORDER BY 1
----
CREATE PROCEDURE public.p_test_drop()
  LANGUAGE SQL
  SECURITY INVOKER
  AS $$
  SELECT 1;
$$
CREATE PROCEDURE public.p_test_drop(INT8)
  LANGUAGE SQL
  SECURITY INVOKER
  AS $$
  SELECT 1;
$$

query T
SELECT create_statement FROM [SHOW CREATE PROCEDURE sc1.p_test_drop]
----
CREATE PROCEDURE sc1.p_test_drop(INT8)
  LANGUAGE SQL
  SECURITY INVOKER
  AS $$
  SELECT 1;
$$

statement error pgcode 42883 function p_test_drop\(\) does not exist
DROP FUNCTION p_test_drop

statement error pgcode 42725 pq: procedure name \"p_test_drop\" is not unique
DROP PROCEDURE p_test_drop

statement ok
DROP PROCEDURE IF EXISTS p_not_existing

statement error pgcode 42883 pq: unknown procedure: p_not_existing\(\)
DROP PROCEDURE p_not_existing

# Dropping a procedure twice should fail.
statement error pgcode 42883 pq: procedure p_test_drop\(\) does not exist
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
DROP PROCEDURE p_test_drop();
DROP PROCEDURE p_test_drop();
COMMIT;

statement ok
ROLLBACK

statement error pgcode 42883 function p_test_drop\(\) does not exist
DROP FUNCTION p_test_drop

statement ok
DROP FUNCTION IF EXISTS p_test_drop

statement error pgcode 42809 p_test_drop\(\) is not a function
DROP FUNCTION p_test_drop()

statement error pgcode 42809 p_test_drop\(\) is not a function
DROP FUNCTION IF EXISTS p_test_drop()

statement ok
DROP PROCEDURE IF EXISTS p_test_drop()

statement error pgcode 42883 procedure p_test_drop\(\) does not exist
CALL p_test_drop()

query T
SELECT create_statement FROM [SHOW CREATE PROCEDURE public.p_test_drop]
----
CREATE PROCEDURE public.p_test_drop(INT8)
  LANGUAGE SQL
  SECURITY INVOKER
  AS $$
  SELECT 1;
$$

query T
SELECT create_statement FROM [SHOW CREATE PROCEDURE sc1.p_test_drop]
----
CREATE PROCEDURE sc1.p_test_drop(INT8)
  LANGUAGE SQL
  SECURITY INVOKER
  AS $$
  SELECT 1;
$$

# Drop with two identical procedure signatures should be ok. And only first
# match in path should be drop.
statement ok
DROP PROCEDURE p_test_drop(INT), p_test_drop(INT)

statement error pgcode 42883 procedure public.p_test_drop does not exist
CALL public.p_test_drop(1)

statement error pgcode 42883 pq: unknown procedure: public.p_test_drop\(\)
SELECT create_statement FROM [SHOW CREATE PROCEDURE public.p_test_drop]

query T
SELECT create_statement FROM [SHOW CREATE PROCEDURE sc1.p_test_drop]
----
CREATE PROCEDURE sc1.p_test_drop(INT8)
  LANGUAGE SQL
  SECURITY INVOKER
  AS $$
  SELECT 1;
$$

statement ok
DROP PROCEDURE p_test_drop(INT)

statement error pgcode 42883 procedure p_test_drop does not exist
CALL p_test_drop(1)

statement error pgcode 42883 pq: unknown procedure: sc1.p_test_drop\(\)
SELECT create_statement FROM [SHOW CREATE PROCEDURE sc1.p_test_drop]

# If there are identical procedure signatures in different schemas, multiple
# drop statements should drop them all. This matches postgres behavior.
statement ok
CREATE PROCEDURE public.p_test_drop() LANGUAGE SQL AS $$ SELECT 1 $$;
CREATE PROCEDURE sc1.p_test_drop() LANGUAGE SQL AS $$ SELECT 1 $$;

query T
SELECT create_statement FROM [SHOW CREATE PROCEDURE public.p_test_drop]
----
CREATE PROCEDURE public.p_test_drop()
  LANGUAGE SQL
  SECURITY INVOKER
  AS $$
  SELECT 1;
$$

query T
SELECT create_statement FROM [SHOW CREATE PROCEDURE sc1.p_test_drop]
----
CREATE PROCEDURE sc1.p_test_drop()
  LANGUAGE SQL
  SECURITY INVOKER
  AS $$
  SELECT 1;
$$

statement ok
BEGIN;
DROP PROCEDURE p_test_drop();
DROP PROCEDURE p_test_drop();
COMMIT;

statement error pgcode 42883 pq: unknown procedure: public.p_test_drop\(\)
SELECT create_statement FROM [SHOW CREATE PROCEDURE public.p_test_drop]

statement error pgcode 42883 pq: unknown procedure: sc1.p_test_drop\(\)
SELECT create_statement FROM [SHOW CREATE PROCEDURE sc1.p_test_drop]

statement ok
SET search_path = public

statement ok
DROP SCHEMA sc1

# Regression test for #114677 - it should be possible to drop a procedure with
# a UDT parameter
subtest udt_parameter

statement ok
CREATE TYPE t114677 AS (x INT, y INT);

statement ok
CREATE PROCEDURE p114677(v t114677) LANGUAGE SQL AS $$ SELECT 0; $$;

statement ok
DROP PROCEDURE p114677(t114677);

subtest end
