Re: Functions in C with Ornate Data Structures - Mailing list pgsql-novice

From Stephen P. Berry
Subject Re: Functions in C with Ornate Data Structures
Date
Msg-id 20020119030110.12D32106FC@schadenfreude.meshuggeneh.net
Whole thread Raw
In response to Re: Functions in C with Ornate Data Structures  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: Functions in C with Ornate Data Structures
List pgsql-novice
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


In message <11292.1011403856@sss.pgh.pa.us>, Tom Lane writes:

>You could, but the amount of data copying needed would be annoying.
>However, there's no law that says you can't cheat.  I'd suggest that
>you build this as an aggregate function whose nominal state value is
>simply a pointer to data structures that are off somewhere else.
>For example, assuming that you are willing to cheat to the extent of
>assuming sizeof(pointer) = sizeof(integer), try something like this:

I'd actually thought of doing something like this, but couldn't find
an actual explicit argument type for pointers[0], and I can't make
the assumption you describe for portability reasons (my three main
test platforms are alpha, sparc64, and x86).

I was also hoping that I could get away with not passing the problem
data structures internally at all...i.e., have a crunch_input() function
that initialises the linked list I need and populates it,
then a crunch_result() function that spits out the result.  The
accumulator is just a dummy variable, and the interesting data structure(s)
aren't in the argument list for any of the functions.  I tried
doing such a thing with an aggregate, but it didn't work---although,
interestingly, invoking the input and result functions manually
in a single session did.  I took this to mean that I really didn't
understand aggregates, so I was assuming it was a novice-level question.
I was sorta hoping this would turn out to be a standard question (although
I couldn't find any useful references in the mailing list archives or
via web searches).

>Now, the important detail: you can't allocate your working
>datastructures with a simple palloc(), because these functions will be
>called in a short-lived memory context.  What I'd suggest is that in
>your setup step, you create a private memory context that is a child
>of TransactionCommandContext; then allocate all your datastructures in
>that.  Then in the crunch_finish step, you needn't bother with retail
>releasing of the data structures, just destroy the private context
>and you're done.

Is there any way to keep `intermediate' data used by user-defined
functions around indefinitely?  I.e., have some sort of crunch_init()
function that creates a bunch of in-memory data structures, which
can then be used by subsequent (and independent) queries?  I'm
assuming not...and if I want to do that sort of thing I should populate
a temporary table with the data from these `intermediate' results.
Or keep all this fancy stuff in standalone applications rather than
in user-defined functions.

It seems like the general class of thing I'm trying to accomplish
isn't that esoteric.  Imagine trying to write a function to compute
the standard deviation of arbitrary precision numbers using the GMP
library or some such.  Note that I'm not saying that that's what I'm
trying to do...I'm just offering it as a simple sample problem in
which one can't pass everything as an argument in an aggregate.  How
does one set about doing such a thing in Postgres?







- -Steve

- -----
0    I was hoping that there would be, since the macro widgetry in
    the version 1 function semantics clearly includes the concept
    of pointers as a distinct type.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.3 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iD8DBQE8SN5tG3kIaxeRZl8RAmPmAJ4ilTeyoC//MRG5JHf7AmNuR7oW/QCdHHqw
RoE/GplKts1rxNO85ADEebk=
=Oedz
-----END PGP SIGNATURE-----

pgsql-novice by date:

Previous
From: Tom Lane
Date:
Subject: Re: Functions in C with Ornate Data Structures
Next
From: Tom Lane
Date:
Subject: Re: Functions in C with Ornate Data Structures