1996-07-09 08:22:35 +02:00
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
*
|
1999-02-14 00:22:53 +01:00
|
|
|
* bool.c
|
1997-09-07 07:04:48 +02:00
|
|
|
* Functions for the built-in type "bool".
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
2001-01-24 20:43:33 +01:00
|
|
|
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
|
2000-01-26 06:58:53 +01:00
|
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
|
|
|
*
|
|
|
|
* IDENTIFICATION
|
2001-03-22 05:01:46 +01:00
|
|
|
* $Header: /cvsroot/pgsql/src/backend/utils/adt/bool.c,v 1.25 2001/03/22 03:59:49 momjian Exp $
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
*/
|
1996-11-03 07:54:38 +01:00
|
|
|
|
|
|
|
#include "postgres.h"
|
|
|
|
|
1999-07-16 05:14:30 +02:00
|
|
|
#include "utils/builtins.h"
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
/*****************************************************************************
|
|
|
|
* USER I/O ROUTINES *
|
1996-07-09 08:22:35 +02:00
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
/*
|
1997-09-07 07:04:48 +02:00
|
|
|
* boolin - converts "t" or "f" to 1 or 0
|
1997-10-09 07:06:12 +02:00
|
|
|
*
|
1997-10-17 07:38:32 +02:00
|
|
|
* Check explicitly for "true/false" and TRUE/FALSE, 1/0, YES/NO.
|
|
|
|
* Reject other values. - thomas 1997-10-05
|
|
|
|
*
|
|
|
|
* In the switch statement, check the most-used possibilities first.
|
1996-07-09 08:22:35 +02:00
|
|
|
*/
|
2000-06-05 09:29:25 +02:00
|
|
|
Datum
|
|
|
|
boolin(PG_FUNCTION_ARGS)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
2000-06-05 09:29:25 +02:00
|
|
|
char *b = PG_GETARG_CSTRING(0);
|
|
|
|
|
1998-02-26 05:46:47 +01:00
|
|
|
switch (*b)
|
|
|
|
{
|
2001-03-22 05:01:46 +01:00
|
|
|
case 't':
|
|
|
|
case 'T':
|
1997-10-25 07:09:58 +02:00
|
|
|
if (strncasecmp(b, "true", strlen(b)) == 0)
|
2000-06-05 09:29:25 +02:00
|
|
|
PG_RETURN_BOOL(true);
|
1997-10-17 07:38:32 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 'f':
|
|
|
|
case 'F':
|
1997-10-25 07:09:58 +02:00
|
|
|
if (strncasecmp(b, "false", strlen(b)) == 0)
|
2000-06-05 09:29:25 +02:00
|
|
|
PG_RETURN_BOOL(false);
|
1997-10-17 07:38:32 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 'y':
|
|
|
|
case 'Y':
|
1997-10-25 07:09:58 +02:00
|
|
|
if (strncasecmp(b, "yes", strlen(b)) == 0)
|
2000-06-05 09:29:25 +02:00
|
|
|
PG_RETURN_BOOL(true);
|
1997-10-25 07:09:58 +02:00
|
|
|
break;
|
|
|
|
|
1997-10-17 07:38:32 +02:00
|
|
|
case '1':
|
1997-10-25 07:09:58 +02:00
|
|
|
if (strncasecmp(b, "1", strlen(b)) == 0)
|
2000-06-05 09:29:25 +02:00
|
|
|
PG_RETURN_BOOL(true);
|
1997-10-17 07:38:32 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 'n':
|
|
|
|
case 'N':
|
1997-10-25 07:09:58 +02:00
|
|
|
if (strncasecmp(b, "no", strlen(b)) == 0)
|
2000-06-05 09:29:25 +02:00
|
|
|
PG_RETURN_BOOL(false);
|
1997-10-25 07:09:58 +02:00
|
|
|
break;
|
|
|
|
|
1997-10-17 07:38:32 +02:00
|
|
|
case '0':
|
1997-10-25 07:09:58 +02:00
|
|
|
if (strncasecmp(b, "0", strlen(b)) == 0)
|
2000-06-05 09:29:25 +02:00
|
|
|
PG_RETURN_BOOL(false);
|
1997-10-17 07:38:32 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
1998-02-26 05:46:47 +01:00
|
|
|
elog(ERROR, "Bad boolean external representation '%s'", b);
|
2000-06-05 09:29:25 +02:00
|
|
|
|
1997-11-07 07:30:20 +01:00
|
|
|
/* not reached */
|
2000-06-05 09:29:25 +02:00
|
|
|
PG_RETURN_BOOL(false);
|
|
|
|
}
|
1996-07-09 08:22:35 +02:00
|
|
|
|
|
|
|
/*
|
1997-09-07 07:04:48 +02:00
|
|
|
* boolout - converts 1 or 0 to "t" or "f"
|
1996-07-09 08:22:35 +02:00
|
|
|
*/
|
2000-06-05 09:29:25 +02:00
|
|
|
Datum
|
|
|
|
boolout(PG_FUNCTION_ARGS)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
2000-06-05 09:29:25 +02:00
|
|
|
bool b = PG_GETARG_BOOL(0);
|
1997-09-08 04:41:22 +02:00
|
|
|
char *result = (char *) palloc(2);
|
1997-09-07 07:04:48 +02:00
|
|
|
|
2000-06-05 09:29:25 +02:00
|
|
|
result[0] = (b) ? 't' : 'f';
|
1997-09-07 07:04:48 +02:00
|
|
|
result[1] = '\0';
|
2000-06-05 09:29:25 +02:00
|
|
|
PG_RETURN_CSTRING(result);
|
|
|
|
}
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-11-07 07:30:20 +01:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
/*****************************************************************************
|
|
|
|
* PUBLIC ROUTINES *
|
1996-07-09 08:22:35 +02:00
|
|
|
*****************************************************************************/
|
|
|
|
|
2000-06-05 09:29:25 +02:00
|
|
|
Datum
|
|
|
|
booleq(PG_FUNCTION_ARGS)
|
1997-09-07 07:04:48 +02:00
|
|
|
{
|
2000-06-05 09:29:25 +02:00
|
|
|
bool arg1 = PG_GETARG_BOOL(0);
|
|
|
|
bool arg2 = PG_GETARG_BOOL(1);
|
|
|
|
|
|
|
|
PG_RETURN_BOOL(arg1 == arg2);
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
2000-06-05 09:29:25 +02:00
|
|
|
Datum
|
|
|
|
boolne(PG_FUNCTION_ARGS)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
2000-06-05 09:29:25 +02:00
|
|
|
bool arg1 = PG_GETARG_BOOL(0);
|
|
|
|
bool arg2 = PG_GETARG_BOOL(1);
|
|
|
|
|
|
|
|
PG_RETURN_BOOL(arg1 != arg2);
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
2000-06-05 09:29:25 +02:00
|
|
|
Datum
|
|
|
|
boollt(PG_FUNCTION_ARGS)
|
1997-09-07 07:04:48 +02:00
|
|
|
{
|
2000-06-05 09:29:25 +02:00
|
|
|
bool arg1 = PG_GETARG_BOOL(0);
|
|
|
|
bool arg2 = PG_GETARG_BOOL(1);
|
|
|
|
|
|
|
|
PG_RETURN_BOOL(arg1 < arg2);
|
1997-04-27 21:20:16 +02:00
|
|
|
}
|
1996-07-09 08:22:35 +02:00
|
|
|
|
2000-06-05 09:29:25 +02:00
|
|
|
Datum
|
|
|
|
boolgt(PG_FUNCTION_ARGS)
|
1997-09-07 07:04:48 +02:00
|
|
|
{
|
2000-06-05 09:29:25 +02:00
|
|
|
bool arg1 = PG_GETARG_BOOL(0);
|
|
|
|
bool arg2 = PG_GETARG_BOOL(1);
|
|
|
|
|
|
|
|
PG_RETURN_BOOL(arg1 > arg2);
|
1997-04-27 21:20:16 +02:00
|
|
|
}
|
1997-10-30 17:45:12 +01:00
|
|
|
|
2000-06-05 09:29:25 +02:00
|
|
|
Datum
|
|
|
|
boolle(PG_FUNCTION_ARGS)
|
|
|
|
{
|
|
|
|
bool arg1 = PG_GETARG_BOOL(0);
|
|
|
|
bool arg2 = PG_GETARG_BOOL(1);
|
|
|
|
|
|
|
|
PG_RETURN_BOOL(arg1 <= arg2);
|
|
|
|
}
|
|
|
|
|
|
|
|
Datum
|
|
|
|
boolge(PG_FUNCTION_ARGS)
|
|
|
|
{
|
|
|
|
bool arg1 = PG_GETARG_BOOL(0);
|
|
|
|
bool arg2 = PG_GETARG_BOOL(1);
|
|
|
|
|
|
|
|
PG_RETURN_BOOL(arg1 >= arg2);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Per SQL92, istrue() and isfalse() should return false, not NULL,
|
|
|
|
* when presented a NULL input (since NULL is our implementation of
|
|
|
|
* UNKNOWN). Conversely isnottrue() and isnotfalse() should return true.
|
|
|
|
* Therefore, these routines are all declared not-strict in pg_proc
|
|
|
|
* and must do their own checking for null inputs.
|
|
|
|
*
|
|
|
|
* Note we don't need isunknown() and isnotunknown() functions, since
|
|
|
|
* nullvalue() and nonnullvalue() will serve.
|
|
|
|
*/
|
|
|
|
|
|
|
|
Datum
|
|
|
|
istrue(PG_FUNCTION_ARGS)
|
2000-02-10 20:51:52 +01:00
|
|
|
{
|
2000-06-05 09:29:25 +02:00
|
|
|
bool b;
|
|
|
|
|
|
|
|
if (PG_ARGISNULL(0))
|
|
|
|
PG_RETURN_BOOL(false);
|
|
|
|
|
|
|
|
b = PG_GETARG_BOOL(0);
|
|
|
|
|
|
|
|
PG_RETURN_BOOL(b);
|
2000-02-10 20:51:52 +01:00
|
|
|
}
|
|
|
|
|
2000-06-05 09:29:25 +02:00
|
|
|
Datum
|
|
|
|
isfalse(PG_FUNCTION_ARGS)
|
2000-02-10 20:51:52 +01:00
|
|
|
{
|
2000-06-05 09:29:25 +02:00
|
|
|
bool b;
|
|
|
|
|
|
|
|
if (PG_ARGISNULL(0))
|
|
|
|
PG_RETURN_BOOL(false);
|
|
|
|
|
|
|
|
b = PG_GETARG_BOOL(0);
|
|
|
|
|
2001-03-22 05:01:46 +01:00
|
|
|
PG_RETURN_BOOL(!b);
|
2000-02-10 20:51:52 +01:00
|
|
|
}
|
|
|
|
|
2000-06-05 09:29:25 +02:00
|
|
|
Datum
|
|
|
|
isnottrue(PG_FUNCTION_ARGS)
|
1997-10-30 17:45:12 +01:00
|
|
|
{
|
2000-06-05 09:29:25 +02:00
|
|
|
bool b;
|
1997-10-30 17:45:12 +01:00
|
|
|
|
2000-06-05 09:29:25 +02:00
|
|
|
if (PG_ARGISNULL(0))
|
|
|
|
PG_RETURN_BOOL(true);
|
|
|
|
|
|
|
|
b = PG_GETARG_BOOL(0);
|
|
|
|
|
2001-03-22 05:01:46 +01:00
|
|
|
PG_RETURN_BOOL(!b);
|
2000-06-05 09:29:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
Datum
|
|
|
|
isnotfalse(PG_FUNCTION_ARGS)
|
1997-10-30 17:45:12 +01:00
|
|
|
{
|
2000-06-05 09:29:25 +02:00
|
|
|
bool b;
|
|
|
|
|
|
|
|
if (PG_ARGISNULL(0))
|
|
|
|
PG_RETURN_BOOL(true);
|
|
|
|
|
|
|
|
b = PG_GETARG_BOOL(0);
|
|
|
|
|
|
|
|
PG_RETURN_BOOL(b);
|
|
|
|
}
|