X-Original-To: pgsql-interfaces-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id 6526DD1B184 for ; Mon, 2 Aug 2004 21:29:42 -0300 (ADT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 95261-01 for ; Tue, 3 Aug 2004 00:29:36 +0000 (GMT) Received: from esri3.esri.com (dwp.esri.com [198.102.62.250]) by svr1.postgresql.org (Postfix) with ESMTP id DACAAD1B17B for ; Mon, 2 Aug 2004 21:29:31 -0300 (ADT) Received: from zipwire.esri.com (zipwire.esri.com [46.1.2.224]) by esri3.esri.com (8.11.6+Sun/8.11.6) with ESMTP id i730TRE06328; Mon, 2 Aug 2004 17:29:27 -0700 (PDT) Received: by zipwire.esri.com with Internet Mail Service (5.5.2657.72) id ; Mon, 2 Aug 2004 17:29:28 -0700 Message-ID: <491DC5F3D279CD4EB4B157DDD62237F404E27FEF@zipwire.esri.com> From: Brijesh Shrivastav To: "'Tom Lane'" , Brijesh Shrivastav Cc: pgsql-interfaces@postgresql.org Subject: Re: libpq binary transfer of the numeric data type - Date: Mon, 2 Aug 2004 17:29:26 -0700 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2657.72) Content-Type: text/plain; charset="iso-8859-1" X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=0.0 tagged_above=0.0 required=5.0 tests= X-Spam-Level: X-Archive-Number: 200408/3 X-Sequence-Number: 5051 This is the part I am not clear. It seems the numeric_recv function read int16s as you descibed below but returns Numeric structure. What do we get from PQgetvalue(), a Numeric object or a series of int16s followed by array of numeric digits as sent in numeric_send() routine? numeric_recv(PG_FUNCTION_ARGS) { StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); NumericVar value; Numeric res; int len, i; init_var(&value); len = (uint16) pq_getmsgint(buf, sizeof(uint16)); if (len < 0 || len > NUMERIC_MAX_PRECISION + NUMERIC_MAX_RESULT_SCALE) ereport(ERROR, (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION), errmsg("invalid length in external \"numeric\" value"))); alloc_var(&value, len); value.weight = (int16) pq_getmsgint(buf, sizeof(int16)); value.sign = (uint16) pq_getmsgint(buf, sizeof(uint16)); if (!(value.sign == NUMERIC_POS || value.sign == NUMERIC_NEG || value.sign == NUMERIC_NAN)) ereport(ERROR, (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION), errmsg("invalid sign in external \"numeric\" value"))); value.dscale = (uint16) pq_getmsgint(buf, sizeof(uint16)); for (i = 0; i < len; i++) { NumericDigit d = pq_getmsgint(buf, sizeof(NumericDigit)); if (d < 0 || d >= NBASE) ereport(ERROR, (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION), errmsg("invalid digit in external \"numeric\" value"))); value.digits[i] = d; } res = make_result(&value); free_var(&value); PG_RETURN_NUMERIC(res); } warm regards, Brijesh -----Original Message----- From: Tom Lane [mailto:tgl@sss.pgh.pa.us] Sent: Monday, August 02, 2004 4:35 PM To: Brijesh Shrivastav Cc: pgsql-interfaces@postgresql.org Subject: Re: [INTERFACES] libpq binary transfer of the numeric data type - II Brijesh Shrivastav writes: > Has anyone had success with fetching numeric data in binary format? > I tried to follow Tom's advice below and try to reverse engineer from > recv/send function. It seemes the end structure that user will > get is of Numeric type (see struct below) No, it isn't. What you get is a series of int16 fields: pq_sendint(&buf, x.ndigits, sizeof(int16)); pq_sendint(&buf, x.weight, sizeof(int16)); pq_sendint(&buf, x.sign, sizeof(int16)); pq_sendint(&buf, x.dscale, sizeof(int16)); for (i = 0; i < x.ndigits; i++) pq_sendint(&buf, x.digits[i], sizeof(NumericDigit)); Note that the "digits" are base-10000 digits. regards, tom lane