Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit5341cdd

Browse files
committed
Further polishing of documentation about new fmgr call convention.
1 parent39b9c9f commit5341cdd

File tree

1 file changed

+39
-26
lines changed

1 file changed

+39
-26
lines changed

‎doc/src/sgml/xfunc.sgml

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!--
2-
$Header: /cvsroot/pgsql/doc/src/sgml/xfunc.sgml,v 1.30 2001/01/22 16:11:17 tgl Exp $
2+
$Header: /cvsroot/pgsql/doc/src/sgml/xfunc.sgml,v 1.31 2001/02/15 19:03:35 tgl Exp $
33
-->
44

55
<chapter id="xfunc">
@@ -434,10 +434,9 @@ SELECT clean_EMP();
434434
functions that will be loaded into Postgres. The "Defined In"
435435
column gives the actual header file (in the
436436
<filename>.../src/backend/</filename>
437-
directory) that the equivalent C type is defined. However, if you
438-
include <filename>utils/builtins.h</filename>,
439-
these files will automatically be
440-
included.
437+
directory) that the equivalent C type is defined. Note that you should
438+
always include <filename>postgres.h</filename> first, and that in turn
439+
includes <filename>c.h</filename>.
441440

442441
<table tocentry="1">
443442
<title>Equivalent C Types
@@ -619,9 +618,8 @@ SELECT clean_EMP();
619618

620619
<para>
621620
By-value types can only be 1, 2 or 4 bytes in length
622-
(even if your computer supports by-value types of other
623-
sizes). <productname>Postgres</productname> itself
624-
only passes integer types by value. You should be careful
621+
(also 8 bytes, if sizeof(Datum) is 8 on your machine).
622+
You should be careful
625623
to define your types such that they will be the same
626624
size (in bytes) on all architectures. For example, the
627625
<literal>long</literal> type is dangerous because it
@@ -657,7 +655,9 @@ typedef struct
657655
them in and out of <productname>Postgres</productname> functions.
658656
To return a value of such a type, allocate the right amount of
659657
memory with <literal>palloc()</literal>, fill in the allocated memory,
660-
and return a pointer to it.
658+
and return a pointer to it. (Alternatively, you can return an input
659+
value of the same type by returning its pointer. <emphasis>Never</>
660+
modify the contents of a pass-by-reference input value, however.)
661661
</para>
662662

663663
<para>
@@ -721,8 +721,8 @@ memmove(destination-&gt;data, buffer, 40);
721721
Here are some examples:
722722

723723
<programlisting>
724-
#include &lt;string.h&gt;
725724
#include "postgres.h"
725+
#include &lt;string.h&gt;
726726

727727
/* By Value */
728728

@@ -780,10 +780,10 @@ concat_text(text *arg1, text *arg2)
780780
int32 new_text_size = VARSIZE(arg1) + VARSIZE(arg2) - VARHDRSZ;
781781
text *new_text = (text *) palloc(new_text_size);
782782

783-
memset((void *) new_text, 0, new_text_size);
784783
VARATT_SIZEP(new_text) = new_text_size;
785-
strncpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1)-VARHDRSZ);
786-
strncat(VARDATA(new_text), VARDATA(arg2), VARSIZE(arg2)-VARHDRSZ);
784+
memcpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1)-VARHDRSZ);
785+
memcpy(VARDATA(new_text) + (VARSIZE(arg1)-VARHDRSZ),
786+
VARDATA(arg2), VARSIZE(arg2)-VARHDRSZ);
787787
return new_text;
788788
}
789789
</programlisting>
@@ -882,8 +882,8 @@ PG_FUNCTION_INFO_V1(funcname);
882882
Here we show the same functions as above, coded in version-1 style:
883883

884884
<programlisting>
885-
#include &lt;string.h&gt;
886885
#include "postgres.h"
886+
#include &lt;string.h&gt;
887887
#include "fmgr.h"
888888

889889
/* By Value */
@@ -945,7 +945,7 @@ copytext(PG_FUNCTION_ARGS)
945945
*/
946946
memcpy((void *) VARDATA(new_t), /* destination */
947947
(void *) VARDATA(t), /* source */
948-
VARSIZE(t)-VARHDRSZ);/* how many bytes */
948+
VARSIZE(t)-VARHDRSZ); /* how many bytes */
949949
PG_RETURN_TEXT_P(new_t);
950950
}
951951

@@ -959,10 +959,10 @@ concat_text(PG_FUNCTION_ARGS)
959959
int32 new_text_size = VARSIZE(arg1) + VARSIZE(arg2) - VARHDRSZ;
960960
text *new_text = (text *) palloc(new_text_size);
961961

962-
memset((void *) new_text, 0, new_text_size);
963962
VARATT_SIZEP(new_text) = new_text_size;
964-
strncpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1)-VARHDRSZ);
965-
strncat(VARDATA(new_text), VARDATA(arg2), VARSIZE(arg2)-VARHDRSZ);
963+
memcpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1)-VARHDRSZ);
964+
memcpy(VARDATA(new_text) + (VARSIZE(arg1)-VARHDRSZ),
965+
VARDATA(arg2), VARSIZE(arg2)-VARHDRSZ);
966966
PG_RETURN_TEXT_P(new_text);
967967
}
968968
</programlisting>
@@ -991,10 +991,20 @@ concat_text(PG_FUNCTION_ARGS)
991991
</para>
992992

993993
<para>
994-
The version-1 function call conventions also make it possible to
995-
test for NULL inputs to a non-strict function, return a NULL
996-
result (from either strict or non-strict functions), return
997-
<quote>set</quote> results, and implement trigger functions and
994+
One big improvement in version-1 functions is better handling of NULL
995+
inputs and results. The macro <function>PG_ARGISNULL(n)</function>
996+
allows a function to test whether each input is NULL (of course, doing
997+
this is only necessary in functions not declared <quote>strict</>).
998+
As with the
999+
<function>PG_GETARG_<replaceable>xxx</replaceable>()</function> macros,
1000+
the input arguments are counted beginning at zero.
1001+
To return a NULL result, execute <function>PG_RETURN_NULL()</function>;
1002+
this works in both strict and non-strict functions.
1003+
</para>
1004+
1005+
<para>
1006+
The version-1 function call conventions make it possible to
1007+
return <quote>set</quote> results and implement trigger functions and
9981008
procedural-language call handlers. Version-1 code is also more
9991009
portable than version-0, because it does not break ANSI C restrictions
10001010
on function call protocol. For more details see
@@ -1167,11 +1177,14 @@ LANGUAGE 'c';
11671177
<listitem>
11681178
<para>
11691179
Most of the internal <productname>Postgres</productname> types
1170-
are declared in <filename>postgres.h</filename>, the function
1180+
are declared in <filename>postgres.h</filename>,whilethe function
11711181
manager interfaces (<symbol>PG_FUNCTION_ARGS</symbol>, etc.)
11721182
are in <filename>fmgr.h</filename>, so you will need to
1173-
include at least these two files. Including
1174-
<filename>postgres.h</filename> will also include
1183+
include at least these two files. For portability reasons it's best
1184+
to include <filename>postgres.h</filename> <emphasis>first</>,
1185+
before any other system or user header files.
1186+
Including <filename>postgres.h</filename> will also include
1187+
<filename>c.h</filename>,
11751188
<filename>elog.h</filename> and <filename>palloc.h</filename>
11761189
for you.
11771190
</para>
@@ -1210,7 +1223,7 @@ LANGUAGE 'c';
12101223
<title>Function Overloading</title>
12111224

12121225
<para>
1213-
More than one function may be defined with the same name,as long as
1226+
More than one function may be defined with the same name,so long as
12141227
the arguments they take are different. In other words, function names
12151228
can be <firstterm>overloaded</firstterm>.
12161229
A function may also have the same name as an attribute. In the case

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp