Disallow dollar sign in operator names, instead allow it as a non-first
character in identifiers. The first change eliminates the current need to put spaces around parameter references, as in "x<=$2". The second change improves compatibility with Oracle and some other RDBMSes. This was discussed and agreed to back in January, but did not get done.
This commit is contained in:
parent
8902aaaa6c
commit
1bd22f55cf
@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
$Header: /cvsroot/pgsql/doc/src/sgml/release.sgml,v 1.193 2003/06/17 23:12:36 tgl Exp $
|
$Header: /cvsroot/pgsql/doc/src/sgml/release.sgml,v 1.194 2003/06/19 23:22:40 tgl Exp $
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<appendix id="release">
|
<appendix id="release">
|
||||||
@ -24,6 +24,8 @@ CDATA means the content is "SGML-free", so you can write without
|
|||||||
worries about funny characters.
|
worries about funny characters.
|
||||||
-->
|
-->
|
||||||
<literallayout><![CDATA[
|
<literallayout><![CDATA[
|
||||||
|
Dollar sign ($) is no longer allowed in operator names
|
||||||
|
Dollar sign ($) can be a non-first character in identifiers
|
||||||
Precision in FLOAT(p) is now interpreted as bits, not decimal digits
|
Precision in FLOAT(p) is now interpreted as bits, not decimal digits
|
||||||
Functional indexes have been generalized into expressional indexes
|
Functional indexes have been generalized into expressional indexes
|
||||||
CHAR(n) to TEXT conversion automatically strips trailing blanks
|
CHAR(n) to TEXT conversion automatically strips trailing blanks
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
$Header: /cvsroot/pgsql/doc/src/sgml/syntax.sgml,v 1.78 2003/06/06 15:04:01 tgl Exp $
|
$Header: /cvsroot/pgsql/doc/src/sgml/syntax.sgml,v 1.79 2003/06/19 23:22:40 tgl Exp $
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<chapter id="sql-syntax">
|
<chapter id="sql-syntax">
|
||||||
@ -109,10 +109,15 @@ INSERT INTO MY_TABLE VALUES (3, 'hi there');
|
|||||||
(<literal>a</literal>-<literal>z</literal>, but also letters with
|
(<literal>a</literal>-<literal>z</literal>, but also letters with
|
||||||
diacritical marks and non-Latin letters) or an underscore
|
diacritical marks and non-Latin letters) or an underscore
|
||||||
(<literal>_</literal>). Subsequent characters in an identifier or
|
(<literal>_</literal>). Subsequent characters in an identifier or
|
||||||
key word can be letters, digits
|
key word can be letters, underscores, digits
|
||||||
(<literal>0</literal>-<literal>9</literal>), or underscores,
|
(<literal>0</literal>-<literal>9</literal>), or dollar signs
|
||||||
although the SQL standard will not define a key word that contains
|
(<literal>$</>). Note that dollar signs are not allowed in identifiers
|
||||||
digits or starts or ends with an underscore.
|
according to the letter of the SQL standard, so their use may render
|
||||||
|
applications less portable.
|
||||||
|
The SQL standard will not define a key word that contains
|
||||||
|
digits or starts or ends with an underscore, so identifiers of this
|
||||||
|
form are safe against possible conflict with future extensions of the
|
||||||
|
standard.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
@ -478,18 +483,11 @@ CAST ( '<replaceable>string</replaceable>' AS <replaceable>type</replaceable> )
|
|||||||
An operator is a sequence of up to <symbol>NAMEDATALEN</symbol>-1
|
An operator is a sequence of up to <symbol>NAMEDATALEN</symbol>-1
|
||||||
(63 by default) characters from the following list:
|
(63 by default) characters from the following list:
|
||||||
<literallayout>
|
<literallayout>
|
||||||
+ - * / < > = ~ ! @ # % ^ & | ` ? $
|
+ - * / < > = ~ ! @ # % ^ & | ` ?
|
||||||
</literallayout>
|
</literallayout>
|
||||||
|
|
||||||
There are a few restrictions on operator names, however:
|
There are a few restrictions on operator names, however:
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
<literal>$</> (dollar) cannot be a single-character operator, although it
|
|
||||||
can be part of a multiple-character operator name.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
<literal>--</literal> and <literal>/*</literal> cannot appear
|
<literal>--</literal> and <literal>/*</literal> cannot appear
|
||||||
@ -503,7 +501,7 @@ CAST ( '<replaceable>string</replaceable>' AS <replaceable>type</replaceable> )
|
|||||||
A multiple-character operator name cannot end in <literal>+</> or <literal>-</>,
|
A multiple-character operator name cannot end in <literal>+</> or <literal>-</>,
|
||||||
unless the name also contains at least one of these characters:
|
unless the name also contains at least one of these characters:
|
||||||
<literallayout>
|
<literallayout>
|
||||||
~ ! @ # % ^ & | ` ? $
|
~ ! @ # % ^ & | ` ?
|
||||||
</literallayout>
|
</literallayout>
|
||||||
For example, <literal>@-</literal> is an allowed operator name,
|
For example, <literal>@-</literal> is an allowed operator name,
|
||||||
but <literal>*-</literal> is not. This restriction allows
|
but <literal>*-</literal> is not. This restriction allows
|
||||||
@ -539,9 +537,9 @@ CAST ( '<replaceable>string</replaceable>' AS <replaceable>type</replaceable> )
|
|||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
A dollar sign (<literal>$</literal>) followed by digits is used
|
A dollar sign (<literal>$</literal>) followed by digits is used
|
||||||
to represent the positional parameters in the body of a function
|
to represent a positional parameter in the body of a function
|
||||||
definition or a prepared statement. In other contexts the
|
definition or a prepared statement. In other contexts the
|
||||||
dollar sign may be part of an operator name.
|
dollar sign may be part of an identifier.
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
@ -965,9 +963,12 @@ SELECT 3 OPERATOR(pg_catalog.+) 4;
|
|||||||
<title>Positional Parameters</title>
|
<title>Positional Parameters</title>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
A positional parameter reference is used to indicate a parameter
|
A positional parameter reference is used to indicate a value
|
||||||
that is supplied externally to an SQL statement. Parameters are
|
that is supplied externally to an SQL statement. Parameters are
|
||||||
used in SQL function definitions and in prepared queries.
|
used in SQL function definitions and in prepared queries. Some
|
||||||
|
client libraries also support specifying data values separately
|
||||||
|
from the SQL command string, in which case parameters are used to
|
||||||
|
refer to the out-of-line data values.
|
||||||
The form of a parameter reference is:
|
The form of a parameter reference is:
|
||||||
<synopsis>
|
<synopsis>
|
||||||
$<replaceable>number</replaceable>
|
$<replaceable>number</replaceable>
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.107 2003/05/29 22:30:02 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.108 2003/06/19 23:22:40 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -174,10 +174,10 @@ xcstop \*+\/
|
|||||||
xcinside [^*/]+
|
xcinside [^*/]+
|
||||||
|
|
||||||
digit [0-9]
|
digit [0-9]
|
||||||
letter [\200-\377_A-Za-z]
|
ident_start [A-Za-z\200-\377_]
|
||||||
letter_or_digit [\200-\377_A-Za-z0-9]
|
ident_cont [A-Za-z\200-\377_0-9\$]
|
||||||
|
|
||||||
identifier {letter}{letter_or_digit}*
|
identifier {ident_start}{ident_cont}*
|
||||||
|
|
||||||
typecast "::"
|
typecast "::"
|
||||||
|
|
||||||
@ -191,8 +191,8 @@ typecast "::"
|
|||||||
* If you change either set, adjust the character lists appearing in the
|
* If you change either set, adjust the character lists appearing in the
|
||||||
* rule for "operator"!
|
* rule for "operator"!
|
||||||
*/
|
*/
|
||||||
self [,()\[\].;$\:\+\-\*\/\%\^\<\>\=]
|
self [,()\[\].;\:\+\-\*\/\%\^\<\>\=]
|
||||||
op_chars [\~\!\@\#\^\&\|\`\?\$\+\-\*\/\%\<\>\=]
|
op_chars [\~\!\@\#\^\&\|\`\?\+\-\*\/\%\<\>\=]
|
||||||
operator {op_chars}+
|
operator {op_chars}+
|
||||||
|
|
||||||
/* we no longer allow unary minus in numbers.
|
/* we no longer allow unary minus in numbers.
|
||||||
@ -461,7 +461,7 @@ other .
|
|||||||
|
|
||||||
for (ic = nchars-2; ic >= 0; ic--)
|
for (ic = nchars-2; ic >= 0; ic--)
|
||||||
{
|
{
|
||||||
if (strchr("~!@#^&|`?$%", yytext[ic]))
|
if (strchr("~!@#^&|`?%", yytext[ic]))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (ic >= 0)
|
if (ic >= 0)
|
||||||
@ -480,7 +480,7 @@ other .
|
|||||||
* that the "self" rule would have.
|
* that the "self" rule would have.
|
||||||
*/
|
*/
|
||||||
if (nchars == 1 &&
|
if (nchars == 1 &&
|
||||||
strchr(",()[].;$:+-*/%^<>=", yytext[0]))
|
strchr(",()[].;:+-*/%^<>=", yytext[0]))
|
||||||
return yytext[0];
|
return yytext[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
* procedural language
|
* procedural language
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.l,v 1.27 2003/06/17 04:35:03 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.l,v 1.28 2003/06/19 23:22:40 tgl Exp $
|
||||||
*
|
*
|
||||||
* This software is copyrighted by Jan Wieck - Hamburg.
|
* This software is copyrighted by Jan Wieck - Hamburg.
|
||||||
*
|
*
|
||||||
@ -72,12 +72,14 @@ int plpgsql_SpaceScanned = 0;
|
|||||||
%x IN_STRING IN_COMMENT
|
%x IN_STRING IN_COMMENT
|
||||||
|
|
||||||
digit [0-9]
|
digit [0-9]
|
||||||
letter [\200-\377_A-Za-z]
|
ident_start [A-Za-z\200-\377_]
|
||||||
letter_or_digit [\200-\377_A-Za-z0-9]
|
ident_cont [A-Za-z\200-\377_0-9\$]
|
||||||
|
|
||||||
quoted_ident (\"[^\"]*\")+
|
quoted_ident (\"[^\"]*\")+
|
||||||
|
|
||||||
identifier ({letter}{letter_or_digit}*|{quoted_ident})
|
identifier ({ident_start}{ident_cont}*|{quoted_ident})
|
||||||
|
|
||||||
|
param \${digit}+
|
||||||
|
|
||||||
space [ \t\n\r\f]
|
space [ \t\n\r\f]
|
||||||
|
|
||||||
@ -197,28 +199,28 @@ dump { return O_DUMP; }
|
|||||||
{identifier}{space}*\.{space}*{identifier}{space}*%ROWTYPE {
|
{identifier}{space}*\.{space}*{identifier}{space}*%ROWTYPE {
|
||||||
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
||||||
return plpgsql_parse_dblwordrowtype(yytext); }
|
return plpgsql_parse_dblwordrowtype(yytext); }
|
||||||
\${digit}+ {
|
{param} {
|
||||||
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
||||||
return plpgsql_parse_word(yytext); }
|
return plpgsql_parse_word(yytext); }
|
||||||
\${digit}+{space}*\.{space}*{identifier} {
|
{param}{space}*\.{space}*{identifier} {
|
||||||
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
||||||
return plpgsql_parse_dblword(yytext); }
|
return plpgsql_parse_dblword(yytext); }
|
||||||
\${digit}+{space}*\.{space}*{identifier}{space}*\.{space}*{identifier} {
|
{param}{space}*\.{space}*{identifier}{space}*\.{space}*{identifier} {
|
||||||
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
||||||
return plpgsql_parse_tripword(yytext); }
|
return plpgsql_parse_tripword(yytext); }
|
||||||
\${digit}+{space}*%TYPE {
|
{param}{space}*%TYPE {
|
||||||
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
||||||
return plpgsql_parse_wordtype(yytext); }
|
return plpgsql_parse_wordtype(yytext); }
|
||||||
\${digit}+{space}*\.{space}*{identifier}{space}*%TYPE {
|
{param}{space}*\.{space}*{identifier}{space}*%TYPE {
|
||||||
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
||||||
return plpgsql_parse_dblwordtype(yytext); }
|
return plpgsql_parse_dblwordtype(yytext); }
|
||||||
\${digit}+{space}*\.{space}*{identifier}{space}*\.{space}*{identifier}{space}*%TYPE {
|
{param}{space}*\.{space}*{identifier}{space}*\.{space}*{identifier}{space}*%TYPE {
|
||||||
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
||||||
return plpgsql_parse_tripwordtype(yytext); }
|
return plpgsql_parse_tripwordtype(yytext); }
|
||||||
\${digit}+{space}*%ROWTYPE {
|
{param}{space}*%ROWTYPE {
|
||||||
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
||||||
return plpgsql_parse_wordrowtype(yytext); }
|
return plpgsql_parse_wordrowtype(yytext); }
|
||||||
\${digit}+{space}*\.{space}*{identifier}{space}*%ROWTYPE {
|
{param}{space}*\.{space}*{identifier}{space}*%ROWTYPE {
|
||||||
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
plpgsql_error_lineno = plpgsql_scanner_lineno();
|
||||||
return plpgsql_parse_dblwordrowtype(yytext); }
|
return plpgsql_parse_dblwordrowtype(yytext); }
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user