statement ok
CREATE TABLE residents (
	id INT,
	name STRING,
	country STRING,
	PRIMARY KEY (country, id)
)

query TT
SHOW CREATE INDEXES FROM residents
----
residents_pkey  CREATE UNIQUE INDEX residents_pkey ON public.residents (country ASC, id ASC)

query TT
SHOW CREATE SECONDARY INDEXES FROM residents
----

statement ok
ALTER TABLE residents PARTITION BY LIST (country) (
	PARTITION north_america VALUES IN ('CA', 'US', 'MX'),
	PARTITION DEFAULT VALUES IN (default)
)

query TT
SHOW CREATE INDEXES FROM residents
----
residents_pkey  CREATE UNIQUE INDEX residents_pkey ON public.residents (country ASC, id ASC) PARTITION BY LIST (country) (
                PARTITION north_america VALUES IN (('CA'), ('US'), ('MX')),
                PARTITION "default" VALUES IN ((DEFAULT))
)

statement ok
CREATE UNIQUE INDEX ON residents (id) PARTITION BY RANGE (id) (
	PARTITION negative VALUES FROM (MINVALUE) TO (0),
	PARTITION nonnegative VALUES FROM (0) TO (MAXVALUE)
)

query TT
SELECT * FROM [SHOW CREATE INDEXES FROM residents] ORDER BY index_name DESC
----
residents_pkey    CREATE UNIQUE INDEX residents_pkey ON public.residents (country ASC, id ASC) PARTITION BY LIST (country) (
                  PARTITION north_america VALUES IN (('CA'), ('US'), ('MX')),
                  PARTITION "default" VALUES IN ((DEFAULT))
)
residents_id_key  CREATE UNIQUE INDEX residents_id_key ON public.residents (id ASC) PARTITION BY RANGE (id) (
                  PARTITION negative VALUES FROM (MINVALUE) TO (0),
                  PARTITION nonnegative VALUES FROM (0) TO (MAXVALUE)
)

query TT
SHOW CREATE SECONDARY INDEXES FROM residents
----
residents_id_key  CREATE UNIQUE INDEX residents_id_key ON public.residents (id ASC) PARTITION BY RANGE (id) (
                  PARTITION negative VALUES FROM (MINVALUE) TO (0),
                  PARTITION nonnegative VALUES FROM (0) TO (MAXVALUE)
)

statement ok
CREATE FUNCTION r1() RETURNS INT LANGUAGE SQL AS 'SELECT 1'

statement ok
CREATE FUNCTION r1(i INT) RETURNS INT LANGUAGE SQL AS 'SELECT 1'

statement ok
CREATE PROCEDURE r1(s STRING) LANGUAGE SQL AS 'SELECT 1'

statement ok
CREATE PROCEDURE r1(s STRING, i INT) LANGUAGE SQL AS 'SELECT 1'

query TT
SELECT * FROM [SHOW CREATE FUNCTION r1] ORDER BY 2
----
r1  CREATE FUNCTION public.r1()
      RETURNS INT8
      VOLATILE
      NOT LEAKPROOF
      CALLED ON NULL INPUT
      LANGUAGE SQL
      SECURITY INVOKER
      AS $$
      SELECT 1;
    $$
r1  CREATE FUNCTION public.r1(i INT8)
      RETURNS INT8
      VOLATILE
      NOT LEAKPROOF
      CALLED ON NULL INPUT
      LANGUAGE SQL
      SECURITY INVOKER
      AS $$
      SELECT 1;
    $$

skipif config local-mixed-23.1
query TT
SELECT * FROM [SHOW CREATE PROCEDURE r1] ORDER BY 2
----
r1  CREATE PROCEDURE public.r1(s STRING)
      LANGUAGE SQL
      SECURITY INVOKER
      AS $$
      SELECT 1;
    $$
r1  CREATE PROCEDURE public.r1(s STRING, i INT8)
      LANGUAGE SQL
      SECURITY INVOKER
      AS $$
      SELECT 1;
    $$

statement ok
CREATE SCHEMA sc

statement ok
CREATE FUNCTION sc.r2() RETURNS INT LANGUAGE SQL AS 'SELECT 1'

statement ok
CREATE PROCEDURE sc.r2(s STRING) LANGUAGE SQL AS 'SELECT 1'

statement error pgcode 42883 pq: unknown function: r2()
SHOW CREATE FUNCTION r2;

statement error pgcode 42883 pq: unknown procedure: r2()
SHOW CREATE PROCEDURE r2;

statement ok
SET search_path = sc;

query TT
SHOW CREATE FUNCTION r2
----
r2  CREATE FUNCTION sc.r2()
      RETURNS INT8
      VOLATILE
      NOT LEAKPROOF
      CALLED ON NULL INPUT
      LANGUAGE SQL
      SECURITY INVOKER
      AS $$
      SELECT 1;
    $$

query TT
SHOW CREATE PROCEDURE r2
----
r2  CREATE PROCEDURE sc.r2(s STRING)
      LANGUAGE SQL
      SECURITY INVOKER
      AS $$
      SELECT 1;
    $$

statement ok
RESET search_path;

# Regression test for #112134 - correctly parse and display PLpgSQL.
statement ok
CREATE FUNCTION f112134() RETURNS INT AS $$
  DECLARE
    x INT := 0;
    i INT := 0;
  BEGIN
    WHILE i < 3 LOOP
      x := x + i;
      i := i + 1;
    END LOOP;
    RETURN x;
  END
$$ LANGUAGE PLpgSQL;

# TODO(112136): Fix the formatting.
query TT
SHOW CREATE FUNCTION f112134;
----
f112134  CREATE FUNCTION public.f112134()
           RETURNS INT8
           VOLATILE
           NOT LEAKPROOF
           CALLED ON NULL INPUT
           LANGUAGE plpgsql
           SECURITY INVOKER
           AS $$
           DECLARE
           x INT8 := 0;
           i INT8 := 0;
           BEGIN
           WHILE i < 3 LOOP
           x := x + i;
           i := i + 1;
           END LOOP;
           RETURN x;
           END;
         $$
