diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index a3d445e43668783ef9a58944f741c6a4d4ca456e..cd6fa0e94f0e6fccec0af3cb6ecb062bec0e8255 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -1,4 +1,4 @@ -<!-- $PostgreSQL: pgsql/doc/src/sgml/protocol.sgml,v 1.58 2005/01/23 00:30:18 momjian Exp $ --> +<!-- $PostgreSQL: pgsql/doc/src/sgml/protocol.sgml,v 1.59 2005/06/22 15:19:43 tgl Exp $ --> <chapter id="protocol"> <title>Frontend/Backend Protocol</title> @@ -295,7 +295,7 @@ <listitem> <para> The frontend must now send a PasswordMessage containing the - password in clear-text form. If + password in clear-text form. If this is the correct password, the server responds with an AuthenticationOk, otherwise it responds with an ErrorResponse. </para> @@ -307,8 +307,8 @@ <listitem> <para> The frontend must now send a PasswordMessage containing the - password encrypted via crypt(3), using the 2-character salt - specified in the AuthenticationCryptPassword message. If + password encrypted via crypt(3), using the 2-character salt + specified in the AuthenticationCryptPassword message. If this is the correct password, the server responds with an AuthenticationOk, otherwise it responds with an ErrorResponse. </para> @@ -320,8 +320,8 @@ <listitem> <para> The frontend must now send a PasswordMessage containing the - password encrypted via MD5, using the 4-character salt - specified in the AuthenticationMD5Password message. If + password encrypted via MD5, using the 4-character salt + specified in the AuthenticationMD5Password message. If this is the correct password, the server responds with an AuthenticationOk, otherwise it responds with an ErrorResponse. </para> @@ -333,12 +333,12 @@ <listitem> <para> This response is only possible for local Unix-domain connections - on platforms that support SCM credential messages. The frontend - must issue an SCM credential message and then send a single data - byte. (The contents of the data byte are uninteresting; it's - only used to ensure that the server waits long enough to receive - the credential message.) If the credential is acceptable, - the server responds with an + on platforms that support SCM credential messages. The frontend + must issue an SCM credential message and then send a single data + byte. (The contents of the data byte are uninteresting; it's + only used to ensure that the server waits long enough to receive + the credential message.) If the credential is acceptable, + the server responds with an AuthenticationOk, otherwise it responds with an ErrorResponse. </para> </listitem> @@ -497,9 +497,9 @@ <listitem> <para> Indicates that rows are about to be returned in response to - a <command>SELECT</command>, <command>FETCH</command>, etc query. - The contents of this message describe the column layout of the rows. - This will be followed by a DataRow message for each row being returned + a <command>SELECT</command>, <command>FETCH</command>, etc query. + The contents of this message describe the column layout of the rows. + This will be followed by a DataRow message for each row being returned to the frontend. </para> </listitem> @@ -510,7 +510,7 @@ <listitem> <para> One of the set of rows returned by - a <command>SELECT</command>, <command>FETCH</command>, etc query. + a <command>SELECT</command>, <command>FETCH</command>, etc query. </para> </listitem> </varlistentry> @@ -639,6 +639,24 @@ constants. </para> + <note> + <para> + A parameter data type can be left unspecified by setting it to zero, + or by making the array of parameter type OIDs shorter than the + number of parameter symbols (<literal>$</><replaceable>n</>) + used in the query string. Another special case is that a parameter's + type can be specified as <type>void</> (that is, the OID of the + <type>void</> pseudotype). This is meant to allow parameter symbols + to be used for function parameters that are actually OUT parameters. + Ordinarily there is no context in which a <type>void</> parameter + could be used, but if such a parameter symbol appears in a function's + parameter list, it is effectively ignored. For example, a function + call such as <literal>foo($1,$2,$3,$4)</> could match a function with + two IN and two OUT arguments, if <literal>$3</> and <literal>$4</> + are specified as having type <type>void</>. + </para> + </note> + <note> <para> The query string contained in a Parse message cannot include more @@ -670,6 +688,8 @@ the values to use for any parameter placeholders present in the prepared statement. The supplied parameter set must match those needed by the prepared statement. + (If you declared any <type>void</> parameters in the Parse message, + pass NULL values for them in the Bind message.) Bind also specifies the format to use for any data returned by the query; the format can be specified overall, or per-column. The response is either BindComplete or ErrorResponse. @@ -900,9 +920,9 @@ <listitem> <para> The function call was completed and returned the result given - in the message. - (Note that the Function Call protocol can only handle a single - scalar result, not a row type or set of results.) + in the message. + (Note that the Function Call protocol can only handle a single + scalar result, not a row type or set of results.) </para> </listitem> </varlistentry> @@ -1259,10 +1279,10 @@ This section describes the base data types used in messages. <listitem> <para> An <replaceable>n</replaceable>-bit integer in network byte - order (most significant byte first). + order (most significant byte first). If <replaceable>i</replaceable> is specified it is the exact value that will appear, otherwise the value - is variable. Eg. Int16, Int32(42). + is variable. Eg. Int16, Int32(42). </para> </listitem> </varlistentry> @@ -1273,11 +1293,11 @@ This section describes the base data types used in messages. </term> <listitem> <para> - An array of <replaceable>k</replaceable> + An array of <replaceable>k</replaceable> <replaceable>n</replaceable>-bit integers, each in network - byte order. The array length <replaceable>k</replaceable> - is always determined by an earlier field in the message. - Eg. Int16[M]. + byte order. The array length <replaceable>k</replaceable> + is always determined by an earlier field in the message. + Eg. Int16[M]. </para> </listitem> </varlistentry> @@ -1289,9 +1309,9 @@ This section describes the base data types used in messages. <listitem> <para> A null-terminated string (C-style string). There is no - specific length limitation on strings. + specific length limitation on strings. If <replaceable>s</replaceable> is specified it is the exact - value that will appear, otherwise the value is variable. + value that will appear, otherwise the value is variable. Eg. String, String("user"). </para> @@ -1314,8 +1334,8 @@ characters that don't fit into your fixed-size buffer. <listitem> <para> Exactly <replaceable>n</replaceable> bytes. If the field - width <replaceable>n</replaceable> is not a constant, it is - always determinable from an earlier field in the message. + width <replaceable>n</replaceable> is not a constant, it is + always determinable from an earlier field in the message. If <replaceable>c</replaceable> is specified it is the exact value. Eg. Byte2, Byte1('\n'). </para> @@ -1767,7 +1787,7 @@ Bind (F) <listitem> <para> The name of the destination portal - (an empty string selects the unnamed portal). + (an empty string selects the unnamed portal). </para> </listitem> </varlistentry> @@ -1778,7 +1798,7 @@ Bind (F) <listitem> <para> The name of the source prepared statement - (an empty string selects the unnamed prepared statement). + (an empty string selects the unnamed prepared statement). </para> </listitem> </varlistentry> @@ -1788,13 +1808,13 @@ Bind (F) </term> <listitem> <para> - The number of parameter format codes that follow - (denoted <replaceable>C</> below). - This can be zero to indicate that there are no parameters - or that the parameters all use the default format (text); - or one, in which case the specified format code is applied - to all parameters; or it can equal the actual number of - parameters. + The number of parameter format codes that follow + (denoted <replaceable>C</> below). + This can be zero to indicate that there are no parameters + or that the parameters all use the default format (text); + or one, in which case the specified format code is applied + to all parameters; or it can equal the actual number of + parameters. </para> </listitem> </varlistentry> @@ -1805,7 +1825,7 @@ Bind (F) <listitem> <para> The parameter format codes. Each must presently be - zero (text) or one (binary). + zero (text) or one (binary). </para> </listitem> </varlistentry> @@ -1816,7 +1836,7 @@ Bind (F) <listitem> <para> The number of parameter values that follow (possibly zero). - This must match the number of parameters needed by the query. + This must match the number of parameters needed by the query. </para> </listitem> </varlistentry> @@ -1830,9 +1850,9 @@ Bind (F) <listitem> <para> The length of the parameter value, in bytes (this count - does not include itself). Can be zero. - As a special case, -1 indicates a NULL parameter value. - No value bytes follow in the NULL case. + does not include itself). Can be zero. + As a special case, -1 indicates a NULL parameter value. + No value bytes follow in the NULL case. </para> </listitem> </varlistentry> @@ -1843,7 +1863,7 @@ Bind (F) <listitem> <para> The value of the parameter, in the format indicated by the - associated format code. + associated format code. <replaceable>n</replaceable> is the above length. </para> </listitem> @@ -1857,14 +1877,14 @@ Bind (F) </term> <listitem> <para> - The number of result-column format codes that follow - (denoted <replaceable>R</> below). - This can be zero to indicate that there are no result columns - or that the result columns should all use the default format - (text); - or one, in which case the specified format code is applied - to all result columns (if any); or it can equal the actual - number of result columns of the query. + The number of result-column format codes that follow + (denoted <replaceable>R</> below). + This can be zero to indicate that there are no result columns + or that the result columns should all use the default format + (text); + or one, in which case the specified format code is applied + to all result columns (if any); or it can equal the actual + number of result columns of the query. </para> </listitem> </varlistentry> @@ -1875,7 +1895,7 @@ Bind (F) <listitem> <para> The result-column format codes. Each must presently be - zero (text) or one (binary). + zero (text) or one (binary). </para> </listitem> </varlistentry> @@ -2024,8 +2044,8 @@ Close (F) <listitem> <para> The name of the prepared statement or portal to close - (an empty string selects the unnamed prepared statement - or portal). + (an empty string selects the unnamed prepared statement + or portal). </para> </listitem> </varlistentry> @@ -2115,19 +2135,19 @@ CommandComplete (B) <replaceable>rows</replaceable> is the number of rows inserted. <replaceable>oid</replaceable> is the object ID of the inserted row if <replaceable>rows</replaceable> is 1 - and the target table has OIDs; - otherwise <replaceable>oid</replaceable> is 0. + and the target table has OIDs; + otherwise <replaceable>oid</replaceable> is 0. </para> <para> For a <command>DELETE</command> command, the tag is - <literal>DELETE <replaceable>rows</replaceable></literal> where + <literal>DELETE <replaceable>rows</replaceable></literal> where <replaceable>rows</replaceable> is the number of rows deleted. </para> <para> For an <command>UPDATE</command> command, the tag is - <literal>UPDATE <replaceable>rows</replaceable></literal> where + <literal>UPDATE <replaceable>rows</replaceable></literal> where <replaceable>rows</replaceable> is the number of rows updated. </para> @@ -2187,9 +2207,9 @@ CopyData (F & B) <listitem> <para> Data that forms part of a <command>COPY</command> data stream. Messages sent - from the backend will always correspond to single data rows, - but messages sent by frontends may divide the data stream - arbitrarily. + from the backend will always correspond to single data rows, + but messages sent by frontends may divide the data stream + arbitrarily. </para> </listitem> </varlistentry> @@ -2295,7 +2315,7 @@ CopyInResponse (B) <para> Identifies the message as a Start Copy In response. The frontend must now send copy-in data (if not - prepared to do so, send a CopyFail message). + prepared to do so, send a CopyFail message). </para> </listitem> </varlistentry> @@ -2316,12 +2336,12 @@ CopyInResponse (B) <listitem> <para> 0 indicates the overall <command>COPY</command> format is textual (rows - separated by newlines, columns separated by separator - characters, etc). - 1 indicates the overall copy format is binary (similar - to DataRow format). - See <xref linkend="sql-copy" endterm="sql-copy-title"> - for more information. + separated by newlines, columns separated by separator + characters, etc). + 1 indicates the overall copy format is binary (similar + to DataRow format). + See <xref linkend="sql-copy" endterm="sql-copy-title"> + for more information. </para> </listitem> </varlistentry> @@ -2331,8 +2351,8 @@ CopyInResponse (B) </term> <listitem> <para> - The number of columns in the data to be copied - (denoted <replaceable>N</> below). + The number of columns in the data to be copied + (denoted <replaceable>N</> below). </para> </listitem> </varlistentry> @@ -2343,8 +2363,8 @@ CopyInResponse (B) <listitem> <para> The format codes to be used for each column. - Each must presently be zero (text) or one (binary). - All must be zero if the overall copy format is textual. + Each must presently be zero (text) or one (binary). + All must be zero if the overall copy format is textual. </para> </listitem> </varlistentry> @@ -2405,8 +2425,8 @@ CopyOutResponse (B) </term> <listitem> <para> - The number of columns in the data to be copied - (denoted <replaceable>N</> below). + The number of columns in the data to be copied + (denoted <replaceable>N</> below). </para> </listitem> </varlistentry> @@ -2417,8 +2437,8 @@ CopyOutResponse (B) <listitem> <para> The format codes to be used for each column. - Each must presently be zero (text) or one (binary). - All must be zero if the overall copy format is textual. + Each must presently be zero (text) or one (binary). + All must be zero if the overall copy format is textual. </para> </listitem> </varlistentry> @@ -2476,9 +2496,9 @@ DataRow (B) <listitem> <para> The length of the column value, in bytes (this count - does not include itself). Can be zero. - As a special case, -1 indicates a NULL column value. - No value bytes follow in the NULL case. + does not include itself). Can be zero. + As a special case, -1 indicates a NULL column value. + No value bytes follow in the NULL case. </para> </listitem> </varlistentry> @@ -2489,7 +2509,7 @@ DataRow (B) <listitem> <para> The value of the column, in the format indicated by the - associated format code. + associated format code. <replaceable>n</replaceable> is the above length. </para> </listitem> @@ -2547,8 +2567,8 @@ Describe (F) <listitem> <para> The name of the prepared statement or portal to describe - (an empty string selects the unnamed prepared statement - or portal). + (an empty string selects the unnamed prepared statement + or portal). </para> </listitem> </varlistentry> @@ -2573,7 +2593,7 @@ EmptyQueryResponse (B) <listitem> <para> Identifies the message as a response to an empty query string. - (This substitutes for CommandComplete.) + (This substitutes for CommandComplete.) </para> </listitem> </varlistentry> @@ -2624,8 +2644,8 @@ ErrorResponse (B) </varlistentry> </variablelist> The message body consists of one or more identified fields, - followed by a zero byte as a terminator. Fields may appear in - any order. For each field there is the following: + followed by a zero byte as a terminator. Fields may appear in + any order. For each field there is the following: <variablelist> <varlistentry> <term> @@ -2634,12 +2654,12 @@ ErrorResponse (B) <listitem> <para> A code identifying the field type; if zero, this is - the message terminator and no string follows. - The presently defined field types are listed in - <xref linkend="protocol-error-fields">. - Since more field types may be added in future, - frontends should silently ignore fields of unrecognized - type. + the message terminator and no string follows. + The presently defined field types are listed in + <xref linkend="protocol-error-fields">. + Since more field types may be added in future, + frontends should silently ignore fields of unrecognized + type. </para> </listitem> </varlistentry> @@ -2695,7 +2715,7 @@ Execute (F) <listitem> <para> The name of the portal to execute - (an empty string selects the unnamed portal). + (an empty string selects the unnamed portal). </para> </listitem> </varlistentry> @@ -2706,8 +2726,8 @@ Execute (F) <listitem> <para> Maximum number of rows to return, if portal contains - a query that returns rows (ignored otherwise). Zero - denotes <quote>no limit</>. + a query that returns rows (ignored otherwise). Zero + denotes <quote>no limit</>. </para> </listitem> </varlistentry> @@ -2796,13 +2816,13 @@ FunctionCall (F) </term> <listitem> <para> - The number of argument format codes that follow - (denoted <replaceable>C</> below). - This can be zero to indicate that there are no arguments - or that the arguments all use the default format (text); - or one, in which case the specified format code is applied - to all arguments; or it can equal the actual number of - arguments. + The number of argument format codes that follow + (denoted <replaceable>C</> below). + This can be zero to indicate that there are no arguments + or that the arguments all use the default format (text); + or one, in which case the specified format code is applied + to all arguments; or it can equal the actual number of + arguments. </para> </listitem> </varlistentry> @@ -2813,7 +2833,7 @@ FunctionCall (F) <listitem> <para> The argument format codes. Each must presently be - zero (text) or one (binary). + zero (text) or one (binary). </para> </listitem> </varlistentry> @@ -2838,9 +2858,9 @@ FunctionCall (F) <listitem> <para> The length of the argument value, in bytes (this count - does not include itself). Can be zero. - As a special case, -1 indicates a NULL argument value. - No value bytes follow in the NULL case. + does not include itself). Can be zero. + As a special case, -1 indicates a NULL argument value. + No value bytes follow in the NULL case. </para> </listitem> </varlistentry> @@ -2851,7 +2871,7 @@ FunctionCall (F) <listitem> <para> The value of the argument, in the format indicated by the - associated format code. + associated format code. <replaceable>n</replaceable> is the above length. </para> </listitem> @@ -2866,7 +2886,7 @@ FunctionCall (F) <listitem> <para> The format code for the function result. Must presently be - zero (text) or one (binary). + zero (text) or one (binary). </para> </listitem> </varlistentry> @@ -2912,9 +2932,9 @@ FunctionCallResponse (B) <listitem> <para> The length of the function result value, in bytes (this count - does not include itself). Can be zero. - As a special case, -1 indicates a NULL function result. - No value bytes follow in the NULL case. + does not include itself). Can be zero. + As a special case, -1 indicates a NULL function result. + No value bytes follow in the NULL case. </para> </listitem> </varlistentry> @@ -2925,7 +2945,7 @@ FunctionCallResponse (B) <listitem> <para> The value of the function result, in the format indicated by - the associated format code. + the associated format code. <replaceable>n</replaceable> is the above length. </para> </listitem> @@ -3002,8 +3022,8 @@ NoticeResponse (B) </varlistentry> </variablelist> The message body consists of one or more identified fields, - followed by a zero byte as a terminator. Fields may appear in - any order. For each field there is the following: + followed by a zero byte as a terminator. Fields may appear in + any order. For each field there is the following: <variablelist> <varlistentry> <term> @@ -3012,12 +3032,12 @@ NoticeResponse (B) <listitem> <para> A code identifying the field type; if zero, this is - the message terminator and no string follows. - The presently defined field types are listed in - <xref linkend="protocol-error-fields">. - Since more field types may be added in future, - frontends should silently ignore fields of unrecognized - type. + the message terminator and no string follows. + The presently defined field types are listed in + <xref linkend="protocol-error-fields">. + Since more field types may be added in future, + frontends should silently ignore fields of unrecognized + type. </para> </listitem> </varlistentry> @@ -3093,8 +3113,8 @@ NotificationResponse (B) <listitem> <para> Additional information passed from the notifying process. - (Currently, this feature is unimplemented so the field - is always an empty string.) + (Currently, this feature is unimplemented so the field + is always an empty string.) </para> </listitem> </varlistentry> @@ -3140,7 +3160,7 @@ ParameterDescription (B) <listitem> <para> The number of parameters used by the statement - (may be zero). + (may be zero). </para> </listitem> </varlistentry> @@ -3252,7 +3272,7 @@ Parse (F) <listitem> <para> The name of the destination prepared statement - (an empty string selects the unnamed prepared statement). + (an empty string selects the unnamed prepared statement). </para> </listitem> </varlistentry> @@ -3273,10 +3293,10 @@ Parse (F) <listitem> <para> The number of parameter data types specified - (may be zero). Note that this is not an indication of - the number of parameters that might appear in the - query string, only the number that the frontend wants to - prespecify types for. + (may be zero). Note that this is not an indication of + the number of parameters that might appear in the + query string, only the number that the frontend wants to + prespecify types for. </para> </listitem> </varlistentry> @@ -3290,8 +3310,8 @@ Parse (F) <listitem> <para> Specifies the object ID of the parameter data type. - Placing a zero here is equivalent to leaving the type - unspecified. + Placing a zero here is equivalent to leaving the type + unspecified. </para> </listitem> </varlistentry> @@ -3395,8 +3415,8 @@ PortalSuspended (B) <listitem> <para> Identifies the message as a portal-suspended indicator. - Note this only appears if an Execute message's row-count limit - was reached. + Note this only appears if an Execute message's row-count limit + was reached. </para> </listitem> </varlistentry> @@ -3498,10 +3518,10 @@ ReadyForQuery (B) <listitem> <para> Current backend transaction status indicator. - Possible values are '<literal>I</>' if idle (not in - a transaction block); '<literal>T</>' if in a transaction - block; or '<literal>E</>' if in a failed transaction - block (queries will be rejected until block is ended). + Possible values are '<literal>I</>' if idle (not in + a transaction block); '<literal>T</>' if in a transaction + block; or '<literal>E</>' if in a failed transaction + block (queries will be rejected until block is ended). </para> </listitem> </varlistentry> @@ -3570,7 +3590,7 @@ RowDescription (B) <listitem> <para> If the field can be identified as a column of a specific - table, the object ID of the table; otherwise zero. + table, the object ID of the table; otherwise zero. </para> </listitem> </varlistentry> @@ -3581,7 +3601,7 @@ RowDescription (B) <listitem> <para> If the field can be identified as a column of a specific - table, the attribute number of the column; otherwise zero. + table, the attribute number of the column; otherwise zero. </para> </listitem> </varlistentry> @@ -3602,7 +3622,7 @@ RowDescription (B) <listitem> <para> The data type size (see <varname>pg_type.typlen</>). - Note that negative values denote variable-width types. + Note that negative values denote variable-width types. </para> </listitem> </varlistentry> @@ -3613,7 +3633,7 @@ RowDescription (B) <listitem> <para> The type modifier (see <varname>pg_attribute.atttypmod</>). - The meaning of the modifier is type-specific. + The meaning of the modifier is type-specific. </para> </listitem> </varlistentry> @@ -3624,9 +3644,9 @@ RowDescription (B) <listitem> <para> The format code being used for the field. Currently will - be zero (text) or one (binary). In a RowDescription - returned from the statement variant of Describe, the - format code is not yet known and will always be zero. + be zero (text) or one (binary). In a RowDescription + returned from the statement variant of Describe, the + format code is not yet known and will always be zero. </para> </listitem> </varlistentry> @@ -3701,18 +3721,18 @@ StartupMessage (F) <para> The protocol version number. The most significant 16 bits are the major version number (3 for the protocol described here). - The least significant 16 bits are the minor version number - (0 for the protocol described here). + The least significant 16 bits are the minor version number + (0 for the protocol described here). </para> </listitem> </varlistentry> </variablelist> The protocol version number is followed by one or more pairs of - parameter name and value strings. A zero byte is required as a - terminator after the last name/value pair. - Parameters can appear in any - order. <literal>user</> is required, others are optional. - Each parameter is specified as: + parameter name and value strings. A zero byte is required as a + terminator after the last name/value pair. + Parameters can appear in any + order. <literal>user</> is required, others are optional. + Each parameter is specified as: <variablelist> <varlistentry> <term> @@ -3730,7 +3750,7 @@ StartupMessage (F) <listitem> <para> The database user name to connect as. Required; - there is no default. + there is no default. </para> </listitem> </varlistentry> @@ -3751,18 +3771,18 @@ StartupMessage (F) <listitem> <para> Command-line arguments for the backend. (This is - deprecated in favor of setting individual run-time - parameters.) + deprecated in favor of setting individual run-time + parameters.) </para> </listitem> </varlistentry> </variablelist> In addition to the above, any run-time parameter that can be - set at backend start time may be listed. Such settings - will be applied during backend start (after parsing the - command-line options if any). The values will act as - session defaults. + set at backend start time may be listed. Such settings + will be applied during backend start (after parsing the + command-line options if any). The values will act as + session defaults. </para> </listitem> </varlistentry> @@ -3879,9 +3899,9 @@ message. Severity: the field contents are <literal>ERROR</>, <literal>FATAL</>, or <literal>PANIC</> (in an error message), or - <literal>WARNING</>, <literal>NOTICE</>, <literal>DEBUG</>, - <literal>INFO</>, or <literal>LOG</> (in a notice message), - or a localized translation of one of these. Always present. + <literal>WARNING</>, <literal>NOTICE</>, <literal>DEBUG</>, + <literal>INFO</>, or <literal>LOG</> (in a notice message), + or a localized translation of one of these. Always present. </para> </listitem> </varlistentry> @@ -3893,7 +3913,7 @@ message. <listitem> <para> Code: the SQLSTATE code for the error (see <xref - linkend="errcodes-appendix">). Not localizable. Always present. + linkend="errcodes-appendix">). Not localizable. Always present. </para> </listitem> </varlistentry> @@ -3930,9 +3950,9 @@ message. <listitem> <para> Hint: an optional suggestion what to do about the problem. - This is intended to differ from Detail in that it offers advice - (potentially inappropriate) rather than hard facts. - May run to multiple lines. + This is intended to differ from Detail in that it offers advice + (potentially inappropriate) rather than hard facts. + May run to multiple lines. </para> </listitem> </varlistentry> @@ -3944,9 +3964,9 @@ message. <listitem> <para> Position: the field value is a decimal ASCII integer, indicating - an error cursor position as an index into the original query string. - The first character has index 1, and positions are measured in - characters not bytes. + an error cursor position as an index into the original query string. + The first character has index 1, and positions are measured in + characters not bytes. </para> </listitem> </varlistentry> @@ -3998,7 +4018,7 @@ message. <listitem> <para> File: the file name of the source-code location where the error - was reported. + was reported. </para> </listitem> </varlistentry> @@ -4010,7 +4030,7 @@ message. <listitem> <para> Line: the line number of the source-code location where the error - was reported. + was reported. </para> </listitem> </varlistentry> diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index e585e6df716b31a89595a58ec1c8ff01a51ca07b..88132bdbd58323cc44e88a818843b025dc738d56 100644 --- a/src/backend/parser/parse_func.c +++ b/src/backend/parser/parse_func.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_func.c,v 1.180 2005/05/31 01:03:23 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_func.c,v 1.181 2005/06/22 15:19:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -64,9 +64,9 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, Oid rettype; Oid funcid; ListCell *l; + ListCell *nextl; Node *first_arg = NULL; - int nargs = list_length(fargs); - int argn; + int nargs; Oid actual_arg_types[FUNC_MAX_ARGS]; Oid *declared_arg_types; Node *retval; @@ -79,12 +79,38 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, * protect against array overruns, etc. Of course, this may not be a * function, but the test doesn't hurt. */ - if (nargs > FUNC_MAX_ARGS) + if (list_length(fargs) > FUNC_MAX_ARGS) ereport(ERROR, (errcode(ERRCODE_TOO_MANY_ARGUMENTS), errmsg("cannot pass more than %d arguments to a function", FUNC_MAX_ARGS))); + /* + * Extract arg type info in preparation for function lookup. + * + * If any arguments are Param markers of type VOID, we discard them + * from the parameter list. This is a hack to allow the JDBC driver + * to not have to distinguish "input" and "output" parameter symbols + * while parsing function-call constructs. We can't use foreach() + * because we may modify the list ... + */ + nargs = 0; + for (l = list_head(fargs); l != NULL; l = nextl) + { + Node *arg = lfirst(l); + Oid argtype = exprType(arg); + + nextl = lnext(l); + + if (argtype == VOIDOID && IsA(arg, Param) && !is_column) + { + fargs = list_delete_ptr(fargs, arg); + continue; + } + + actual_arg_types[nargs++] = argtype; + } + if (fargs) { first_arg = linitial(fargs); @@ -99,7 +125,7 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, */ if (nargs == 1 && !agg_star && !agg_distinct && list_length(funcname) == 1) { - Oid argtype = exprType(first_arg); + Oid argtype = actual_arg_types[0]; if (argtype == RECORDOID || ISCOMPLEX(argtype)) { @@ -117,18 +143,7 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, } /* - * Okay, it's not a column projection, so it must really be a - * function. Extract arg type info in preparation for function lookup. - */ - argn = 0; - foreach(l, fargs) - { - Node *arg = lfirst(l); - - actual_arg_types[argn++] = exprType(arg); - } - - /* + * Okay, it's not a column projection, so it must really be a function. * func_get_detail looks up the function in the catalogs, does * disambiguation for polymorphic functions, handles inheritance, and * returns the funcid and type and set or singleton status of the