mirror of
https://github.com/postgres/postgres.git
synced 2025-04-21 12:05:57 +03:00
Fix 3-parameter form of bit substring() to throw error for negative length,
as required by SQL standard.
This commit is contained in:
parent
e4a6ebf7de
commit
50626efe0a
@ -9,7 +9,7 @@
|
|||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/utils/adt/varbit.c,v 1.62 2010/01/07 19:53:11 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/utils/adt/varbit.c,v 1.63 2010/01/07 20:17:43 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -23,6 +23,9 @@
|
|||||||
|
|
||||||
#define HEXDIG(z) ((z)<10 ? ((z)+'0') : ((z)-10+'A'))
|
#define HEXDIG(z) ((z)<10 ? ((z)+'0') : ((z)-10+'A'))
|
||||||
|
|
||||||
|
static VarBit *bitsubstring(VarBit *arg, int32 s, int32 l,
|
||||||
|
bool length_not_specified);
|
||||||
|
|
||||||
|
|
||||||
/* common code for bittypmodin and varbittypmodin */
|
/* common code for bittypmodin and varbittypmodin */
|
||||||
static int32
|
static int32
|
||||||
@ -927,9 +930,23 @@ bitcat(PG_FUNCTION_ARGS)
|
|||||||
Datum
|
Datum
|
||||||
bitsubstr(PG_FUNCTION_ARGS)
|
bitsubstr(PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
VarBit *arg = PG_GETARG_VARBIT_P(0);
|
PG_RETURN_VARBIT_P(bitsubstring(PG_GETARG_VARBIT_P(0),
|
||||||
int32 s = PG_GETARG_INT32(1);
|
PG_GETARG_INT32(1),
|
||||||
int32 l = PG_GETARG_INT32(2);
|
PG_GETARG_INT32(2),
|
||||||
|
false));
|
||||||
|
}
|
||||||
|
|
||||||
|
Datum
|
||||||
|
bitsubstr_no_len(PG_FUNCTION_ARGS)
|
||||||
|
{
|
||||||
|
PG_RETURN_VARBIT_P(bitsubstring(PG_GETARG_VARBIT_P(0),
|
||||||
|
PG_GETARG_INT32(1),
|
||||||
|
-1, true));
|
||||||
|
}
|
||||||
|
|
||||||
|
static VarBit *
|
||||||
|
bitsubstring(VarBit *arg, int32 s, int32 l, bool length_not_specified)
|
||||||
|
{
|
||||||
VarBit *result;
|
VarBit *result;
|
||||||
int bitlen,
|
int bitlen,
|
||||||
rbitlen,
|
rbitlen,
|
||||||
@ -947,14 +964,17 @@ bitsubstr(PG_FUNCTION_ARGS)
|
|||||||
bitlen = VARBITLEN(arg);
|
bitlen = VARBITLEN(arg);
|
||||||
s1 = Max(s, 1);
|
s1 = Max(s, 1);
|
||||||
/* If we do not have an upper bound, use end of string */
|
/* If we do not have an upper bound, use end of string */
|
||||||
if (l < 0)
|
if (length_not_specified)
|
||||||
{
|
{
|
||||||
e1 = bitlen + 1;
|
e1 = bitlen + 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
e = s + l;
|
e = s + l;
|
||||||
/* guard against overflow, even though we don't allow L<0 here */
|
/*
|
||||||
|
* A negative value for L is the only way for the end position
|
||||||
|
* to be before the start. SQL99 says to throw an error.
|
||||||
|
*/
|
||||||
if (e < s)
|
if (e < s)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_SUBSTRING_ERROR),
|
(errcode(ERRCODE_SUBSTRING_ERROR),
|
||||||
@ -1011,7 +1031,7 @@ bitsubstr(PG_FUNCTION_ARGS)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PG_RETURN_VARBIT_P(result);
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* bitlength, bitoctetlength
|
/* bitlength, bitoctetlength
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.569 2010/01/06 05:18:18 momjian Exp $
|
* $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.570 2010/01/07 20:17:43 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -53,6 +53,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* yyyymmddN */
|
/* yyyymmddN */
|
||||||
#define CATALOG_VERSION_NO 201001061
|
#define CATALOG_VERSION_NO 201001071
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.559 2010/01/05 01:06:56 tgl Exp $
|
* $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.560 2010/01/07 20:17:44 tgl Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* The script catalog/genbki.pl reads this file and generates .bki
|
* The script catalog/genbki.pl reads this file and generates .bki
|
||||||
@ -2400,7 +2400,7 @@ DESCR("adjust varbit() to typmod length");
|
|||||||
|
|
||||||
DATA(insert OID = 1698 ( position PGNSP PGUID 12 1 0 0 f f f t f i 2 0 23 "1560 1560" _null_ _null_ _null_ _null_ bitposition _null_ _null_ _null_ ));
|
DATA(insert OID = 1698 ( position PGNSP PGUID 12 1 0 0 f f f t f i 2 0 23 "1560 1560" _null_ _null_ _null_ _null_ bitposition _null_ _null_ _null_ ));
|
||||||
DESCR("return position of sub-bitstring");
|
DESCR("return position of sub-bitstring");
|
||||||
DATA(insert OID = 1699 ( substring PGNSP PGUID 14 1 0 0 f f f t f i 2 0 1560 "1560 23" _null_ _null_ _null_ _null_ "select pg_catalog.substring($1, $2, -1)" _null_ _null_ _null_ ));
|
DATA(insert OID = 1699 ( substring PGNSP PGUID 12 1 0 0 f f f t f i 2 0 1560 "1560 23" _null_ _null_ _null_ _null_ bitsubstr_no_len _null_ _null_ _null_ ));
|
||||||
DESCR("return portion of bitstring");
|
DESCR("return portion of bitstring");
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/include/utils/varbit.h,v 1.29 2010/01/02 16:58:10 momjian Exp $
|
* $PostgreSQL: pgsql/src/include/utils/varbit.h,v 1.30 2010/01/07 20:17:44 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -88,6 +88,7 @@ extern Datum bitshiftleft(PG_FUNCTION_ARGS);
|
|||||||
extern Datum bitshiftright(PG_FUNCTION_ARGS);
|
extern Datum bitshiftright(PG_FUNCTION_ARGS);
|
||||||
extern Datum bitcat(PG_FUNCTION_ARGS);
|
extern Datum bitcat(PG_FUNCTION_ARGS);
|
||||||
extern Datum bitsubstr(PG_FUNCTION_ARGS);
|
extern Datum bitsubstr(PG_FUNCTION_ARGS);
|
||||||
|
extern Datum bitsubstr_no_len(PG_FUNCTION_ARGS);
|
||||||
extern Datum bitlength(PG_FUNCTION_ARGS);
|
extern Datum bitlength(PG_FUNCTION_ARGS);
|
||||||
extern Datum bitoctetlength(PG_FUNCTION_ARGS);
|
extern Datum bitoctetlength(PG_FUNCTION_ARGS);
|
||||||
extern Datum bitfromint4(PG_FUNCTION_ARGS);
|
extern Datum bitfromint4(PG_FUNCTION_ARGS);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user