From: | "Jeff Urlwin" <jurlwin(at)bellatlantic(dot)net> |
---|---|
To: | "David Wheeler" <david(at)wheeler(dot)net>, "Jeff Urlwin" <jurlwin(at)bellatlantic(dot)net> |
Cc: | <dbi-dev(at)perl(dot)org>, <pgsql-interfaces(at)postgresql(dot)org> |
Subject: | Re: :PgSQL: More Queestions |
Date: | 2002-11-21 14:45:46 |
Message-ID: | OEEMJFLOJPABMFADAPIKKEDIEDAA.jurlwin@bellatlantic.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-interfaces |
> >> Maybe it's just too complex, because, looking at DBD::ODBC's
> >> dbd_preparse(), the handling of literals in the query seems a good
> >> deal
> >> more straight-forward (though it doesn't appear to handle '\'' or "\""
> >> -- am I reading that right?
> >
> > Nope, it handles " or '.
> >
> > if (*src == '"' || *src == '\'') {
> > etc...
> > }
>
> It doesn't appear to handle "...""...", though, right? Or am I missing
> it?
Actually, it does, but completely "accidentally". DBD::ODBC is not
concerned with the fact that there are " inside the ", so:
the first quote sets in_literal=1 (true)
the second quote sets in_literal=0 (false)
the third puts us right back in_literal=1, so we can keep processing.
Since there should be an even number of " marks, I think we're OK here.
Seems too simple, but, it works. There may be a case that gets me, but I
don't think so.
>
> > My advice: if you don't have to support multiple result sets, do it
> once per
> > execute. If you setup that "flag" to avoid re-doing work and find
> > that you
> > need to support multiple-result sets, you can always clear the flag...
>
> I'll have to check with the PostgreSQL folks on this.
>
> PostgreSQL folks, can the same statement return a different number of
> fields on different executes? I'm guessing yes for something like this,
> though:
>
> CREATE TABLE foo ( bar int, bat, text);
>
> SELECT * FROM foo; -- Returns two fields.
>
> ALTER TABLE foo ADD COLUMN fat int;
>
> SELECT * FROM foo; -- Returns three fields.
You probably wouldn't have that prepared as one statement.
Using, say, SQL Server, you can do something like (pseudo code here with
some exaggeration, but I can actually provide test code that someone sent):
sp_pain_to_deal_with(int i) as
if (i == 1)
select a, b, c from foo; /* returns a, b, c as result set */
elseif (i == 2)
delete from foo; /* returns a count, not a result set */
else
select d, a, b, f from foo; /* returns something completely different */
end;
$sth = $dbh->prepare({ call sp_pain_to_deal_with(?)});
$sth->execute(1);
$sth->execute(2);
$sth->execute(3);
all return different result sets.
Or, the more "normal" case:
$sth = $dbh->prepare("insert a, b, c into foo values (?, ?, ?); select
@@identidy;");
which, in one "shot" insert into the table and gets back the
auto-incremented id for the table (again, there is probably a lot of syntax
issue with the above, but the concept is there).
Regards,
Jeff
From | Date | Subject | |
---|---|---|---|
Next Message | David Wheeler | 2002-11-21 16:13:52 | Re: DBD::PostgreSQL |
Previous Message | Thomas A. Lowery | 2002-11-21 13:15:40 | Re: DBD::PostgreSQL compile time /run time version |