/* * charlen.c * * provides a modified version of bpcharlen() that does not * ignore trailing spaces of CHAR arguments to provide an * Oracle compatible length() function */ #include "postgres.h" #include "utils/builtins.h" #include "access/hash.h" #include "access/tuptoaster.h" #include "libpq/pqformat.h" #include "nodes/nodeFuncs.h" #include "utils/array.h" #include "utils/formatting.h" #include "mb/pg_wchar.h" #include "fmgr.h" #include "orafce.h" #include "builtins.h" PG_FUNCTION_INFO_V1(orafce_bpcharlen); Datum orafce_bpcharlen(PG_FUNCTION_ARGS) { BpChar *arg = PG_GETARG_BPCHAR_PP(0); int len; /* byte-length of the argument (trailing spaces not ignored) */ len = VARSIZE_ANY_EXHDR(arg); /* in multibyte encoding, convert to number of characters */ if (pg_database_encoding_max_length() != 1) len = pg_mbstrlen_with_len(VARDATA_ANY(arg), len); PG_RETURN_INT32(len); }