|
|
|
|
@ -9,7 +9,7 @@ |
|
|
|
|
* |
|
|
|
|
* |
|
|
|
|
* IDENTIFICATION |
|
|
|
|
* $PostgreSQL: pgsql/src/backend/utils/adt/oracle_compat.c,v 1.52 2004/05/26 16:16:03 tgl Exp $ |
|
|
|
|
* $PostgreSQL: pgsql/src/backend/utils/adt/oracle_compat.c,v 1.53 2004/06/06 22:17:01 tgl Exp $ |
|
|
|
|
* |
|
|
|
|
*------------------------------------------------------------------------- |
|
|
|
|
*/ |
|
|
|
|
@ -166,40 +166,44 @@ Datum |
|
|
|
|
lower(PG_FUNCTION_ARGS) |
|
|
|
|
{ |
|
|
|
|
#ifdef USE_WIDE_UPPER_LOWER |
|
|
|
|
text *string = PG_GETARG_TEXT_P(0); |
|
|
|
|
text *result; |
|
|
|
|
wchar_t *workspace; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
workspace = texttowcs(string); |
|
|
|
|
/* use wide char code only when max encoding length > one */ |
|
|
|
|
if (pg_database_encoding_max_length() > 1) |
|
|
|
|
{ |
|
|
|
|
text *string = PG_GETARG_TEXT_P(0); |
|
|
|
|
text *result; |
|
|
|
|
wchar_t *workspace; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
for (i = 0; workspace[i] != 0; i++) |
|
|
|
|
workspace[i] = towlower(workspace[i]); |
|
|
|
|
workspace = texttowcs(string); |
|
|
|
|
|
|
|
|
|
result = wcstotext(workspace, i); |
|
|
|
|
for (i = 0; workspace[i] != 0; i++) |
|
|
|
|
workspace[i] = towlower(workspace[i]); |
|
|
|
|
|
|
|
|
|
pfree(workspace); |
|
|
|
|
result = wcstotext(workspace, i); |
|
|
|
|
|
|
|
|
|
PG_RETURN_TEXT_P(result); |
|
|
|
|
pfree(workspace); |
|
|
|
|
|
|
|
|
|
#else /* !USE_WIDE_UPPER_LOWER */ |
|
|
|
|
PG_RETURN_TEXT_P(result); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
#endif /* USE_WIDE_UPPER_LOWER */ |
|
|
|
|
{ |
|
|
|
|
text *string = PG_GETARG_TEXT_P_COPY(0); |
|
|
|
|
char *ptr; |
|
|
|
|
int m; |
|
|
|
|
|
|
|
|
|
text *string = PG_GETARG_TEXT_P_COPY(0); |
|
|
|
|
char *ptr; |
|
|
|
|
int m; |
|
|
|
|
/* Since we copied the string, we can scribble directly on the value */ |
|
|
|
|
ptr = VARDATA(string); |
|
|
|
|
m = VARSIZE(string) - VARHDRSZ; |
|
|
|
|
|
|
|
|
|
/* Since we copied the string, we can scribble directly on the value */ |
|
|
|
|
ptr = VARDATA(string); |
|
|
|
|
m = VARSIZE(string) - VARHDRSZ; |
|
|
|
|
while (m-- > 0) |
|
|
|
|
{ |
|
|
|
|
*ptr = tolower((unsigned char) *ptr); |
|
|
|
|
ptr++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
while (m-- > 0) |
|
|
|
|
{ |
|
|
|
|
*ptr = tolower((unsigned char) *ptr); |
|
|
|
|
ptr++; |
|
|
|
|
PG_RETURN_TEXT_P(string); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
PG_RETURN_TEXT_P(string); |
|
|
|
|
#endif /* USE_WIDE_UPPER_LOWER */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -221,40 +225,44 @@ Datum |
|
|
|
|
upper(PG_FUNCTION_ARGS) |
|
|
|
|
{ |
|
|
|
|
#ifdef USE_WIDE_UPPER_LOWER |
|
|
|
|
text *string = PG_GETARG_TEXT_P(0); |
|
|
|
|
text *result; |
|
|
|
|
wchar_t *workspace; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
workspace = texttowcs(string); |
|
|
|
|
/* use wide char code only when max encoding length > one */ |
|
|
|
|
if (pg_database_encoding_max_length() > 1) |
|
|
|
|
{ |
|
|
|
|
text *string = PG_GETARG_TEXT_P(0); |
|
|
|
|
text *result; |
|
|
|
|
wchar_t *workspace; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
for (i = 0; workspace[i] != 0; i++) |
|
|
|
|
workspace[i] = towupper(workspace[i]); |
|
|
|
|
workspace = texttowcs(string); |
|
|
|
|
|
|
|
|
|
result = wcstotext(workspace, i); |
|
|
|
|
for (i = 0; workspace[i] != 0; i++) |
|
|
|
|
workspace[i] = towupper(workspace[i]); |
|
|
|
|
|
|
|
|
|
pfree(workspace); |
|
|
|
|
result = wcstotext(workspace, i); |
|
|
|
|
|
|
|
|
|
PG_RETURN_TEXT_P(result); |
|
|
|
|
pfree(workspace); |
|
|
|
|
|
|
|
|
|
#else /* !USE_WIDE_UPPER_LOWER */ |
|
|
|
|
PG_RETURN_TEXT_P(result); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
#endif /* USE_WIDE_UPPER_LOWER */ |
|
|
|
|
{ |
|
|
|
|
text *string = PG_GETARG_TEXT_P_COPY(0); |
|
|
|
|
char *ptr; |
|
|
|
|
int m; |
|
|
|
|
|
|
|
|
|
text *string = PG_GETARG_TEXT_P_COPY(0); |
|
|
|
|
char *ptr; |
|
|
|
|
int m; |
|
|
|
|
/* Since we copied the string, we can scribble directly on the value */ |
|
|
|
|
ptr = VARDATA(string); |
|
|
|
|
m = VARSIZE(string) - VARHDRSZ; |
|
|
|
|
|
|
|
|
|
/* Since we copied the string, we can scribble directly on the value */ |
|
|
|
|
ptr = VARDATA(string); |
|
|
|
|
m = VARSIZE(string) - VARHDRSZ; |
|
|
|
|
while (m-- > 0) |
|
|
|
|
{ |
|
|
|
|
*ptr = toupper((unsigned char) *ptr); |
|
|
|
|
ptr++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
while (m-- > 0) |
|
|
|
|
{ |
|
|
|
|
*ptr = toupper((unsigned char) *ptr); |
|
|
|
|
ptr++; |
|
|
|
|
PG_RETURN_TEXT_P(string); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
PG_RETURN_TEXT_P(string); |
|
|
|
|
#endif /* USE_WIDE_UPPER_LOWER */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -279,58 +287,56 @@ Datum |
|
|
|
|
initcap(PG_FUNCTION_ARGS) |
|
|
|
|
{ |
|
|
|
|
#ifdef USE_WIDE_UPPER_LOWER |
|
|
|
|
text *string = PG_GETARG_TEXT_P(0); |
|
|
|
|
text *result; |
|
|
|
|
wchar_t *workspace; |
|
|
|
|
int wasalnum = 0; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
workspace = texttowcs(string); |
|
|
|
|
|
|
|
|
|
for (i = 0; workspace[i] != 0; i++) |
|
|
|
|
/* use wide char code only when max encoding length > one */ |
|
|
|
|
if (pg_database_encoding_max_length() > 1) |
|
|
|
|
{ |
|
|
|
|
if (wasalnum) |
|
|
|
|
workspace[i] = towlower(workspace[i]); |
|
|
|
|
else |
|
|
|
|
workspace[i] = towupper(workspace[i]); |
|
|
|
|
wasalnum = iswalnum(workspace[i]); |
|
|
|
|
} |
|
|
|
|
text *string = PG_GETARG_TEXT_P(0); |
|
|
|
|
text *result; |
|
|
|
|
wchar_t *workspace; |
|
|
|
|
int wasalnum = 0; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
result = wcstotext(workspace, i); |
|
|
|
|
workspace = texttowcs(string); |
|
|
|
|
|
|
|
|
|
pfree(workspace); |
|
|
|
|
for (i = 0; workspace[i] != 0; i++) |
|
|
|
|
{ |
|
|
|
|
if (wasalnum) |
|
|
|
|
workspace[i] = towlower(workspace[i]); |
|
|
|
|
else |
|
|
|
|
workspace[i] = towupper(workspace[i]); |
|
|
|
|
wasalnum = iswalnum(workspace[i]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
PG_RETURN_TEXT_P(result); |
|
|
|
|
result = wcstotext(workspace, i); |
|
|
|
|
|
|
|
|
|
#else /* !USE_WIDE_UPPER_LOWER */ |
|
|
|
|
pfree(workspace); |
|
|
|
|
|
|
|
|
|
text *string = PG_GETARG_TEXT_P_COPY(0); |
|
|
|
|
char *ptr; |
|
|
|
|
int m; |
|
|
|
|
PG_RETURN_TEXT_P(result); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
#endif /* USE_WIDE_UPPER_LOWER */ |
|
|
|
|
{ |
|
|
|
|
text *string = PG_GETARG_TEXT_P_COPY(0); |
|
|
|
|
int wasalnum = 0; |
|
|
|
|
char *ptr; |
|
|
|
|
int m; |
|
|
|
|
|
|
|
|
|
/* Since we copied the string, we can scribble directly on the value */ |
|
|
|
|
ptr = VARDATA(string); |
|
|
|
|
m = VARSIZE(string) - VARHDRSZ; |
|
|
|
|
/* Since we copied the string, we can scribble directly on the value */ |
|
|
|
|
ptr = VARDATA(string); |
|
|
|
|
m = VARSIZE(string) - VARHDRSZ; |
|
|
|
|
|
|
|
|
|
if (m > 0) |
|
|
|
|
{ |
|
|
|
|
*ptr = toupper((unsigned char) *ptr); |
|
|
|
|
ptr++; |
|
|
|
|
m--; |
|
|
|
|
} |
|
|
|
|
while (m-- > 0) |
|
|
|
|
{ |
|
|
|
|
if (wasalnum) |
|
|
|
|
*ptr = tolower((unsigned char) *ptr); |
|
|
|
|
else |
|
|
|
|
*ptr = toupper((unsigned char) *ptr); |
|
|
|
|
wasalnum = isalnum((unsigned char) *ptr); |
|
|
|
|
ptr++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
while (m-- > 0) |
|
|
|
|
{ |
|
|
|
|
/* Oracle capitalizes after all non-alphanumeric */ |
|
|
|
|
if (!isalnum((unsigned char) ptr[-1])) |
|
|
|
|
*ptr = toupper((unsigned char) *ptr); |
|
|
|
|
else |
|
|
|
|
*ptr = tolower((unsigned char) *ptr); |
|
|
|
|
ptr++; |
|
|
|
|
PG_RETURN_TEXT_P(string); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
PG_RETURN_TEXT_P(string); |
|
|
|
|
#endif /* USE_WIDE_UPPER_LOWER */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|