diff options
Diffstat (limited to 'src/backend/utils/adt/varchar.c')
-rw-r--r-- | src/backend/utils/adt/varchar.c | 738 |
1 files changed, 387 insertions, 351 deletions
diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c index 538063c6225..106ff5dad26 100644 --- a/src/backend/utils/adt/varchar.c +++ b/src/backend/utils/adt/varchar.c @@ -1,17 +1,17 @@ /*------------------------------------------------------------------------- * * varchar.c-- - * Functions for the built-in type char() and varchar(). + * Functions for the built-in type char() and varchar(). * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.8 1997/08/12 20:16:07 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.9 1997/09/07 04:52:53 momjian Exp $ * *------------------------------------------------------------------------- */ -#include <stdio.h> /* for sprintf() */ +#include <stdio.h> /* for sprintf() */ #include <string.h> #include "postgres.h" #include "utils/builtins.h" @@ -35,488 +35,524 @@ * the length for the comparison functions. (The difference between "text" * is that we truncate and possibly blank-pad the string at insertion time.) * - * - ay 6/95 + * - ay 6/95 */ -/***************************************************************************** - * bpchar - char() * +/***************************************************************************** + * bpchar - char() * *****************************************************************************/ /* * bpcharin - - * converts a string of char() type to the internal representation. - * len is the length specified in () plus 4 bytes. (XXX dummy is here - * because we pass typelem as the second argument for array_in.) + * converts a string of char() type to the internal representation. + * len is the length specified in () plus 4 bytes. (XXX dummy is here + * because we pass typelem as the second argument for array_in.) */ -char * +char * bpcharin(char *s, int dummy, int typlen) { - char *result, *r; - int len = typlen - 4; - int i; - - if (s == NULL) - return((char *) NULL); - - if (typlen == -1) { - /* - * this is here because some functions can't supply the typlen - */ - len = strlen(s); - typlen = len + 4; - } - - if (len > 4096) - elog(WARN, "bpcharin: length of char() must be less than 4096"); - - result = (char *) palloc(typlen); - *(int32*)result = typlen; - r = result + 4; - for(i=0; i < len; i++, r++, s++) { - *r = *s; - if (*r == '\0') - break; - } - /* blank pad the string if necessary */ - for(; i < len; i++) { - *r++ = ' '; - } - return(result); + char *result, + *r; + int len = typlen - 4; + int i; + + if (s == NULL) + return ((char *) NULL); + + if (typlen == -1) + { + + /* + * this is here because some functions can't supply the typlen + */ + len = strlen(s); + typlen = len + 4; + } + + if (len > 4096) + elog(WARN, "bpcharin: length of char() must be less than 4096"); + + result = (char *) palloc(typlen); + *(int32 *) result = typlen; + r = result + 4; + for (i = 0; i < len; i++, r++, s++) + { + *r = *s; + if (*r == '\0') + break; + } + /* blank pad the string if necessary */ + for (; i < len; i++) + { + *r++ = ' '; + } + return (result); } -char * +char * bpcharout(char *s) { - char *result; - int len; - - if (s == NULL) { - result = (char *) palloc(2); - result[0] = '-'; - result[1] = '\0'; - } else { - len = *(int32*)s - 4; - result = (char *) palloc(len+1); - strNcpy(result, s+4, len); /* these are blank-padded */ - } - return(result); + char *result; + int len; + + if (s == NULL) + { + result = (char *) palloc(2); + result[0] = '-'; + result[1] = '\0'; + } + else + { + len = *(int32 *) s - 4; + result = (char *) palloc(len + 1); + strNcpy(result, s + 4, len); /* these are blank-padded */ + } + return (result); } -/***************************************************************************** - * varchar - varchar() * +/***************************************************************************** + * varchar - varchar() * *****************************************************************************/ /* * vcharin - - * converts a string of varchar() type to the internal representation. - * len is the length specified in () plus 4 bytes. (XXX dummy is here - * because we pass typelem as the second argument for array_in.) + * converts a string of varchar() type to the internal representation. + * len is the length specified in () plus 4 bytes. (XXX dummy is here + * because we pass typelem as the second argument for array_in.) */ -char * +char * varcharin(char *s, int dummy, int typlen) { - char *result; - int len = typlen - 4; - - if (s == NULL) - return((char *) NULL); - - if (typlen == -1) { - /* - * this is here because some functions can't supply the typlen - */ - len = strlen(s); - typlen = len + 4; - } - - if (len > 4096) - elog(WARN, "varcharin: length of char() must be less than 4096"); - - result = (char *) palloc(typlen); - *(int32*)result = typlen; - strncpy(result+4, s, len); - - return(result); + char *result; + int len = typlen - 4; + + if (s == NULL) + return ((char *) NULL); + + if (typlen == -1) + { + + /* + * this is here because some functions can't supply the typlen + */ + len = strlen(s); + typlen = len + 4; + } + + if (len > 4096) + elog(WARN, "varcharin: length of char() must be less than 4096"); + + result = (char *) palloc(typlen); + *(int32 *) result = typlen; + strncpy(result + 4, s, len); + + return (result); } -char * +char * varcharout(char *s) { - char *result; - int len; - - if (s == NULL) { - result = (char *) palloc(2); - result[0] = '-'; - result[1] = '\0'; - } else { - len = *(int32*)s - 4; - result = (char *) palloc(len+1); - strNcpy(result, s+4, len); - } - return(result); + char *result; + int len; + + if (s == NULL) + { + result = (char *) palloc(2); + result[0] = '-'; + result[1] = '\0'; + } + else + { + len = *(int32 *) s - 4; + result = (char *) palloc(len + 1); + strNcpy(result, s + 4, len); + } + return (result); } /***************************************************************************** - * Comparison Functions used for bpchar + * Comparison Functions used for bpchar *****************************************************************************/ static int bcTruelen(char *arg) { - char *s = arg + 4; - int i; - int len; - - len = *(int32*)arg - 4; - for(i=len-1; i >= 0; i--) { - if (s[i] != ' ') - break; - } - return (i+1); + char *s = arg + 4; + int i; + int len; + + len = *(int32 *) arg - 4; + for (i = len - 1; i >= 0; i--) + { + if (s[i] != ' ') + break; + } + return (i + 1); } bool bpchareq(char *arg1, char *arg2) { - int len1, len2; + int len1, + len2; + + if (arg1 == NULL || arg2 == NULL) + return ((bool) 0); + len1 = bcTruelen(arg1); + len2 = bcTruelen(arg2); - if (arg1 == NULL || arg2 == NULL) - return((bool) 0); - len1 = bcTruelen(arg1); - len2 = bcTruelen(arg2); + if (len1 != len2) + return 0; - if (len1!=len2) - return 0; - - return(strncmp(arg1+4, arg2+4, len1) == 0); + return (strncmp(arg1 + 4, arg2 + 4, len1) == 0); } bool bpcharne(char *arg1, char *arg2) { - int len1, len2; + int len1, + len2; - if (arg1 == NULL || arg2 == NULL) - return((bool) 0); - len1 = bcTruelen(arg1); - len2 = bcTruelen(arg2); + if (arg1 == NULL || arg2 == NULL) + return ((bool) 0); + len1 = bcTruelen(arg1); + len2 = bcTruelen(arg2); - if (len1!=len2) - return 1; + if (len1 != len2) + return 1; - return(strncmp(arg1+4, arg2+4, len1) != 0); + return (strncmp(arg1 + 4, arg2 + 4, len1) != 0); } bool bpcharlt(char *arg1, char *arg2) { - int len1, len2; - int cmp; - - if (arg1 == NULL || arg2 == NULL) - return((bool) 0); - len1 = bcTruelen(arg1); - len2 = bcTruelen(arg2); - - cmp = strncmp(arg1+4, arg2+4, Min(len1,len2)); - if (cmp == 0) - return (len1<len2); - else - return (cmp < 0); + int len1, + len2; + int cmp; + + if (arg1 == NULL || arg2 == NULL) + return ((bool) 0); + len1 = bcTruelen(arg1); + len2 = bcTruelen(arg2); + + cmp = strncmp(arg1 + 4, arg2 + 4, Min(len1, len2)); + if (cmp == 0) + return (len1 < len2); + else + return (cmp < 0); } bool bpcharle(char *arg1, char *arg2) { - int len1, len2; - int cmp; - - if (arg1 == NULL || arg2 == NULL) - return((bool) 0); - len1 = bcTruelen(arg1); - len2 = bcTruelen(arg2); - - cmp = strncmp(arg1+4, arg2+4, Min(len1,len2)); - if (0 == cmp) - return (bool)(len1 <= len2 ? 1 : 0); - else - return (bool)(cmp <= 0); + int len1, + len2; + int cmp; + + if (arg1 == NULL || arg2 == NULL) + return ((bool) 0); + len1 = bcTruelen(arg1); + len2 = bcTruelen(arg2); + + cmp = strncmp(arg1 + 4, arg2 + 4, Min(len1, len2)); + if (0 == cmp) + return (bool) (len1 <= len2 ? 1 : 0); + else + return (bool) (cmp <= 0); } bool bpchargt(char *arg1, char *arg2) { - int len1, len2; - int cmp; - - if (arg1 == NULL || arg2 == NULL) - return((bool) 0); - len1 = bcTruelen(arg1); - len2 = bcTruelen(arg2); - - cmp = strncmp(arg1+4, arg2+4, Min(len1,len2)); - if (cmp == 0) - return (len1 > len2); - else - return (cmp > 0); + int len1, + len2; + int cmp; + + if (arg1 == NULL || arg2 == NULL) + return ((bool) 0); + len1 = bcTruelen(arg1); + len2 = bcTruelen(arg2); + + cmp = strncmp(arg1 + 4, arg2 + 4, Min(len1, len2)); + if (cmp == 0) + return (len1 > len2); + else + return (cmp > 0); } bool bpcharge(char *arg1, char *arg2) { - int len1, len2; - int cmp; - - if (arg1 == NULL || arg2 == NULL) - return((bool) 0); - len1 = bcTruelen(arg1); - len2 = bcTruelen(arg2); - - cmp = strncmp(arg1+4, arg2+4, Min(len1,len2)); - if (0 == cmp) - return (bool)(len1 >= len2 ? 1 : 0); - else - return (bool)(cmp >= 0); + int len1, + len2; + int cmp; + + if (arg1 == NULL || arg2 == NULL) + return ((bool) 0); + len1 = bcTruelen(arg1); + len2 = bcTruelen(arg2); + + cmp = strncmp(arg1 + 4, arg2 + 4, Min(len1, len2)); + if (0 == cmp) + return (bool) (len1 >= len2 ? 1 : 0); + else + return (bool) (cmp >= 0); } int32 bpcharcmp(char *arg1, char *arg2) { - int len1, len2; - int cmp; - - len1 = bcTruelen(arg1); - len2 = bcTruelen(arg2); - - cmp = strncmp(arg1+4, arg2+4, Min(len1,len2)); - if ((0 == cmp) && (len1 != len2)) - return (int32)(len1 < len2 ? -1 : 1); - else - return cmp; + int len1, + len2; + int cmp; + + len1 = bcTruelen(arg1); + len2 = bcTruelen(arg2); + + cmp = strncmp(arg1 + 4, arg2 + 4, Min(len1, len2)); + if ((0 == cmp) && (len1 != len2)) + return (int32) (len1 < len2 ? -1 : 1); + else + return cmp; } /***************************************************************************** - * Comparison Functions used for varchar + * Comparison Functions used for varchar *****************************************************************************/ static int vcTruelen(char *arg) { - char *s = arg + 4; - int i; - int len; - - len = *(int32*)arg - 4; - for(i=0; i < len; i++) { - if (*s++ == '\0') - break; - } - return i; + char *s = arg + 4; + int i; + int len; + + len = *(int32 *) arg - 4; + for (i = 0; i < len; i++) + { + if (*s++ == '\0') + break; + } + return i; } bool varchareq(char *arg1, char *arg2) { - int len1, len2; + int len1, + len2; + + if (arg1 == NULL || arg2 == NULL) + return ((bool) 0); + len1 = vcTruelen(arg1); + len2 = vcTruelen(arg2); - if (arg1 == NULL || arg2 == NULL) - return((bool) 0); - len1 = vcTruelen(arg1); - len2 = vcTruelen(arg2); + if (len1 != len2) + return 0; - if (len1!=len2) - return 0; - - return(strncmp(arg1+4, arg2+4, len1) == 0); + return (strncmp(arg1 + 4, arg2 + 4, len1) == 0); } bool varcharne(char *arg1, char *arg2) { - int len1, len2; + int len1, + len2; - if (arg1 == NULL || arg2 == NULL) - return((bool) 0); - len1 = vcTruelen(arg1); - len2 = vcTruelen(arg2); + if (arg1 == NULL || arg2 == NULL) + return ((bool) 0); + len1 = vcTruelen(arg1); + len2 = vcTruelen(arg2); - if (len1!=len2) - return 1; + if (len1 != len2) + return 1; - return(strncmp(arg1+4, arg2+4, len1) != 0); + return (strncmp(arg1 + 4, arg2 + 4, len1) != 0); } bool varcharlt(char *arg1, char *arg2) { - int len1, len2; - int cmp; - - if (arg1 == NULL || arg2 == NULL) - return((bool) 0); - len1 = vcTruelen(arg1); - len2 = vcTruelen(arg2); - - cmp = strncmp(arg1+4, arg2+4, Min(len1,len2)); - if (cmp == 0) - return (len1<len2); - else - return (cmp < 0); + int len1, + len2; + int cmp; + + if (arg1 == NULL || arg2 == NULL) + return ((bool) 0); + len1 = vcTruelen(arg1); + len2 = vcTruelen(arg2); + + cmp = strncmp(arg1 + 4, arg2 + 4, Min(len1, len2)); + if (cmp == 0) + return (len1 < len2); + else + return (cmp < 0); } bool varcharle(char *arg1, char *arg2) { - int len1, len2; - int cmp; - - if (arg1 == NULL || arg2 == NULL) - return((bool) 0); - len1 = vcTruelen(arg1); - len2 = vcTruelen(arg2); - - cmp = strncmp(arg1+4, arg2+4, Min(len1,len2)); - if (0 == cmp) - return (bool)( len1 <= len2 ? 1 : 0); - else - return (bool)(cmp <= 0); + int len1, + len2; + int cmp; + + if (arg1 == NULL || arg2 == NULL) + return ((bool) 0); + len1 = vcTruelen(arg1); + len2 = vcTruelen(arg2); + + cmp = strncmp(arg1 + 4, arg2 + 4, Min(len1, len2)); + if (0 == cmp) + return (bool) (len1 <= len2 ? 1 : 0); + else + return (bool) (cmp <= 0); } bool varchargt(char *arg1, char *arg2) { - int len1, len2; - int cmp; - - if (arg1 == NULL || arg2 == NULL) - return((bool) 0); - len1 = vcTruelen(arg1); - len2 = vcTruelen(arg2); - - cmp = strncmp(arg1+4, arg2+4, Min(len1,len2)); - if (cmp == 0) - return (len1 > len2); - else - return (cmp > 0); + int len1, + len2; + int cmp; + + if (arg1 == NULL || arg2 == NULL) + return ((bool) 0); + len1 = vcTruelen(arg1); + len2 = vcTruelen(arg2); + + cmp = strncmp(arg1 + 4, arg2 + 4, Min(len1, len2)); + if (cmp == 0) + return (len1 > len2); + else + return (cmp > 0); } bool varcharge(char *arg1, char *arg2) { - int len1, len2; - int cmp; + int len1, + len2; + int cmp; - if (arg1 == NULL || arg2 == NULL) - return((bool) 0); - len1 = vcTruelen(arg1); - len2 = vcTruelen(arg2); + if (arg1 == NULL || arg2 == NULL) + return ((bool) 0); + len1 = vcTruelen(arg1); + len2 = vcTruelen(arg2); - cmp = strncmp(arg1+4, arg2+4, Min(len1,len2)); - if (0 == cmp) - return (bool)(len1 >= len2 ? 1 : 0); - else - return (bool)(cmp >= 0); + cmp = strncmp(arg1 + 4, arg2 + 4, Min(len1, len2)); + if (0 == cmp) + return (bool) (len1 >= len2 ? 1 : 0); + else + return (bool) (cmp >= 0); } int32 varcharcmp(char *arg1, char *arg2) { - int len1, len2; - int cmp; - - len1 = vcTruelen(arg1); - len2 = vcTruelen(arg2); - cmp = (strncmp(arg1+4, arg2+4, Min(len1,len2))); - if ((0 == cmp) && (len1 != len2)) - return (int32)(len1 < len2 ? -1 : 1); - else - return (int32)(cmp); + int len1, + len2; + int cmp; + + len1 = vcTruelen(arg1); + len2 = vcTruelen(arg2); + cmp = (strncmp(arg1 + 4, arg2 + 4, Min(len1, len2))); + if ((0 == cmp) && (len1 != len2)) + return (int32) (len1 < len2 ? -1 : 1); + else + return (int32) (cmp); } /***************************************************************************** * Hash functions (modified from hashtext in access/hash/hashfunc.c) *****************************************************************************/ -uint32 hashbpchar(struct varlena *key) +uint32 +hashbpchar(struct varlena * key) { - int keylen; - char *keydata; - uint32 n; - int loop; - - keydata = VARDATA(key); - keylen = bcTruelen((char*)key); - -#define HASHC n = *keydata++ + 65599 * n - - n = 0; - if (keylen > 0) { - loop = (keylen + 8 - 1) >> 3; - - switch (keylen & (8 - 1)) { - case 0: - do { /* All fall throughs */ - HASHC; - case 7: - HASHC; - case 6: - HASHC; - case 5: - HASHC; - case 4: - HASHC; - case 3: - HASHC; - case 2: - HASHC; - case 1: - HASHC; - } while (--loop); + int keylen; + char *keydata; + uint32 n; + int loop; + + keydata = VARDATA(key); + keylen = bcTruelen((char *) key); + +#define HASHC n = *keydata++ + 65599 * n + + n = 0; + if (keylen > 0) + { + loop = (keylen + 8 - 1) >> 3; + + switch (keylen & (8 - 1)) + { + case 0: + do + { /* All fall throughs */ + HASHC; + case 7: + HASHC; + case 6: + HASHC; + case 5: + HASHC; + case 4: + HASHC; + case 3: + HASHC; + case 2: + HASHC; + case 1: + HASHC; + } while (--loop); + } } - } - return (n); -} + return (n); +} -uint32 hashvarchar(struct varlena *key) +uint32 +hashvarchar(struct varlena * key) { - int keylen; - char *keydata; - uint32 n; - int loop; - - keydata = VARDATA(key); - keylen = vcTruelen((char*)key); - -#define HASHC n = *keydata++ + 65599 * n - - n = 0; - if (keylen > 0) { - loop = (keylen + 8 - 1) >> 3; - - switch (keylen & (8 - 1)) { - case 0: - do { /* All fall throughs */ - HASHC; - case 7: - HASHC; - case 6: - HASHC; - case 5: - HASHC; - case 4: - HASHC; - case 3: - HASHC; - case 2: - HASHC; - case 1: - HASHC; - } while (--loop); + int keylen; + char *keydata; + uint32 n; + int loop; + + keydata = VARDATA(key); + keylen = vcTruelen((char *) key); + +#define HASHC n = *keydata++ + 65599 * n + + n = 0; + if (keylen > 0) + { + loop = (keylen + 8 - 1) >> 3; + + switch (keylen & (8 - 1)) + { + case 0: + do + { /* All fall throughs */ + HASHC; + case 7: + HASHC; + case 6: + HASHC; + case 5: + HASHC; + case 4: + HASHC; + case 3: + HASHC; + case 2: + HASHC; + case 1: + HASHC; + } while (--loop); + } } - } - return (n); -} - + return (n); +} |