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

数据库系统

开发平台:

Unix_Linux

  1. ." This is -*-nroff-*-
  2. ." XXX standard disclaimer belongs here....
  3. ." $Header: /usr/local/cvsroot/pgsql/src/man/Attic/create_function.l,v 1.11 1999/05/20 02:44:53 tgl Exp $
  4. .TH "CREATE FUNCTION" SQL 11/05/95 PostgreSQL PostgreSQL
  5. .SH "NAME"
  6. create function - define a new function
  7. .SH "SYNOPSIS"
  8. .nf
  9. fBcreate functionfP function_name 
  10. fB(fP[type1 {, type-n}]fB)fP
  11. fBreturnsfP type-r
  12. fBasfP { '/full/path/to/objectfile' | 'sql-queries' |
  13.                    'builtin-function-name' | 'pl-program-text' }
  14. fBlanguagefP { 'c' | 'sql' | 'internal' | 'plname' }
  15. .fi
  16. .SH "DESCRIPTION"
  17. With this command, a Postgres user can register a function with Postgres.
  18. Subsequently, this user is treated as the owner of the function.
  19. .PP
  20. When defining a function with arguments, the input data types,
  21. .IR type-1 ,
  22. .IR type-2 ,
  23. &...,
  24. .IR type-n ,
  25. and the return data type,
  26. .IR type-r
  27. must be specified, along with the language, which may be
  28. .IR "*(lqc*(rq"
  29. or
  30. .IR "*(lqsql*(rq" .
  31. or
  32. .IR "*(lqinternal*(rq" .
  33. or
  34. .IR "*(lqplname*(rq" .
  35. (The
  36. .IR "plname"
  37. is the language name of a created procedural language. See
  38. create_language(l) for details.)
  39. (The argument list
  40. may be left out if the function has no arguments, or
  41. alternatively the argument list may be left empty.)
  42. The input types may be base or complex types, or 
  43. .IR opaque .
  44. .IR Opaque
  45. indicates that the function accepts arguments of an
  46. invalid type such as (char *).
  47. The output type may be specified as a base type, complex type, 
  48. .IR "setof <type>",
  49. or 
  50. .IR opaque .
  51. The 
  52. .IR setof
  53. modifier indicates that the function will return a set of items,
  54. rather than a single item.  
  55. The
  56. .IR as
  57. clause of the command is treated differently depending on the language,
  58. as explained below.
  59. .SH "INTERNAL FUNCTIONS"
  60. Internal functions are functions written in C which have been statically
  61. linked into the postgres backend process.  The 
  62. .BR as
  63. clause gives the C-language name of the function, which need not be the
  64. same as the name being declared for SQL use.  (For reasons of backwards
  65. compatibility, an empty
  66. .BR as
  67. string is accepted as meaning that the C-language function name is the
  68. same as the SQL name.)  Normally, all internal functions present in the
  69. backend are declared as SQL functions during database initialization,
  70. but a user could use
  71. .BR "create function"
  72. to create additional alias names for an internal function.
  73. .SH "C FUNCTIONS"
  74. Functions written in C can be defined to Postgres, which will dynamically
  75. load them into its address space.  The
  76. .IR as
  77. clause gives the full path name of the object file that contains the
  78. function.  This file is loaded either using
  79. .IR load(l)
  80. or automatically the first time the function is necessary for
  81. execution. Repeated execution of a function will cause negligible
  82. additional overhead, as the function will remain in a main memory
  83. cache.
  84. .SH "Writing C Functions"
  85. For a C function, the string following 
  86. .BR as
  87. should be the
  88. .BR "FULL PATH"
  89. of the object code file for the function, bracketed by quotation
  90. marks.  (Postgres will not compile a function automatically - it must
  91. be compiled before it is used in a
  92. .BR "create function"
  93. command.  See below for additional information.)
  94. .PP
  95. C functions with base type arguments can be written in a
  96. straightforward fashion.  The C equivalents of built-in Postgres types
  97. are accessible in a C file if 
  98. .nf
  99. &.../src/backend/utils/builtins.h
  100. .fi
  101. is included as a header file.  This can be achieved by having
  102. .nf
  103. &#include <utils/builtins.h>
  104. .fi
  105. at the top of the C source file and by compiling all C files with the
  106. following include options:
  107. .nf
  108. -I.../src/backend
  109. -I.../src/backend/port/<portname>
  110. -I.../src/backend/obj
  111. .fi
  112. before any *(lq.c*(rq programs in the 
  113. .IR cc
  114. command line, e.g.:
  115. .nf
  116. cc -I.../src/backend e
  117.    -I.../src/backend/port/<portname> e
  118.    -I.../src/backend/obj e
  119.    -c progname.c
  120. .fi
  121. where *(lq...*(rq is the path to the installed Postgres source tree and
  122. *(lq<portname>*(rq is the name of the port for which the source tree
  123. has been built.
  124. .PP
  125. The convention for passing arguments to and from the user's C
  126. functions is to use pass-by-value for data types that are 32 bits (4
  127. bytes) or smaller, and pass-by-reference for data types that require
  128. more than 32 bits.
  129. .if t {
  130. The following table gives the C type required for parameters in the C
  131. functions that will be loaded into Postgres.  The *(lqDefined In*(rq
  132. column gives the actual header file (in the
  133. .nf
  134. &.../src/backend
  135. .fi
  136. directory) that the equivalent C type is defined.  However, if you
  137. include *(lqutils/builtins.h*(rq, these files will automatically be
  138. included.
  139. .SH "Equivalent C Types for Built-In Postgres Types"
  140. .PP
  141. .TS
  142. center;
  143. l l l
  144. l l l.
  145. fBBuilt-In TypefP fBC TypefP fBDefined InfP
  146. _
  147. abstime  AbsoluteTime utils/nabstime.h
  148. bool bool include/c.h
  149. box (BOX *)  utils/geo-decls.h
  150. bytea (bytea *) include/postgres.h
  151. char char N/A
  152. cid CID include/postgres.h
  153. int2 int2 include/postgres.h
  154. int28 (int28 *) include/postgres.h
  155. int4 int4 include/postgres.h
  156. float4 float32 or (float4 *) include/c.h or include/postgres.h
  157. float8 float64 or (float8 *) include/c.h or include/postgres.h
  158. lseg (LSEG *) include/geo-decls.h
  159. name (Name) include/postgres.h
  160. oid oid include/postgres.h
  161. oid8 (oid8 *) include/postgres.h
  162. path (PATH *) utils/geo-decls.h
  163. point (POINT *) utils/geo-decls.h
  164. regproc  regproc or REGPROC include/postgres.h
  165. reltime  RelativeTime  utils/nabstime.h
  166. text (text *) include/postgres.h
  167. tid ItemPointer storage/itemptr.h
  168. tinterval TimeInterval utils/nabstime.h
  169. uint2 uint16 include/c.h
  170. uint4 uint32 include/c.h
  171. xid (XID *)  include/postgres.h
  172. .TE
  173. }
  174. .PP
  175. Complex arguments to C functions are passed into the C function as a
  176. special C type, TUPLE, defined in
  177. .nf
  178. &.../src/libpq/libpq-fe.h.
  179. .fi
  180. Given a variable 
  181. .IR t
  182. of this type, the C function may extract attributes from the function
  183. using the function call:
  184. .nf
  185. GetAttributeByName(t, "fieldname", &isnull)
  186. .fi
  187. where 
  188. .IR isnull
  189. is a pointer to a 
  190. .IR bool ,
  191. which the function sets to
  192. .IR true
  193. if the field is null.  The result of this function should be cast
  194. appropriately as shown in the examples below.
  195. .SH "Compiling Dynamically-Loaded C Functions"
  196. .PP
  197. Different operating systems require different procedures for compiling
  198. C source files so that Postgres can load them dynamically.  This section
  199. discusses the required compiler and loader options on each system.
  200. .PP
  201. Under Linux ELF, object files can be generated by specifing the compiler
  202. flag -fpic.
  203. .PP
  204. Under Ultrix, all object files that Postgres is expected to load
  205. dynamically must be compiled using
  206. .IR /bin/cc
  207. with the *(lq-G 0*(rq option turned on.  The object file name in the
  208. .IR as
  209. clause should end in *(lq.o*(rq.
  210. .PP
  211. Under HP-UX, DEC OSF/1, AIX and SunOS 4, all object files must be
  212. turned into
  213. .IR "shared libraries"
  214. using the operating system's native object file loader,
  215. .IR ld(1).
  216. .PP
  217. Under HP-UX, an object file must be compiled using the native HP-UX C
  218. compiler,
  219. .IR /bin/cc ,
  220. with both the *(lq+z*(rq and *(lq+u*(rq flags turned on.  The
  221. first flag turns the object file into *(lqposition-independent
  222. code*(rq (PIC); the second flag removes some alignment restrictions
  223. that the PA-RISC architecture normally enforces.  The object file must
  224. then be turned into a shared library using the HP-UX loader,
  225. .IR /bin/ld .
  226. The command lines to compile a C source file, *(lqfoo.c*(rq, look
  227. like:
  228. .nf
  229. cc <other flags> +z +u -c foo.c
  230. ld <other flags> -b -o foo.sl foo.o
  231. .fi
  232. The object file name in the
  233. .BR as
  234. clause should end in *(lq.sl*(rq.
  235. .PP
  236. An extra step is required under versions of HP-UX prior to 9.00.  If
  237. the Postgres header file
  238. .nf
  239. include/c.h
  240. .fi
  241. is not included in the source file, then the following line must also
  242. be added at the top of every source file:
  243. .nf
  244. #pragma HP_ALIGN HPUX_NATURAL_S500
  245. .fi
  246. However, this line must not appear in programs compiled under HP-UX
  247. 9.00 or later.
  248. .PP
  249. Under DEC OSF/1, an object file must be compiled and then turned
  250. into a shared library using the OSF/1 loader,
  251. .IR /bin/ld .
  252. In this case, the command lines look like:
  253. .nf
  254. cc <other flags> -c foo.c
  255. ld <other flags> -shared -expect_unresolved '*' -o foo.so foo.o
  256. .fi
  257. The object file name in the
  258. .BR as
  259. clause should end in *(lq.so*(rq.
  260. .PP
  261. Under SunOS 4, an object file must be compiled and then turned into a
  262. shared library using the SunOS 4 loader,
  263. .IR /bin/ld .
  264. The command lines look like:
  265. .nf
  266. cc <other flags> -PIC -c foo.c
  267. ld <other flags> -dc -dp -Bdynamic -o foo.so foo.o
  268. .fi
  269. The object file name in the
  270. .BR as
  271. clause should end in *(lq.so*(rq.
  272. .PP
  273. Under AIX, object files are compiled normally but building the shared
  274. library requires a couple of steps.  First, create the object file:
  275. .nf
  276. cc <other flags> -c foo.c
  277. .fi
  278. You must then create a symbol *(lqexports*(rq file for the object
  279. file:
  280. .nf
  281. mkldexport foo.o `pwd` > foo.exp
  282. .fi
  283. Finally, you can create the shared library:
  284. .nf
  285. ld <other flags> -H512 -T512 -o foo.so -e _nostart e
  286.    -bI:.../lib/postgres.exp -bE:foo.exp foo.o e
  287.    -lm -lc 2>/dev/null
  288. .fi
  289. You should look at the Postgres User's Manual for an explanation of this
  290. procedure.
  291. .SH "SQL FUNCTIONS"
  292. SQL functions execute an arbitrary list of SQL queries, returning
  293. the results of the last query in the list.  SQL functions in general
  294. return sets.  If their returntype is not specified as a
  295. .IR setof ,
  296. then an arbitrary element of the last query's result will be returned.
  297. .PP
  298. The body of a SQL function following
  299. .BR as
  300. should be a list of queries separated by whitespace characters and
  301. bracketed within quotation marks.  Note that quotation marks used in
  302. the queries must be escaped, by preceding them with two backslashes
  303. (i.e. e').
  304. .PP
  305. Arguments to the SQL function may be referenced in the queries using
  306. a $n syntax: $1 refers to the first argument, $2 to the second, and so
  307. on.  If an argument is complex, then a *(lqdot*(rq notation may be
  308. used to access attributes of the argument (e.g. *(lq$1.emp*(rq), or
  309. to invoke functions via a nested-dot syntax.
  310. .SH "PL FUNCTIONS"
  311. Procedural languages aren't built into Postgres. They are offered
  312. by loadable modules. Please refer to the documentation for the
  313. PL in question for details about the syntax and how the
  314. .IR "as"
  315. clause is interpreted by the PL handler.
  316. .SH "EXAMPLES: C Functions"
  317. The following command defines a C function, overpaid, of two basetype
  318. arguments.
  319. .nf
  320. create function overpaid (float8, int4) returns bool
  321. as '/usr/postgres/src/adt/overpaid.o'
  322. language 'c'
  323. .fi
  324. The C file "overpaid.c" might look something like:
  325. .nf
  326. #include <utils/builtins.h>
  327. bool overpaid(salary, age)
  328.         float8 *salary;
  329.         int4    age;
  330. {
  331.         if (*salary > 200000.00)
  332.                 return(TRUE);
  333.         if ((age < 30) & (*salary > 100000.00))
  334.                 return(TRUE);
  335.         return(FALSE);
  336. }
  337. .fi
  338. The overpaid function can be used in a query, e.g:
  339. .nf
  340. select name from EMP where overpaid(salary, age)
  341. .fi
  342. One can also write this as a function of a single argument of type
  343. EMP:
  344. .nf
  345. create function overpaid_2 (EMP)
  346. returns bool
  347. as '/usr/postgres/src/adt/overpaid_2.o'
  348. language 'c'
  349. .fi
  350. The following query is now accepted:
  351. .nf
  352. select name from EMP where overpaid_2(EMP)
  353. .fi
  354. In this case, in the body of the overpaid_2 function, the fields in the EMP
  355. record must be extracted.  The C file "overpaid_2.c" might look
  356. something like:
  357. .nf
  358. #include <utils/builtins.h>
  359. #include <libpq-fe.h>
  360. bool overpaid_2(t)
  361. TUPLE t;
  362. {
  363.     float8 *salary;
  364.     int4    age;
  365.     bool    salnull, agenull;
  366.     salary = (float8 *)GetAttributeByName(t, "salary",
  367.                                           &salnull);
  368.     age = (int4)GetAttributeByName(t, "age", &agenull);
  369.     if (!salnull && *salary > 200000.00)
  370.         return(TRUE);
  371.     if (!agenull && (age<30) && (*salary > 100000.00))
  372.         return(TRUE);
  373.     return(FALSE)
  374. }
  375. .fi
  376. .SH "EXAMPLES: SQL Functions"
  377. To illustrate a simple SQL function, consider the following,
  378. which might be used to debit a bank account:
  379. .nf
  380. create function TP1 (int4, float8) returns int4
  381. as 'update BANK set balance = BANK.balance - $2
  382. where BANK.acctountno = $1
  383.     select(x = 1)'
  384.     language 'sql'
  385. .fi
  386. A user could execute this function to debit account 17 by $100.00 as
  387. follows:
  388. .nf
  389. select (x = TP1( 17,100.0))
  390. .fi
  391. The following more interesting examples take a single argument of type
  392. EMP, and retrieve multiple results:
  393. .nf
  394. select function hobbies (EMP) returns set of HOBBIES
  395. as 'select (HOBBIES.all) from HOBBIES
  396. where $1.name = HOBBIES.person'
  397. language 'sql'
  398. .SH "SEE ALSO"
  399. .PP
  400. information(1), load(l), drop_function(l), create_language(l).
  401. .SH "NOTES"
  402. .SH "Name Space Conflicts"
  403. More than one function may be defined with the same name, as long as
  404. the arguments they take are different.  In other words, function names
  405. can be
  406. .IR overloaded .
  407. A function may also have the same name as an attribute.  In the case
  408. that there is an ambiguity between a function on a complex type and
  409. an attribute of the complex type, the attribute will always be used.
  410. .SH "RESTRICTIONS"
  411. For functions written in C, the SQL name declared in
  412. .BR "create function"
  413. must be exactly the same as the actual name of the function in the
  414. C code (hence it must be a legal C function name).
  415. .PP
  416. There is a subtle implication of this restriction: while the
  417. dynamic loading routines in most operating systems are more than 
  418. happy to allow you to load any number of shared libraries that 
  419. contain conflicting (identically-named) function names, they may 
  420. in fact botch the load in interesting ways.  For example, if you
  421. define a dynamically-loaded function that happens to have the
  422. same name as a function built into Postgres, the DEC OSF/1 dynamic 
  423. loader causes Postgres to call the function within itself rather than 
  424. allowing Postgres to call your function.  Hence, if you want your
  425. function to be used on different architectures, we recommend that 
  426. you do not overload C function names.
  427. .PP
  428. There is a clever trick to get around the problem just described.
  429. Since there is no problem overloading SQL functions, you can 
  430. define a set of C functions with different names and then define 
  431. a set of identically-named SQL function wrappers that take the
  432. appropriate argument types and call the matching C function.
  433. .PP
  434. Another solution is not to use dynamic loading, but to link your
  435. functions into the backend statically and declare them as INTERNAL
  436. functions.  Then, the functions must all have distinct C names but
  437. they can be declared with the same SQL names (as long as their
  438. argument types differ, of course).  This way avoids the overhead of
  439. an SQL wrapper function, at the cost of more effort to prepare a
  440. custom backend executable.
  441. .PP
  442. .IR opaque
  443. cannot be given as an argument to a SQL function.
  444. .SH "BUGS"
  445. C functions cannot return a set of values.