Gen_fmgrtab.sh.in
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:7k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. #!/bin/sh
  2. #-------------------------------------------------------------------------
  3. #
  4. # Gen_fmgrtab.sh--
  5. #    shell script to generate fmgr.h and fmgrtab.c from pg_proc.h
  6. #
  7. # Copyright (c) 1994, Regents of the University of California
  8. #
  9. #
  10. # IDENTIFICATION
  11. #    $Header: /usr/local/cvsroot/pgsql/src/backend/utils/Gen_fmgrtab.sh.in,v 1.15.2.1 1999/08/02 05:24:47 scrappy Exp $
  12. #
  13. # NOTES
  14. #    Passes any -D options on to cpp prior to generating the list
  15. #    of internal functions.  These come from BKIOPTS.
  16. #
  17. #-------------------------------------------------------------------------
  18. if [ $? != 0 ]
  19. then
  20. echo `basename $0`: Bad option
  21. exit 1
  22. fi
  23. BKIOPTS=''
  24. #
  25. # Pass on any -D declarations, throwing away any other command
  26. # line switches.
  27. #
  28. for opt in $*
  29. do
  30. case $opt in
  31. -D) BKIOPTS="$BKIOPTS -D$2"; shift; shift;;
  32. -D*) BKIOPTS="$BKIOPTS $1";shift;;
  33. --) shift; break;;
  34. -*) shift;;
  35. esac
  36. done
  37. INFILE=$1
  38. RAWFILE=fmgr.raw
  39. CPPTMPFILE=fmgrtmp.c
  40. HFILE=fmgr.h
  41. TABCFILE=fmgrtab.c
  42. #
  43. # Generate the file containing raw pg_proc tuple data
  44. # (but only for "internal" language procedures...).
  45. #
  46. # Unlike genbki.sh, which can run through cpp last, we have to
  47. # deal with preprocessor statements first (before we sort the
  48. # function table by oid).
  49. #
  50. awk '
  51. BEGIN { raw = 0; }
  52. /^DATA/ { print; next; }
  53. /^BKI_BEGIN/ { raw = 1; next; }
  54. /^BKI_END/ { raw = 0; next; }
  55. raw == 1 { print; next; }' $INFILE | 
  56. sed  -e 's/^.*OID[^=]*=[^0-9]*//' 
  57. -e 's/(//g' 
  58. -e 's/[  ]*).*$//' | 
  59. awk '
  60. /^#/ { print; next; }
  61. $4 == "11" { print; next; }' > $CPPTMPFILE
  62. @CPP@ $BKIOPTS $CPPTMPFILE | 
  63. egrep '^[0-9]' | 
  64. sort -n > $RAWFILE
  65. rm -f $CPPTMPFILE
  66. #
  67. # Generate fmgr.h
  68. #
  69. cat > $HFILE <<FuNkYfMgRsTuFf
  70. /*-------------------------------------------------------------------------
  71.  *
  72.  * $HFILE--
  73.  *    Definitions for using internal procedures.
  74.  *
  75.  *
  76.  * Copyright (c) 1994, Regents of the University of California
  77.  *
  78.  * $Id: Gen_fmgrtab.sh.in,v 1.15.2.1 1999/08/02 05:24:47 scrappy Exp $
  79.  *
  80.  * NOTES
  81.  * ******************************
  82.  * *** DO NOT EDIT THIS FILE! ***
  83.  * ******************************
  84.  *
  85.  * It has been GENERATED by $0
  86.  * from $1
  87.  *
  88.  *-------------------------------------------------------------------------
  89.  */
  90. #ifndef FMGR_H
  91. #define FMGR_H
  92. #include "postgres.h"
  93. /*
  94.  * Maximum number of arguments for a built-in function.
  95.  *
  96.  * XXX note that you cannot call a function with more than 8 
  97.  *     arguments from the user level since the catalogs only 
  98.  *     store 8 argument type values for type-checking ...
  99.  */
  100. #define MAXFMGRARGS 9
  101. typedef struct {
  102.     char *data[MAXFMGRARGS];
  103. } FmgrValues;
  104. typedef struct {
  105.     func_ptr fn_addr;
  106.     func_ptr fn_plhandler;
  107.     Oid fn_oid;
  108.     int fn_nargs;
  109. } FmgrInfo;
  110. /*
  111.  * defined in fmgr.c
  112.  */
  113. extern char *fmgr_c(FmgrInfo *finfo, FmgrValues *values, bool *isNull);
  114. extern void fmgr_info(Oid procedureId, FmgrInfo *finfo);
  115. extern char *fmgr(Oid procedureId, ... );
  116. extern char *fmgr_ptr(FmgrInfo *finfo, ... );
  117. extern char *fmgr_array_args(Oid procedureId, int nargs, 
  118.      char *args[], bool *isNull);
  119. /*
  120.  * defined in dfmgr.c
  121.  */
  122. extern func_ptr fmgr_dynamic(Oid procedureId, int *pronargs);
  123. extern void load_file(char *filename);
  124. /*
  125.  * For performance reasons, we often want to simply jump through a
  126.  * a function pointer (if it's valid, that is).  These calls have
  127.  * been macroized so we can run them through a routine that does
  128.  * sanity-checking (and so we can track them down more easily when
  129.  * we must).
  130.  */
  131. /* We don't make this static so fmgr_faddr() macros can access it */
  132. FmgrInfo        *fmgr_pl_finfo;
  133. #define fmgr_faddr(finfo) 
  134. fmgr_pl_finfo = (finfo), 
  135. (func_ptr)(finfo)->fn_addr 
  136. )
  137. #ifdef TRACE_FMGR_PTR
  138. #define FMGR_PTR2(FINFO, ARG1, ARG2) 
  139. fmgr_ptr(FINFO, 2, ARG1, ARG2)
  140. #else
  141. #define FMGR_PTR2(FINFO, ARG1, ARG2) 
  142. ((FINFO)->fn_addr) ? 
  143. (*(fmgr_faddr(FINFO)))(ARG1, ARG2) 
  144. fmgr((FINFO)->fn_oid, ARG1, ARG2) 
  145. )
  146. #endif
  147. /*
  148.  * Flags for the builtin oprrest selectivity routines.
  149.  */
  150. #define SEL_CONSTANT  1 /* constant does not vary (not a parameter) */
  151. #define SEL_RIGHT 2  /* constant appears to right of operator */
  152. /*
  153.  * Constant macros for the OIDs of entries in pg_proc.
  154.  * NOTE: if the same "proname" is used for more than one
  155.  * internal-function entry in pg_proc, the equivalent macro
  156.  * will be defined with the lowest OID among those entries.
  157.  */
  158. FuNkYfMgRsTuFf
  159. @TR@ @TRARGS@ < $RAWFILE | 
  160. awk '
  161. BEGIN { OFS = ""; }
  162. { if (seenit[$2]++ == 0) print "#define F_", $2, " ", $1; }' >> $HFILE
  163. cat >> $HFILE <<FuNkYfMgRsTuFf
  164. #endif /* FMGR_H */
  165. FuNkYfMgRsTuFf
  166. #
  167. # Generate fmgr function table file.
  168. #
  169. # Print out the bogus function declarations, then the table that
  170. # refers to them.
  171. #
  172. cat > $TABCFILE <<FuNkYfMgRtAbStUfF
  173. /*-------------------------------------------------------------------------
  174.  *
  175.  * $TABCFILE--
  176.  *    The function manager's table of internal functions.
  177.  *
  178.  * Copyright (c) 1994, Regents of the University of California
  179.  *
  180.  *
  181.  * IDENTIFICATION
  182.  *    $Header: /usr/local/cvsroot/pgsql/src/backend/utils/Gen_fmgrtab.sh.in,v 1.15.2.1 1999/08/02 05:24:47 scrappy Exp $
  183.  *
  184.  * NOTES
  185.  *
  186.  * ******************************
  187.  * *** DO NOT EDIT THIS FILE! ***
  188.  * ******************************
  189.  *
  190.  * It has been GENERATED by $0
  191.  * from $1
  192.  *
  193.  * We lie here to cc about the return type and arguments of the
  194.  * builtin functions; all ld cares about is the fact that it
  195.  * will need to resolve an external function reference.
  196.  *
  197.  *-------------------------------------------------------------------------
  198.  */
  199. #include <string.h>
  200. #include "postgres.h"
  201. #include "utils/fmgrtab.h"
  202. FuNkYfMgRtAbStUfF
  203. awk '{ print "extern char *", $(NF-1), "();"; }' $RAWFILE >> $TABCFILE
  204. cat >> $TABCFILE <<FuNkYfMgRtAbStUfF
  205. static FmgrCall fmgr_builtins[] = {
  206. FuNkYfMgRtAbStUfF
  207. awk '{ printf ("  {%d, %d, %s, "%s" },n"), $1, $8, $(NF-1), $(NF-1) }' $RAWFILE >> $TABCFILE
  208. cat >> $TABCFILE <<FuNkYfMgRtAbStUfF
  209.   /* dummy entry is easier than getting rid of comma after last real one */
  210.   { 0, 0, (func_ptr) NULL, NULL }
  211. };
  212. /* Note FMGR_NBUILTINS excludes the dummy entry */
  213. #define FMGR_NBUILTINS  ((sizeof(fmgr_builtins) / sizeof(FmgrCall)) - 1)
  214. FmgrCall *fmgr_isbuiltin(Oid id)
  215. {
  216.     int low = 0;
  217.     int high = FMGR_NBUILTINS - 1;
  218.     /* Loop invariant: low is the first index that could contain target
  219.      * entry, and high is the last index that could contain it.
  220.      */
  221. while (low <= high) {
  222. int i = (high + low) / 2;
  223. FmgrCall * ptr = &fmgr_builtins[i];
  224. if (id == ptr->proid)
  225. return ptr;
  226. else if (id > ptr->proid)
  227. low = i + 1;
  228. else
  229. high = i - 1;
  230. }
  231. return (FmgrCall *) NULL;
  232. }
  233. func_ptr fmgr_lookupByName(char *name) 
  234. {
  235. /* Lookup a builtin by name.  Note there can be more than one entry in
  236.  * the array matching this name, but they should all point to the same
  237.  * routine.
  238.  */
  239.     int i;
  240.     for (i=0; i<FMGR_NBUILTINS; i++) {
  241. if (strcmp(name, fmgr_builtins[i].funcName) == 0)
  242. return fmgr_builtins[i].func;
  243.     }
  244.     return (func_ptr) NULL;
  245. }
  246. FuNkYfMgRtAbStUfF
  247. rm -f $RAWFILE
  248. # ----------------
  249. # all done
  250. # ----------------
  251. exit 0