diff options
Diffstat (limited to 'src/backend/utils')
-rw-r--r-- | src/backend/utils/adt/format_type.c | 6 | ||||
-rw-r--r-- | src/backend/utils/adt/varbit.c | 131 |
2 files changed, 42 insertions, 95 deletions
diff --git a/src/backend/utils/adt/format_type.c b/src/backend/utils/adt/format_type.c index 5a860ebbb1c..ca46bccf5b8 100644 --- a/src/backend/utils/adt/format_type.c +++ b/src/backend/utils/adt/format_type.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/format_type.c,v 1.12 2001/05/18 22:54:23 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/format_type.c,v 1.13 2001/05/22 16:37:16 petere Exp $ * *------------------------------------------------------------------------- */ @@ -198,7 +198,7 @@ format_type_internal(Oid type_oid, int32 typemod) buf = pstrdup("character varying"); break; - case ZPBITOID: + case BITOID: if (with_typemod) buf = psnprintf(5 + MAX_INT32_LEN + 1, "bit(%d)", (int) typemod); @@ -262,7 +262,7 @@ type_maximum_size(Oid type_oid, int32 typemod) break; case VARBITOID: - case ZPBITOID: + case BITOID: /* typemod is the (max) number of bits */ return (typemod + (BITS_PER_BYTE - 1)) / BITS_PER_BYTE + 2 * sizeof(int32); diff --git a/src/backend/utils/adt/varbit.c b/src/backend/utils/adt/varbit.c index 5d03683dd6b..d75d05309df 100644 --- a/src/backend/utils/adt/varbit.c +++ b/src/backend/utils/adt/varbit.c @@ -9,7 +9,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varbit.c,v 1.17 2001/05/03 19:00:36 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varbit.c,v 1.18 2001/05/22 16:37:16 petere Exp $ * *------------------------------------------------------------------------- */ @@ -25,10 +25,6 @@ /*---------- - * Prefixes: - * zp -- zero-padded fixed length bit string - * var -- varying bit string - * * attypmod -- contains the length of the bit string in bits, or for * varying bits the maximum length. * @@ -42,13 +38,13 @@ */ /* - * zpbit_in - + * bit_in - * converts a char string to the internal representation of a bitstring. * The length is determined by the number of bits required plus * VARHDRSZ bytes or from atttypmod. */ Datum -zpbit_in(PG_FUNCTION_ARGS) +bit_in(PG_FUNCTION_ARGS) { char *input_string = PG_GETARG_CSTRING(0); @@ -64,8 +60,7 @@ zpbit_in(PG_FUNCTION_ARGS) bitlen, /* Number of bits in the bit string */ slen; /* Length of the input string */ bool bit_not_hex; /* false = hex string true = bit string */ - int bc, - ipad; + int bc; bits8 x = 0; /* Check that the first character is a b or an x */ @@ -99,15 +94,12 @@ zpbit_in(PG_FUNCTION_ARGS) /* * Sometimes atttypmod is not supplied. If it is supplied we need to - * make sure that the bitstring fits. Note that the number of infered - * bits can be larger than the number of actual bits needed, but only - * if we are reading a hex string and not by more than 3 bits, as a - * hex string gives an accurate length up to 4 bits + * make sure that the bitstring fits. */ if (atttypmod <= 0) atttypmod = bitlen; - else if (bit_not_hex ? (bitlen > atttypmod) : (bitlen > atttypmod + 3)) - elog(ERROR, "zpbit_in: bit string too long for bit(%d)", + else if (bitlen != atttypmod) + elog(ERROR, "bit string length does not match type bit(%d)", atttypmod); len = VARBITTOTALLEN(atttypmod); @@ -128,7 +120,7 @@ zpbit_in(PG_FUNCTION_ARGS) if (*sp == '1') *r |= x; else if (*sp != '0') - elog(ERROR, "Cannot parse %c as a binary digit", *sp); + elog(ERROR, "cannot parse %c as a binary digit", *sp); x >>= 1; if (x == 0) { @@ -149,7 +141,7 @@ zpbit_in(PG_FUNCTION_ARGS) else if (*sp >= 'a' && *sp <= 'f') x = (bits8) (*sp - 'a') + 10; else - elog(ERROR, "Cannot parse %c as a hex digit", *sp); + elog(ERROR, "cannot parse %c as a hex digit", *sp); if (bc) { *r++ |= x; @@ -163,31 +155,12 @@ zpbit_in(PG_FUNCTION_ARGS) } } - if (bitlen > atttypmod) - { - /* Check that this fitted */ - r = VARBITEND(result) - 1; - ipad = VARBITPAD(result); - - /* - * The bottom ipad bits of the byte pointed to by r need to be - * zero - */ - if (((*r << (BITS_PER_BYTE - ipad)) & BITMASK) != 0) - elog(ERROR, "zpbit_in: bit string too long for bit(%d)", - atttypmod); - } - PG_RETURN_VARBIT_P(result); } -/* zpbit_out - - * for the time being we print everything as hex strings, as this is likely - * to be more compact than bit strings, and consequently much more efficient - * for long strings - */ + Datum -zpbit_out(PG_FUNCTION_ARGS) +bit_out(PG_FUNCTION_ARGS) { #if 1 /* same as varbit output */ @@ -228,69 +201,59 @@ zpbit_out(PG_FUNCTION_ARGS) #endif } -/* zpbit() +/* bit() * Converts a bit() type to a specific internal length. * len is the bitlength specified in the column definition. */ Datum -zpbit(PG_FUNCTION_ARGS) +bit(PG_FUNCTION_ARGS) { VarBit *arg = PG_GETARG_VARBIT_P(0); int32 len = PG_GETARG_INT32(1); - VarBit *result; - int rlen; /* No work if typmod is invalid or supplied data matches it already */ if (len <= 0 || len == VARBITLEN(arg)) PG_RETURN_VARBIT_P(arg); - - rlen = VARBITTOTALLEN(len); - result = (VarBit *) palloc(rlen); - /* set to 0 so that result is zero-padded if input is shorter */ - memset(result, 0, rlen); - VARATT_SIZEP(result) = rlen; - VARBITLEN(result) = len; - - memcpy(VARBITS(result), VARBITS(arg), - Min(VARBITBYTES(result), VARBITBYTES(arg))); - - PG_RETURN_VARBIT_P(result); + else + elog(ERROR, "bit string length does not match type bit(%d)", + len); + return 0; /* quiet compiler */ } -/* _zpbit() +/* _bit() * Converts an array of bit() elements to a specific internal length. * len is the bitlength specified in the column definition. */ Datum -_zpbit(PG_FUNCTION_ARGS) +_bit(PG_FUNCTION_ARGS) { ArrayType *v = (ArrayType *) PG_GETARG_VARLENA_P(0); int32 len = PG_GETARG_INT32(1); FunctionCallInfoData locfcinfo; /* - * Since zpbit() is a built-in function, we should only need to look + * Since bit() is a built-in function, we should only need to look * it up once per run. */ - static FmgrInfo zpbit_finfo; + static FmgrInfo bit_finfo; - if (zpbit_finfo.fn_oid == InvalidOid) - fmgr_info(F_ZPBIT, &zpbit_finfo); + if (bit_finfo.fn_oid == InvalidOid) + fmgr_info(F_BIT, &bit_finfo); MemSet(&locfcinfo, 0, sizeof(locfcinfo)); - locfcinfo.flinfo = &zpbit_finfo; + locfcinfo.flinfo = &bit_finfo; locfcinfo.nargs = 2; /* We assume we are "strict" and need not worry about null inputs */ locfcinfo.arg[0] = PointerGetDatum(v); locfcinfo.arg[1] = Int32GetDatum(len); - return array_map(&locfcinfo, ZPBITOID, ZPBITOID); + return array_map(&locfcinfo, BITOID, BITOID); } /* * varbit_in - * converts a string to the internal representation of a bitstring. - * This is the same as zpbit_in except that atttypmod is taken as + * This is the same as bit_in except that atttypmod is taken as * the maximum length, not the exact length to force the bitstring to. */ Datum @@ -310,8 +273,7 @@ varbit_in(PG_FUNCTION_ARGS) bitlen, /* Number of bits in the bit string */ slen; /* Length of the input string */ bool bit_not_hex; /* false = hex string true = bit string */ - int bc, - ipad; + int bc; bits8 x = 0; /* Check that the first character is a b or an x */ @@ -340,15 +302,12 @@ varbit_in(PG_FUNCTION_ARGS) /* * Sometimes atttypmod is not supplied. If it is supplied we need to - * make sure that the bitstring fits. Note that the number of infered - * bits can be larger than the number of actual bits needed, but only - * if we are reading a hex string and not by more than 3 bits, as a - * hex string gives an accurate length up to 4 bits + * make sure that the bitstring fits. */ if (atttypmod <= 0) atttypmod = bitlen; - else if (bit_not_hex ? (bitlen > atttypmod) : (bitlen > atttypmod + 3)) - elog(ERROR, "varbit_in: bit string too long for bit varying(%d)", + else if (bitlen > atttypmod) + elog(ERROR, "bit string too long for type bit varying(%d)", atttypmod); len = VARBITTOTALLEN(bitlen); @@ -369,7 +328,7 @@ varbit_in(PG_FUNCTION_ARGS) if (*sp == '1') *r |= x; else if (*sp != '0') - elog(ERROR, "Cannot parse %c as a binary digit", *sp); + elog(ERROR, "cannot parse %c as a binary digit", *sp); x >>= 1; if (x == 0) { @@ -390,7 +349,7 @@ varbit_in(PG_FUNCTION_ARGS) else if (*sp >= 'a' && *sp <= 'f') x = (bits8) (*sp - 'a') + 10; else - elog(ERROR, "Cannot parse %c as a hex digit", *sp); + elog(ERROR, "cannot parse %c as a hex digit", *sp); if (bc) { *r++ |= x; @@ -404,21 +363,6 @@ varbit_in(PG_FUNCTION_ARGS) } } - if (bitlen > atttypmod) - { - /* Check that this fitted */ - r = VARBITEND(result) - 1; - ipad = VARBITPAD(result); - - /* - * The bottom ipad bits of the byte pointed to by r need to be - * zero - */ - if (((*r << (BITS_PER_BYTE - ipad)) & BITMASK) != 0) - elog(ERROR, "varbit_in: bit string too long for bit varying(%d)", - atttypmod); - } - PG_RETURN_VARBIT_P(result); } @@ -477,6 +421,9 @@ varbit(PG_FUNCTION_ARGS) if (len <= 0 || len >= VARBITLEN(arg)) PG_RETURN_VARBIT_P(arg); + if (len < VARBITLEN(arg)) + elog(ERROR, "bit string too long for type bit varying(%d)", len); + rlen = VARBITTOTALLEN(len); result = (VarBit *) palloc(rlen); VARATT_SIZEP(result) = rlen; @@ -868,7 +815,7 @@ bitand(PG_FUNCTION_ARGS) bitlen1 = VARBITLEN(arg1); bitlen2 = VARBITLEN(arg2); if (bitlen1 != bitlen2) - elog(ERROR, "bitand: Cannot AND bitstrings of different sizes"); + elog(ERROR, "cannot AND bit strings of different sizes"); len = VARSIZE(arg1); result = (VarBit *) palloc(len); VARATT_SIZEP(result) = len; @@ -906,7 +853,7 @@ bitor(PG_FUNCTION_ARGS) bitlen1 = VARBITLEN(arg1); bitlen2 = VARBITLEN(arg2); if (bitlen1 != bitlen2) - elog(ERROR, "bitor: Cannot OR bitstrings of different sizes"); + elog(ERROR, "cannot OR bit strings of different sizes"); len = VARSIZE(arg1); result = (VarBit *) palloc(len); VARATT_SIZEP(result) = len; @@ -950,7 +897,7 @@ bitxor(PG_FUNCTION_ARGS) bitlen1 = VARBITLEN(arg1); bitlen2 = VARBITLEN(arg2); if (bitlen1 != bitlen2) - elog(ERROR, "bitxor: Cannot XOR bitstrings of different sizes"); + elog(ERROR, "cannot XOR bit strings of different sizes"); len = VARSIZE(arg1); result = (VarBit *) palloc(len); VARATT_SIZEP(result) = len; @@ -1165,7 +1112,7 @@ bittoint4(PG_FUNCTION_ARGS) /* Check that the bit string is not too long */ if (VARBITLEN(arg) > sizeof(int4) * BITS_PER_BYTE) - elog(ERROR, "Bit string is too large to fit in an int4"); + elog(ERROR, "bit string is too large to fit in type integer"); result = 0; for (r = VARBITS(arg); r < VARBITEND(arg); r++) { |