aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/libpq/fe-exec.c
diff options
context:
space:
mode:
authorMarc G. Fournier <scrappy@hub.org>1996-08-13 01:34:29 +0000
committerMarc G. Fournier <scrappy@hub.org>1996-08-13 01:34:29 +0000
commit9305fc748c21aa12e9360be33c086c58e160ad11 (patch)
tree81effd39d89fa7d53c37a45cd6799814c5d3da89 /src/interfaces/libpq/fe-exec.c
parent78d56d0bcb885732a4504f5c442e60ac079a177b (diff)
downloadpostgresql-9305fc748c21aa12e9360be33c086c58e160ad11.tar.gz
postgresql-9305fc748c21aa12e9360be33c086c58e160ad11.zip
Fixes:
Attached is a patch to allow libpq to determine if a field is null. This is needed because text fields will return a PQgetlength() of 0 whether it is '' or NULL. There is even a comment in the source noting the fact. I have changed the value of the 'len' field for NULL result fields. If the field is null, the len is set to -1 (NULL_LEN). I have changed PQgetlength() to return a 0 length for both '' and NULL. A new function PQgetisnull() returns true or false for NULL. The only risk is to applications that do not use the suggested PQgetlength() call, but read the result 'len' field directly. As this is not recommended, I think we are safe here. A separate documentation patch will be sent. Submitted by: Bruce Momjian <maillist@candle.pha.pa.us>
Diffstat (limited to 'src/interfaces/libpq/fe-exec.c')
-rw-r--r--src/interfaces/libpq/fe-exec.c39
1 files changed, 33 insertions, 6 deletions
diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c
index 3959c079031..b81ae8535b1 100644
--- a/src/interfaces/libpq/fe-exec.c
+++ b/src/interfaces/libpq/fe-exec.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.14 1996/08/10 00:22:48 scrappy Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.15 1996/08/13 01:34:27 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
@@ -156,11 +156,9 @@ getTuple(PGconn *conn, PGresult* result, int binary)
for (i=0;i<nfields;i++) {
if (!(bmap & 0200)) {
/* if the field value is absent, make it '\0' */
- /* XXX this makes it impossible to distinguish NULL
- attributes from "". Is that OK? */
tup[i].value = (char*)malloc(1);
tup[i].value[0] = '\0';
- tup[i].len = 0;
+ tup[i].len = NULL_LEN;
}
else {
/* get the value length (the first four bytes are for length) */
@@ -1469,6 +1467,35 @@ PQgetlength(PGresult *res, int tup_num, int field_num)
"PQgetlength: ERROR! field %d(of %d) of tuple %d(of %d) is not available",
field_num, res->numAttributes - 1, tup_num, res->ntups);
}
-
- return res->tuples[tup_num][field_num].len;
+
+ if (res->tuples[tup_num][field_num].len != NULL_LEN)
+ return res->tuples[tup_num][field_num].len;
+ else
+ return 0;
}
+
+/* PQgetisnull:
+ returns the null status of a field value.
+*/
+int
+PQgetisnull(PGresult *res, int tup_num, int field_num)
+{
+ if (!res) {
+ fprintf(stderr, "PQgetisnull() -- pointer to PQresult is null");
+ return (int)NULL;
+ }
+
+ if (tup_num > (res->ntups - 1 )||
+ field_num > (res->numAttributes - 1)) {
+ fprintf(stderr,
+ "PQgetisnull: ERROR! field %d(of %d) of tuple %d(of %d) is not available",
+ field_num, res->numAttributes - 1, tup_num, res->ntups);
+ }
+
+ if (res->tuples[tup_num][field_num].len == NULL_LEN)
+ return 1;
+ else
+ return 0;
+ }
+
+