Print out error position for some more DDLs
authorMichael Paquier <michael@paquier.xyz>
Tue, 17 Dec 2024 00:44:06 +0000 (09:44 +0900)
committerMichael Paquier <michael@paquier.xyz>
Tue, 17 Dec 2024 00:44:06 +0000 (09:44 +0900)
The following commands gain some information about the error position in
the query, should they fail when looking at the type used:
- CREATE TYPE (LIKE)
- CREATE TABLE OF

Both are related to typenameType() where the type name lookup is done.
These calls gain the ParseState that already exists in these paths.

Author: Kirill Reshke, Jian He
Reviewed-by: Álvaro Herrera, Michael Paquier
Discussion: https://postgr.es/m/CALdSSPhqfvKbDwqJaY=yEePi_aq61GmMpW88i6ZH7CMG_2Z4Cg@mail.gmail.com

src/backend/commands/typecmds.c
src/backend/parser/parse_utilcmd.c
src/test/regress/expected/float8.out
src/test/regress/expected/typed_table.out

index 6127313956033e2800068c96013814f45a1593c9..4f20b5be064d5262cbfd1484dd79bc9f4620a5a7 100644 (file)
@@ -348,7 +348,7 @@ DefineType(ParseState *pstate, List *names, List *parameters)
        Type        likeType;
        Form_pg_type likeForm;
 
-       likeType = typenameType(NULL, defGetTypeName(likeTypeEl), NULL);
+       likeType = typenameType(pstate, defGetTypeName(likeTypeEl), NULL);
        likeForm = (Form_pg_type) GETSTRUCT(likeType);
        internalLength = likeForm->typlen;
        byValue = likeForm->typbyval;
index 0f324ee4e319ee72b88f68fe4541b3e1ed0f5d78..95dad766834a0c8319d5b32bb00e05784b635674 100644 (file)
@@ -1615,7 +1615,7 @@ transformOfType(CreateStmtContext *cxt, TypeName *ofTypename)
 
    Assert(ofTypename);
 
-   tuple = typenameType(NULL, ofTypename, NULL);
+   tuple = typenameType(cxt->pstate, ofTypename, NULL);
    check_of_type(tuple);
    ofTypeId = ((Form_pg_type) GETSTRUCT(tuple))->oid;
    ofTypename->typeOid = ofTypeId; /* cached for later */
index 4965ee55541f63c6b09b585258e4ac7548844631..9ef9793fe9b961e1d0f35d093a6f1c44179163cd 100644 (file)
@@ -1026,6 +1026,8 @@ LINE 1: create function xfloat8out(xfloat8) returns cstring immutabl...
                                    ^
 create type xfloat8 (input = xfloat8in, output = xfloat8out, like = no_such_type);
 ERROR:  type "no_such_type" does not exist
+LINE 1: ...8 (input = xfloat8in, output = xfloat8out, like = no_such_ty...
+                                                             ^
 create type xfloat8 (input = xfloat8in, output = xfloat8out, like = float8);
 create cast (xfloat8 as float8) without function;
 create cast (float8 as xfloat8) without function;
index b6fbda3f217863815f2a44c765d7bf8d3a3d7cc8..aa6150b853c60e637c01b4dd10726eca8b9efed3 100644 (file)
@@ -1,5 +1,7 @@
 CREATE TABLE ttable1 OF nothing;
 ERROR:  type "nothing" does not exist
+LINE 1: CREATE TABLE ttable1 OF nothing;
+                                ^
 CREATE TYPE person_type AS (id int, name text);
 CREATE TABLE persons OF person_type;
 CREATE TABLE IF NOT EXISTS persons OF person_type;