PostgreSQL Source Code  git master
parse_type.h File Reference
#include "access/htup.h"
#include "parser/parse_node.h"
Include dependency graph for parse_type.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define ISCOMPLEX(typeid)   (typeOrDomainTypeRelid(typeid) != InvalidOid)
 

Typedefs

typedef HeapTuple Type
 

Functions

Type LookupTypeName (ParseState *pstate, const TypeName *typeName, int32 *typmod_p, bool missing_ok)
 
Type LookupTypeNameExtended (ParseState *pstate, const TypeName *typeName, int32 *typmod_p, bool temp_ok, bool missing_ok)
 
Oid LookupTypeNameOid (ParseState *pstate, const TypeName *typeName, bool missing_ok)
 
Type typenameType (ParseState *pstate, const TypeName *typeName, int32 *typmod_p)
 
Oid typenameTypeId (ParseState *pstate, const TypeName *typeName)
 
void typenameTypeIdAndMod (ParseState *pstate, const TypeName *typeName, Oid *typeid_p, int32 *typmod_p)
 
char * TypeNameToString (const TypeName *typeName)
 
char * TypeNameListToString (List *typenames)
 
Oid LookupCollation (ParseState *pstate, List *collnames, int location)
 
Oid GetColumnDefCollation (ParseState *pstate, ColumnDef *coldef, Oid typeOid)
 
Type typeidType (Oid id)
 
Oid typeTypeId (Type tp)
 
int16 typeLen (Type t)
 
bool typeByVal (Type t)
 
char * typeTypeName (Type t)
 
Oid typeTypeRelid (Type typ)
 
Oid typeTypeCollation (Type typ)
 
Datum stringTypeDatum (Type tp, char *string, int32 atttypmod)
 
Oid typeidTypeRelid (Oid type_id)
 
Oid typeOrDomainTypeRelid (Oid type_id)
 
TypeNametypeStringToTypeName (const char *str)
 
void parseTypeString (const char *str, Oid *typeid_p, int32 *typmod_p, bool missing_ok)
 

Macro Definition Documentation

◆ ISCOMPLEX

Typedef Documentation

◆ Type

typedef HeapTuple Type

Definition at line 20 of file parse_type.h.

Function Documentation

◆ GetColumnDefCollation()

Oid GetColumnDefCollation ( ParseState pstate,
ColumnDef coldef,
Oid  typeOid 
)

Definition at line 542 of file parse_type.c.

References ColumnDef::collClause, CollateClause::collname, ColumnDef::collOid, ereport, errcode(), errmsg(), ERROR, format_type_be(), get_typcollation(), CollateClause::location, ColumnDef::location, LookupCollation(), OidIsValid, and parser_errposition().

Referenced by addRangeTableEntryForFunction(), ATExecAddColumn(), ATExecAlterColumnType(), ATPrepAlterColumnType(), BuildDescForRelation(), and MergeAttributes().

543 {
544  Oid result;
545  Oid typcollation = get_typcollation(typeOid);
546  int location = coldef->location;
547 
548  if (coldef->collClause)
549  {
550  /* We have a raw COLLATE clause, so look up the collation */
551  location = coldef->collClause->location;
552  result = LookupCollation(pstate, coldef->collClause->collname,
553  location);
554  }
555  else if (OidIsValid(coldef->collOid))
556  {
557  /* Precooked collation spec, use that */
558  result = coldef->collOid;
559  }
560  else
561  {
562  /* Use the type's default collation if any */
563  result = typcollation;
564  }
565 
566  /* Complain if COLLATE is applied to an uncollatable type */
567  if (OidIsValid(result) && !OidIsValid(typcollation))
568  ereport(ERROR,
569  (errcode(ERRCODE_DATATYPE_MISMATCH),
570  errmsg("collations are not supported by type %s",
571  format_type_be(typeOid)),
572  parser_errposition(pstate, location)));
573 
574  return result;
575 }
int errcode(int sqlerrcode)
Definition: elog.c:698
char * format_type_be(Oid type_oid)
Definition: format_type.c:339
unsigned int Oid
Definition: postgres_ext.h:31
#define OidIsValid(objectId)
Definition: c.h:710
#define ERROR
Definition: elog.h:46
Oid collOid
Definition: parsenodes.h:685
int location
Definition: parsenodes.h:688
Oid LookupCollation(ParseState *pstate, List *collnames, int location)
Definition: parse_type.c:517
#define ereport(elevel,...)
Definition: elog.h:157
Oid get_typcollation(Oid typid)
Definition: lsyscache.c:3003
int parser_errposition(ParseState *pstate, int location)
Definition: parse_node.c:111
CollateClause * collClause
Definition: parsenodes.h:684
List * collname
Definition: parsenodes.h:332
int errmsg(const char *fmt,...)
Definition: elog.c:909

◆ LookupCollation()

Oid LookupCollation ( ParseState pstate,
List collnames,
int  location 
)

Definition at line 517 of file parse_type.c.

References cancel_parser_errposition_callback(), get_collation_oid(), and setup_parser_errposition_callback().

Referenced by GetColumnDefCollation(), resolve_unique_index_expr(), transformCollateClause(), and transformColumnType().

518 {
519  Oid colloid;
520  ParseCallbackState pcbstate;
521 
522  if (pstate)
523  setup_parser_errposition_callback(&pcbstate, pstate, location);
524 
525  colloid = get_collation_oid(collnames, false);
526 
527  if (pstate)
529 
530  return colloid;
531 }
unsigned int Oid
Definition: postgres_ext.h:31
void cancel_parser_errposition_callback(ParseCallbackState *pcbstate)
Definition: parse_node.c:161
void setup_parser_errposition_callback(ParseCallbackState *pcbstate, ParseState *pstate, int location)
Definition: parse_node.c:145
Oid get_collation_oid(List *name, bool missing_ok)
Definition: namespace.c:3646

◆ LookupTypeName()

Type LookupTypeName ( ParseState pstate,
const TypeName typeName,
int32 typmod_p,
bool  missing_ok 
)

Definition at line 38 of file parse_type.c.

References LookupTypeNameExtended().

Referenced by AlterTypeOwner(), compute_return_type(), get_object_address_type(), interpret_function_parameter_list(), LookupTypeNameOid(), parseTypeString(), plpgsql_parse_wordtype(), and typenameType().

40 {
41  return LookupTypeNameExtended(pstate,
42  typeName, typmod_p, true, missing_ok);
43 }
Type LookupTypeNameExtended(ParseState *pstate, const TypeName *typeName, int32 *typmod_p, bool temp_ok, bool missing_ok)
Definition: parse_type.c:73

◆ LookupTypeNameExtended()

Type LookupTypeNameExtended ( ParseState pstate,
const TypeName typeName,
int32 typmod_p,
bool  temp_ok,
bool  missing_ok 
)

Definition at line 73 of file parse_type.c.

References TypeName::arrayBounds, Assert, attnum, cancel_parser_errposition_callback(), RangeVar::catalogname, DeconstructQualifiedName(), elog, ereport, errcode(), errmsg(), ERROR, format_type_be(), get_array_type(), get_attnum(), get_atttype(), GetSysCacheOid2, HeapTupleIsValid, InvalidAttrNumber, InvalidOid, lfourth, linitial, list_length(), TypeName::location, LookupExplicitNamespace(), lsecond, lthird, makeRangeVar(), NameListToString(), TypeName::names, NIL, NoLock, NOTICE, ObjectIdGetDatum, OidIsValid, parser_errposition(), TypeName::pct_type, PointerGetDatum, RangeVarGetRelid, RangeVar::relname, RangeVar::schemaname, SearchSysCache1(), setup_parser_errposition_callback(), strVal, TypenameGetTypidExtended(), TYPENAMENSP, TypeNameToString(), typenameTypeMod(), TYPEOID, TypeName::typeOid, and typname.

Referenced by FuncNameAsType(), and LookupTypeName().

76 {
77  Oid typoid;
78  HeapTuple tup;
79  int32 typmod;
80 
81  if (typeName->names == NIL)
82  {
83  /* We have the OID already if it's an internally generated TypeName */
84  typoid = typeName->typeOid;
85  }
86  else if (typeName->pct_type)
87  {
88  /* Handle %TYPE reference to type of an existing field */
89  RangeVar *rel = makeRangeVar(NULL, NULL, typeName->location);
90  char *field = NULL;
91  Oid relid;
93 
94  /* deconstruct the name list */
95  switch (list_length(typeName->names))
96  {
97  case 1:
98  ereport(ERROR,
99  (errcode(ERRCODE_SYNTAX_ERROR),
100  errmsg("improper %%TYPE reference (too few dotted names): %s",
101  NameListToString(typeName->names)),
102  parser_errposition(pstate, typeName->location)));
103  break;
104  case 2:
105  rel->relname = strVal(linitial(typeName->names));
106  field = strVal(lsecond(typeName->names));
107  break;
108  case 3:
109  rel->schemaname = strVal(linitial(typeName->names));
110  rel->relname = strVal(lsecond(typeName->names));
111  field = strVal(lthird(typeName->names));
112  break;
113  case 4:
114  rel->catalogname = strVal(linitial(typeName->names));
115  rel->schemaname = strVal(lsecond(typeName->names));
116  rel->relname = strVal(lthird(typeName->names));
117  field = strVal(lfourth(typeName->names));
118  break;
119  default:
120  ereport(ERROR,
121  (errcode(ERRCODE_SYNTAX_ERROR),
122  errmsg("improper %%TYPE reference (too many dotted names): %s",
123  NameListToString(typeName->names)),
124  parser_errposition(pstate, typeName->location)));
125  break;
126  }
127 
128  /*
129  * Look up the field.
130  *
131  * XXX: As no lock is taken here, this might fail in the presence of
132  * concurrent DDL. But taking a lock would carry a performance
133  * penalty and would also require a permissions check.
134  */
135  relid = RangeVarGetRelid(rel, NoLock, missing_ok);
136  attnum = get_attnum(relid, field);
137  if (attnum == InvalidAttrNumber)
138  {
139  if (missing_ok)
140  typoid = InvalidOid;
141  else
142  ereport(ERROR,
143  (errcode(ERRCODE_UNDEFINED_COLUMN),
144  errmsg("column \"%s\" of relation \"%s\" does not exist",
145  field, rel->relname),
146  parser_errposition(pstate, typeName->location)));
147  }
148  else
149  {
150  typoid = get_atttype(relid, attnum);
151 
152  /* this construct should never have an array indicator */
153  Assert(typeName->arrayBounds == NIL);
154 
155  /* emit nuisance notice (intentionally not errposition'd) */
156  ereport(NOTICE,
157  (errmsg("type reference %s converted to %s",
158  TypeNameToString(typeName),
159  format_type_be(typoid))));
160  }
161  }
162  else
163  {
164  /* Normal reference to a type name */
165  char *schemaname;
166  char *typname;
167 
168  /* deconstruct the name list */
169  DeconstructQualifiedName(typeName->names, &schemaname, &typname);
170 
171  if (schemaname)
172  {
173  /* Look in specific schema only */
174  Oid namespaceId;
175  ParseCallbackState pcbstate;
176 
177  setup_parser_errposition_callback(&pcbstate, pstate, typeName->location);
178 
179  namespaceId = LookupExplicitNamespace(schemaname, missing_ok);
180  if (OidIsValid(namespaceId))
181  typoid = GetSysCacheOid2(TYPENAMENSP, Anum_pg_type_oid,
182  PointerGetDatum(typname),
183  ObjectIdGetDatum(namespaceId));
184  else
185  typoid = InvalidOid;
186 
188  }
189  else
190  {
191  /* Unqualified type name, so search the search path */
192  typoid = TypenameGetTypidExtended(typname, temp_ok);
193  }
194 
195  /* If an array reference, return the array type instead */
196  if (typeName->arrayBounds != NIL)
197  typoid = get_array_type(typoid);
198  }
199 
200  if (!OidIsValid(typoid))
201  {
202  if (typmod_p)
203  *typmod_p = -1;
204  return NULL;
205  }
206 
207  tup = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typoid));
208  if (!HeapTupleIsValid(tup)) /* should not happen */
209  elog(ERROR, "cache lookup failed for type %u", typoid);
210 
211  typmod = typenameTypeMod(pstate, typeName, (Type) tup);
212 
213  if (typmod_p)
214  *typmod_p = typmod;
215 
216  return (Type) tup;
217 }
#define NIL
Definition: pg_list.h:65
Oid typeOid
Definition: parsenodes.h:222
Oid LookupExplicitNamespace(const char *nspname, bool missing_ok)
Definition: namespace.c:2938
List * names
Definition: parsenodes.h:221
#define PointerGetDatum(X)
Definition: postgres.h:600
#define RangeVarGetRelid(relation, lockmode, missing_ok)
Definition: namespace.h:79
char * TypeNameToString(const TypeName *typeName)
Definition: parse_type.c:480
Oid get_array_type(Oid typid)
Definition: lsyscache.c:2734
#define strVal(v)
Definition: value.h:65
int errcode(int sqlerrcode)
Definition: elog.c:698
char * format_type_be(Oid type_oid)
Definition: format_type.c:339
void DeconstructQualifiedName(List *names, char **nspname_p, char **objname_p)
Definition: namespace.c:2854
unsigned int Oid
Definition: postgres_ext.h:31
#define OidIsValid(objectId)
Definition: c.h:710
Oid TypenameGetTypidExtended(const char *typname, bool temp_ok)
Definition: namespace.c:785
#define lsecond(l)
Definition: pg_list.h:179
signed int int32
Definition: c.h:429
char * schemaname
Definition: primnodes.h:67
char * relname
Definition: primnodes.h:68
void cancel_parser_errposition_callback(ParseCallbackState *pcbstate)
Definition: parse_node.c:161
#define linitial(l)
Definition: pg_list.h:174
#define ObjectIdGetDatum(X)
Definition: postgres.h:551
#define ERROR
Definition: elog.h:46
#define NoLock
Definition: lockdefs.h:34
AttrNumber get_attnum(Oid relid, const char *attname)
Definition: lsyscache.c:856
Oid get_atttype(Oid relid, AttrNumber attnum)
Definition: lsyscache.c:938
void setup_parser_errposition_callback(ParseCallbackState *pcbstate, ParseState *pstate, int location)
Definition: parse_node.c:145
NameData typname
Definition: pg_type.h:41
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:1127
char * NameListToString(List *names)
Definition: namespace.c:3147
#define InvalidOid
Definition: postgres_ext.h:36
int16 attnum
Definition: pg_attribute.h:83
#define ereport(elevel,...)
Definition: elog.h:157
#define NOTICE
Definition: elog.h:37
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
#define Assert(condition)
Definition: c.h:804
#define GetSysCacheOid2(cacheId, oidcol, key1, key2)
Definition: syscache.h:195
#define lfourth(l)
Definition: pg_list.h:189
int location
Definition: parsenodes.h:228
static int list_length(const List *l)
Definition: pg_list.h:149
int parser_errposition(ParseState *pstate, int location)
Definition: parse_node.c:111
#define InvalidAttrNumber
Definition: attnum.h:23
List * arrayBounds
Definition: parsenodes.h:227
int errmsg(const char *fmt,...)
Definition: elog.c:909
#define elog(elevel,...)
Definition: elog.h:232
#define lthird(l)
Definition: pg_list.h:184
int16 AttrNumber
Definition: attnum.h:21
RangeVar * makeRangeVar(char *schemaname, char *relname, int location)
Definition: makefuncs.c:422
char * catalogname
Definition: primnodes.h:66
static int32 typenameTypeMod(ParseState *pstate, const TypeName *typeName, Type typ)
Definition: parse_type.c:332
bool pct_type
Definition: parsenodes.h:224

◆ LookupTypeNameOid()

Oid LookupTypeNameOid ( ParseState pstate,
const TypeName typeName,
bool  missing_ok 
)

Definition at line 232 of file parse_type.c.

References ereport, errcode(), errmsg(), ERROR, GETSTRUCT, InvalidOid, TypeName::location, LookupTypeName(), parser_errposition(), ReleaseSysCache(), and TypeNameToString().

Referenced by get_object_address(), LookupFuncWithArgs(), LookupOperWithArgs(), and type_in_list_does_not_exist_skipping().

233 {
234  Oid typoid;
235  Type tup;
236 
237  tup = LookupTypeName(pstate, typeName, NULL, missing_ok);
238  if (tup == NULL)
239  {
240  if (!missing_ok)
241  ereport(ERROR,
242  (errcode(ERRCODE_UNDEFINED_OBJECT),
243  errmsg("type \"%s\" does not exist",
244  TypeNameToString(typeName)),
245  parser_errposition(pstate, typeName->location)));
246 
247  return InvalidOid;
248  }
249 
250  typoid = ((Form_pg_type) GETSTRUCT(tup))->oid;
251  ReleaseSysCache(tup);
252 
253  return typoid;
254 }
Type LookupTypeName(ParseState *pstate, const TypeName *typeName, int32 *typmod_p, bool missing_ok)
Definition: parse_type.c:38
#define GETSTRUCT(TUP)
Definition: htup_details.h:654
char * TypeNameToString(const TypeName *typeName)
Definition: parse_type.c:480
int errcode(int sqlerrcode)
Definition: elog.c:698
unsigned int Oid
Definition: postgres_ext.h:31
#define ERROR
Definition: elog.h:46
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1175
#define InvalidOid
Definition: postgres_ext.h:36
#define ereport(elevel,...)
Definition: elog.h:157
int location
Definition: parsenodes.h:228
FormData_pg_type * Form_pg_type
Definition: pg_type.h:261
int parser_errposition(ParseState *pstate, int location)
Definition: parse_node.c:111
int errmsg(const char *fmt,...)
Definition: elog.c:909

◆ parseTypeString()

void parseTypeString ( const char *  str,
Oid typeid_p,
int32 typmod_p,
bool  missing_ok 
)

Definition at line 782 of file parse_type.c.

References ereport, errcode(), errmsg(), ERROR, GETSTRUCT, InvalidOid, TypeName::location, LookupTypeName(), parser_errposition(), ReleaseSysCache(), TypeNameToString(), and typeStringToTypeName().

Referenced by parseNameAndArgTypes(), plperl_spi_prepare(), pltcl_SPI_prepare(), PLy_spi_prepare(), regtypein(), and to_regtype().

783 {
784  TypeName *typeName;
785  Type tup;
786 
787  typeName = typeStringToTypeName(str);
788 
789  tup = LookupTypeName(NULL, typeName, typmod_p, missing_ok);
790  if (tup == NULL)
791  {
792  if (!missing_ok)
793  ereport(ERROR,
794  (errcode(ERRCODE_UNDEFINED_OBJECT),
795  errmsg("type \"%s\" does not exist",
796  TypeNameToString(typeName)),
797  parser_errposition(NULL, typeName->location)));
798  *typeid_p = InvalidOid;
799  }
800  else
801  {
802  Form_pg_type typ = (Form_pg_type) GETSTRUCT(tup);
803 
804  if (!typ->typisdefined)
805  ereport(ERROR,
806  (errcode(ERRCODE_UNDEFINED_OBJECT),
807  errmsg("type \"%s\" is only a shell",
808  TypeNameToString(typeName)),
809  parser_errposition(NULL, typeName->location)));
810  *typeid_p = typ->oid;
811  ReleaseSysCache(tup);
812  }
813 }
Type LookupTypeName(ParseState *pstate, const TypeName *typeName, int32 *typmod_p, bool missing_ok)
Definition: parse_type.c:38
#define GETSTRUCT(TUP)
Definition: htup_details.h:654
char * TypeNameToString(const TypeName *typeName)
Definition: parse_type.c:480
int errcode(int sqlerrcode)
Definition: elog.c:698
#define ERROR
Definition: elog.h:46
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1175
TypeName * typeStringToTypeName(const char *str)
Definition: parse_type.c:735
#define InvalidOid
Definition: postgres_ext.h:36
#define ereport(elevel,...)
Definition: elog.h:157
int location
Definition: parsenodes.h:228
FormData_pg_type * Form_pg_type
Definition: pg_type.h:261
int parser_errposition(ParseState *pstate, int location)
Definition: parse_node.c:111
int errmsg(const char *fmt,...)
Definition: elog.c:909

◆ stringTypeDatum()

Datum stringTypeDatum ( Type  tp,
char *  string,
int32  atttypmod 
)

Definition at line 656 of file parse_type.c.

References GETSTRUCT, getTypeIOParam(), and OidInputFunctionCall().

Referenced by coerce_type().

657 {
658  Form_pg_type typform = (Form_pg_type) GETSTRUCT(tp);
659  Oid typinput = typform->typinput;
660  Oid typioparam = getTypeIOParam(tp);
661 
662  return OidInputFunctionCall(typinput, string, typioparam, atttypmod);
663 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:654
unsigned int Oid
Definition: postgres_ext.h:31
FormData_pg_type * Form_pg_type
Definition: pg_type.h:261
Oid getTypeIOParam(HeapTuple typeTuple)
Definition: lsyscache.c:2250
Datum OidInputFunctionCall(Oid functionId, char *str, Oid typioparam, int32 typmod)
Definition: fmgr.c:1644

◆ typeByVal()

bool typeByVal ( Type  t)

Definition at line 611 of file parse_type.c.

References GETSTRUCT.

Referenced by coerce_type().

612 {
613  Form_pg_type typ;
614 
615  typ = (Form_pg_type) GETSTRUCT(t);
616  return typ->typbyval;
617 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:654
FormData_pg_type * Form_pg_type
Definition: pg_type.h:261

◆ typeidType()

Type typeidType ( Oid  id)

Definition at line 580 of file parse_type.c.

References elog, ERROR, HeapTupleIsValid, ObjectIdGetDatum, SearchSysCache1(), and TYPEOID.

Referenced by coerce_type(), and find_typmod_coercion_function().

581 {
582  HeapTuple tup;
583 
585  if (!HeapTupleIsValid(tup))
586  elog(ERROR, "cache lookup failed for type %u", id);
587  return (Type) tup;
588 }
#define ObjectIdGetDatum(X)
Definition: postgres.h:551
#define ERROR
Definition: elog.h:46
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:1127
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
#define elog(elevel,...)
Definition: elog.h:232

◆ typeidTypeRelid()

Oid typeidTypeRelid ( Oid  type_id)

Definition at line 670 of file parse_type.c.

References elog, ERROR, GETSTRUCT, HeapTupleIsValid, ObjectIdGetDatum, ReleaseSysCache(), SearchSysCache1(), generate_unaccent_rules::type, and TYPEOID.

Referenced by transformAssignmentIndirection(), and typeInheritsFrom().

671 {
672  HeapTuple typeTuple;
674  Oid result;
675 
676  typeTuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(type_id));
677  if (!HeapTupleIsValid(typeTuple))
678  elog(ERROR, "cache lookup failed for type %u", type_id);
679  type = (Form_pg_type) GETSTRUCT(typeTuple);
680  result = type->typrelid;
681  ReleaseSysCache(typeTuple);
682  return result;
683 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:654
unsigned int Oid
Definition: postgres_ext.h:31
#define ObjectIdGetDatum(X)
Definition: postgres.h:551
#define ERROR
Definition: elog.h:46
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:1127
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1175
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
FormData_pg_type * Form_pg_type
Definition: pg_type.h:261
#define elog(elevel,...)
Definition: elog.h:232

◆ typeLen()

int16 typeLen ( Type  t)

Definition at line 601 of file parse_type.c.

References GETSTRUCT.

Referenced by coerce_type().

602 {
603  Form_pg_type typ;
604 
605  typ = (Form_pg_type) GETSTRUCT(t);
606  return typ->typlen;
607 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:654
FormData_pg_type * Form_pg_type
Definition: pg_type.h:261

◆ TypeNameListToString()

char* TypeNameListToString ( List typenames)

Definition at line 494 of file parse_type.c.

References appendStringInfoChar(), appendTypeNameToBuffer(), initStringInfo(), lfirst_node, and list_head().

Referenced by does_not_exist_skipping().

495 {
497  ListCell *l;
498 
499  initStringInfo(&string);
500  foreach(l, typenames)
501  {
502  TypeName *typeName = lfirst_node(TypeName, l);
503 
504  if (l != list_head(typenames))
505  appendStringInfoChar(&string, ',');
506  appendTypeNameToBuffer(typeName, &string);
507  }
508  return string.data;
509 }
#define lfirst_node(type, lc)
Definition: pg_list.h:172
char string[11]
Definition: preproc-type.c:46
static ListCell * list_head(const List *l)
Definition: pg_list.h:125
static void appendTypeNameToBuffer(const TypeName *typeName, StringInfo string)
Definition: parse_type.c:441
void appendStringInfoChar(StringInfo str, char ch)
Definition: stringinfo.c:188
void initStringInfo(StringInfo str)
Definition: stringinfo.c:59

◆ TypeNameToString()

◆ typenameType()

Type typenameType ( ParseState pstate,
const TypeName typeName,
int32 typmod_p 
)

Definition at line 264 of file parse_type.c.

References ereport, errcode(), errmsg(), ERROR, GETSTRUCT, TypeName::location, LookupTypeName(), parser_errposition(), and TypeNameToString().

Referenced by AlterType(), ATExecAddColumn(), ATExecAddOf(), ATExecAlterColumnType(), DefineDomain(), DefineType(), transformColumnDefinition(), transformColumnType(), transformOfType(), typenameTypeId(), and typenameTypeIdAndMod().

265 {
266  Type tup;
267 
268  tup = LookupTypeName(pstate, typeName, typmod_p, false);
269  if (tup == NULL)
270  ereport(ERROR,
271  (errcode(ERRCODE_UNDEFINED_OBJECT),
272  errmsg("type \"%s\" does not exist",
273  TypeNameToString(typeName)),
274  parser_errposition(pstate, typeName->location)));
275  if (!((Form_pg_type) GETSTRUCT(tup))->typisdefined)
276  ereport(ERROR,
277  (errcode(ERRCODE_UNDEFINED_OBJECT),
278  errmsg("type \"%s\" is only a shell",
279  TypeNameToString(typeName)),
280  parser_errposition(pstate, typeName->location)));
281  return tup;
282 }
Type LookupTypeName(ParseState *pstate, const TypeName *typeName, int32 *typmod_p, bool missing_ok)
Definition: parse_type.c:38
#define GETSTRUCT(TUP)
Definition: htup_details.h:654
char * TypeNameToString(const TypeName *typeName)
Definition: parse_type.c:480
int errcode(int sqlerrcode)
Definition: elog.c:698
#define ERROR
Definition: elog.h:46
#define ereport(elevel,...)
Definition: elog.h:157
int location
Definition: parsenodes.h:228
FormData_pg_type * Form_pg_type
Definition: pg_type.h:261
int parser_errposition(ParseState *pstate, int location)
Definition: parse_node.c:111
int errmsg(const char *fmt,...)
Definition: elog.c:909

◆ typenameTypeId()

Oid typenameTypeId ( ParseState pstate,
const TypeName typeName 
)

Definition at line 291 of file parse_type.c.

References GETSTRUCT, ReleaseSysCache(), and typenameType().

Referenced by AlterDomainAddConstraint(), AlterDomainDefault(), AlterDomainDropConstraint(), AlterDomainNotNull(), AlterDomainValidateConstraint(), AlterEnum(), AlterTypeNamespace(), check_object_ownership(), CreateCast(), CreateFunction(), CreateTransform(), DefineAggregate(), DefineOpClass(), DefineOperator(), DefineRange(), DefineRelation(), DefineType(), init_params(), objectNamesToOids(), PrepareQuery(), processTypesSpec(), RenameConstraint(), RenameType(), and transformAlterTableStmt().

292 {
293  Oid typoid;
294  Type tup;
295 
296  tup = typenameType(pstate, typeName, NULL);
297  typoid = ((Form_pg_type) GETSTRUCT(tup))->oid;
298  ReleaseSysCache(tup);
299 
300  return typoid;
301 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:654
Type typenameType(ParseState *pstate, const TypeName *typeName, int32 *typmod_p)
Definition: parse_type.c:264
unsigned int Oid
Definition: postgres_ext.h:31
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1175
FormData_pg_type * Form_pg_type
Definition: pg_type.h:261

◆ typenameTypeIdAndMod()

void typenameTypeIdAndMod ( ParseState pstate,
const TypeName typeName,
Oid typeid_p,
int32 typmod_p 
)

Definition at line 310 of file parse_type.c.

References GETSTRUCT, ReleaseSysCache(), and typenameType().

Referenced by addRangeTableEntryForFunction(), ATExecAddColumn(), ATPrepAlterColumnType(), BuildDescForRelation(), flatten_set_variable_args(), MergeAttributes(), revalidate_rectypeid(), transformRangeTableFunc(), transformTypeCast(), and transformXmlSerialize().

312 {
313  Type tup;
314 
315  tup = typenameType(pstate, typeName, typmod_p);
316  *typeid_p = ((Form_pg_type) GETSTRUCT(tup))->oid;
317  ReleaseSysCache(tup);
318 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:654
Type typenameType(ParseState *pstate, const TypeName *typeName, int32 *typmod_p)
Definition: parse_type.c:264
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1175
FormData_pg_type * Form_pg_type
Definition: pg_type.h:261

◆ typeOrDomainTypeRelid()

Oid typeOrDomainTypeRelid ( Oid  type_id)

Definition at line 691 of file parse_type.c.

References elog, ERROR, GETSTRUCT, HeapTupleIsValid, ObjectIdGetDatum, ReleaseSysCache(), SearchSysCache1(), generate_unaccent_rules::type, and TYPEOID.

Referenced by typeInheritsFrom(), and typeIsOfTypedTable().

692 {
693  HeapTuple typeTuple;
695  Oid result;
696 
697  for (;;)
698  {
699  typeTuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(type_id));
700  if (!HeapTupleIsValid(typeTuple))
701  elog(ERROR, "cache lookup failed for type %u", type_id);
702  type = (Form_pg_type) GETSTRUCT(typeTuple);
703  if (type->typtype != TYPTYPE_DOMAIN)
704  {
705  /* Not a domain, so done looking through domains */
706  break;
707  }
708  /* It is a domain, so examine the base type instead */
709  type_id = type->typbasetype;
710  ReleaseSysCache(typeTuple);
711  }
712  result = type->typrelid;
713  ReleaseSysCache(typeTuple);
714  return result;
715 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:654
unsigned int Oid
Definition: postgres_ext.h:31
#define ObjectIdGetDatum(X)
Definition: postgres.h:551
#define ERROR
Definition: elog.h:46
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:1127
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1175
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
FormData_pg_type * Form_pg_type
Definition: pg_type.h:261
#define elog(elevel,...)
Definition: elog.h:232

◆ typeStringToTypeName()

TypeName* typeStringToTypeName ( const char *  str)

Definition at line 735 of file parse_type.c.

References ErrorContextCallback::arg, Assert, ErrorContextCallback::callback, ereport, errcode(), errmsg(), ERROR, error_context_stack, linitial_node, list_length(), ErrorContextCallback::previous, pts_error_callback(), RAW_PARSE_TYPE_NAME, raw_parser(), TypeName::setof, and unconstify.

Referenced by parseTypeString(), and pg_get_object_address().

736 {
737  List *raw_parsetree_list;
738  TypeName *typeName;
739  ErrorContextCallback ptserrcontext;
740 
741  /* make sure we give useful error for empty input */
742  if (strspn(str, " \t\n\r\f") == strlen(str))
743  goto fail;
744 
745  /*
746  * Setup error traceback support in case of ereport() during parse
747  */
748  ptserrcontext.callback = pts_error_callback;
749  ptserrcontext.arg = unconstify(char *, str);
750  ptserrcontext.previous = error_context_stack;
751  error_context_stack = &ptserrcontext;
752 
753  raw_parsetree_list = raw_parser(str, RAW_PARSE_TYPE_NAME);
754 
755  error_context_stack = ptserrcontext.previous;
756 
757  /* We should get back exactly one TypeName node. */
758  Assert(list_length(raw_parsetree_list) == 1);
759  typeName = linitial_node(TypeName, raw_parsetree_list);
760 
761  /* The grammar allows SETOF in TypeName, but we don't want that here. */
762  if (typeName->setof)
763  goto fail;
764 
765  return typeName;
766 
767 fail:
768  ereport(ERROR,
769  (errcode(ERRCODE_SYNTAX_ERROR),
770  errmsg("invalid type name \"%s\"", str)));
771  return NULL; /* keep compiler quiet */
772 }
int errcode(int sqlerrcode)
Definition: elog.c:698
#define linitial_node(type, l)
Definition: pg_list.h:177
void(* callback)(void *arg)
Definition: elog.h:247
struct ErrorContextCallback * previous
Definition: elog.h:246
ErrorContextCallback * error_context_stack
Definition: elog.c:93
#define ERROR
Definition: elog.h:46
bool setof
Definition: parsenodes.h:223
static void pts_error_callback(void *arg)
Definition: parse_type.c:721
#define unconstify(underlying_type, expr)
Definition: c.h:1243
#define ereport(elevel,...)
Definition: elog.h:157
#define Assert(condition)
Definition: c.h:804
static int list_length(const List *l)
Definition: pg_list.h:149
int errmsg(const char *fmt,...)
Definition: elog.c:909
List * raw_parser(const char *str, RawParseMode mode)
Definition: parser.c:42
Definition: pg_list.h:50

◆ typeTypeCollation()

Oid typeTypeCollation ( Type  typ)

Definition at line 642 of file parse_type.c.

References GETSTRUCT.

Referenced by coerce_type().

643 {
644  Form_pg_type typtup;
645 
646  typtup = (Form_pg_type) GETSTRUCT(typ);
647  return typtup->typcollation;
648 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:654
FormData_pg_type * Form_pg_type
Definition: pg_type.h:261

◆ typeTypeId()

Oid typeTypeId ( Type  tp)

Definition at line 592 of file parse_type.c.

References elog, ERROR, and GETSTRUCT.

Referenced by AlterType(), AlterTypeOwner(), compute_return_type(), FuncNameAsType(), get_object_address_type(), and interpret_function_parameter_list().

593 {
594  if (tp == NULL) /* probably useless */
595  elog(ERROR, "typeTypeId() called with NULL type struct");
596  return ((Form_pg_type) GETSTRUCT(tp))->oid;
597 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:654
#define ERROR
Definition: elog.h:46
FormData_pg_type * Form_pg_type
Definition: pg_type.h:261
#define elog(elevel,...)
Definition: elog.h:232

◆ typeTypeName()

char* typeTypeName ( Type  t)

Definition at line 621 of file parse_type.c.

References GETSTRUCT, NameStr, and pstrdup().

Referenced by coerce_type().

622 {
623  Form_pg_type typ;
624 
625  typ = (Form_pg_type) GETSTRUCT(t);
626  /* pstrdup here because result may need to outlive the syscache entry */
627  return pstrdup(NameStr(typ->typname));
628 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:654
char * pstrdup(const char *in)
Definition: mcxt.c:1299
FormData_pg_type * Form_pg_type
Definition: pg_type.h:261
#define NameStr(name)
Definition: c.h:681

◆ typeTypeRelid()

Oid typeTypeRelid ( Type  typ)

Definition at line 632 of file parse_type.c.

References GETSTRUCT.

Referenced by FuncNameAsType().

633 {
634  Form_pg_type typtup;
635 
636  typtup = (Form_pg_type) GETSTRUCT(typ);
637  return typtup->typrelid;
638 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:654
FormData_pg_type * Form_pg_type
Definition: pg_type.h:261