parse_type.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:5k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * parse_type.c
  4.  * handle type operations for parser
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/parser/parse_type.c,v 1.22 1999/05/29 03:17:19 tgl Exp $
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. #include <string.h>
  15. #include "postgres.h"
  16. #include "fmgr.h"
  17. #include "nodes/nodes.h"
  18. #include "nodes/parsenodes.h"
  19. #include "nodes/primnodes.h"
  20. #include "parser/parse_node.h"
  21. #include "catalog/pg_type.h"
  22. #include "parser/parse_target.h"
  23. #include "parser/parse_type.h"
  24. #include "utils/syscache.h"
  25. /* check to see if a type id is valid,
  26.  * returns true if it is. By using this call before calling
  27.  * typeidType or typeidTypeName, more meaningful error messages
  28.  * can be produced because the caller typically has more context of
  29.  * what's going on                 - jolly
  30.  */
  31. bool
  32. typeidIsValid(Oid id)
  33. {
  34. return (SearchSysCacheTuple(TYPOID,
  35. ObjectIdGetDatum(id),
  36. 0, 0, 0) != NULL);
  37. }
  38. /* return a type name, given a typeid */
  39. char *
  40. typeidTypeName(Oid id)
  41. {
  42. HeapTuple tup;
  43. Form_pg_type typetuple;
  44. if (!(tup = SearchSysCacheTuple(TYPOID,
  45. ObjectIdGetDatum(id),
  46. 0, 0, 0)))
  47. {
  48. elog(ERROR, "Unable to locate type oid %u in catalog", id);
  49. return NULL;
  50. }
  51. typetuple = (Form_pg_type) GETSTRUCT(tup);
  52. return (typetuple->typname).data;
  53. }
  54. /* return a Type structure, given a type id */
  55. Type
  56. typeidType(Oid id)
  57. {
  58. HeapTuple tup;
  59. if (!(tup = SearchSysCacheTuple(TYPOID,
  60. ObjectIdGetDatum(id),
  61. 0, 0, 0)))
  62. {
  63. elog(ERROR, "Unable to locate type oid %u in catalog", id);
  64. return NULL;
  65. }
  66. return (Type) tup;
  67. }
  68. /* return a Type structure, given type name */
  69. Type
  70. typenameType(char *s)
  71. {
  72. HeapTuple tup;
  73. if (s == NULL)
  74. elog(ERROR, "type(): Null type");
  75. if (!(tup = SearchSysCacheTuple(TYPNAME,
  76. PointerGetDatum(s),
  77. 0, 0, 0)))
  78. elog(ERROR, "Unable to locate type name '%s' in catalog", s);
  79. return (Type) tup;
  80. }
  81. /* given type, return the type OID */
  82. Oid
  83. typeTypeId(Type tp)
  84. {
  85. if (tp == NULL)
  86. elog(ERROR, "typeTypeId() called with NULL type struct");
  87. return tp->t_data->t_oid;
  88. }
  89. /* given type (as type struct), return the length of type */
  90. int16
  91. typeLen(Type t)
  92. {
  93. Form_pg_type typ;
  94. typ = (Form_pg_type) GETSTRUCT(t);
  95. return typ->typlen;
  96. }
  97. /* given type (as type struct), return the value of its 'byval' attribute.*/
  98. bool
  99. typeByVal(Type t)
  100. {
  101. Form_pg_type typ;
  102. typ = (Form_pg_type) GETSTRUCT(t);
  103. return typ->typbyval;
  104. }
  105. /* given type (as type struct), return the name of type */
  106. char *
  107. typeTypeName(Type t)
  108. {
  109. Form_pg_type typ;
  110. typ = (Form_pg_type) GETSTRUCT(t);
  111. return (typ->typname).data;
  112. }
  113. /* given a type, return its typetype ('c' for 'c'atalog types) */
  114. char
  115. typeTypeFlag(Type t)
  116. {
  117. Form_pg_type typ;
  118. typ = (Form_pg_type) GETSTRUCT(t);
  119. return typ->typtype;
  120. }
  121. /* Given a type structure and a string, returns the internal form of
  122.    that string */
  123. char *
  124. stringTypeString(Type tp, char *string, int32 atttypmod)
  125. {
  126. Oid op;
  127. Oid typelem;
  128. op = ((Form_pg_type) GETSTRUCT(tp))->typinput;
  129. typelem = ((Form_pg_type) GETSTRUCT(tp))->typelem; /* XXX - used for
  130.  * array_in */
  131. return (char *) fmgr(op, string, typelem, atttypmod);
  132. }
  133. /* Given a type id, returns the out-conversion function of the type */
  134. #ifdef NOT_USED
  135. Oid
  136. typeidOutfunc(Oid type_id)
  137. {
  138. HeapTuple typeTuple;
  139. Form_pg_type type;
  140. Oid outfunc;
  141. typeTuple = SearchSysCacheTuple(TYPOID,
  142. ObjectIdGetDatum(type_id),
  143. 0, 0, 0);
  144. if (!HeapTupleIsValid(typeTuple))
  145. elog(ERROR, "typeidOutfunc: Invalid type - oid = %u", type_id);
  146. type = (Form_pg_type) GETSTRUCT(typeTuple);
  147. outfunc = type->typoutput;
  148. return outfunc;
  149. }
  150. #endif
  151. Oid
  152. typeidTypeRelid(Oid type_id)
  153. {
  154. HeapTuple typeTuple;
  155. Form_pg_type type;
  156. typeTuple = SearchSysCacheTuple(TYPOID,
  157. ObjectIdGetDatum(type_id),
  158. 0, 0, 0);
  159. if (!HeapTupleIsValid(typeTuple))
  160. elog(ERROR, "typeidTypeRelid: Invalid type - oid = %u", type_id);
  161. type = (Form_pg_type) GETSTRUCT(typeTuple);
  162. return type->typrelid;
  163. }
  164. Oid
  165. typeTypeRelid(Type typ)
  166. {
  167. Form_pg_type typtup;
  168. typtup = (Form_pg_type) GETSTRUCT(typ);
  169. return typtup->typrelid;
  170. }
  171. Oid
  172. typeTypElem(Type typ)
  173. {
  174. Form_pg_type typtup;
  175. typtup = (Form_pg_type) GETSTRUCT(typ);
  176. return typtup->typelem;
  177. }
  178. /* Given the attribute type of an array return the attribute type of
  179.    an element of the array */
  180. Oid
  181. GetArrayElementType(Oid typearray)
  182. {
  183. HeapTuple type_tuple;
  184. Form_pg_type type_struct_array;
  185. type_tuple = SearchSysCacheTuple(TYPOID,
  186.  ObjectIdGetDatum(typearray),
  187.  0, 0, 0);
  188. if (!HeapTupleIsValid(type_tuple))
  189. elog(ERROR, "GetArrayElementType: Cache lookup failed for type %u",
  190.  typearray);
  191. /* get the array type struct from the type tuple */
  192. type_struct_array = (Form_pg_type) GETSTRUCT(type_tuple);
  193. if (type_struct_array->typelem == InvalidOid)
  194. {
  195. elog(ERROR, "GetArrayElementType: type %s is not an array",
  196.  type_struct_array->typname);
  197. }
  198. return type_struct_array->typelem;
  199. }
  200. /* Given a type structure, return the in-conversion function of the type */
  201. Oid
  202. typeInfunc(Type typ)
  203. {
  204. Form_pg_type typtup;
  205. typtup = (Form_pg_type) GETSTRUCT(typ);
  206. return typtup->typinput;
  207. }