Grokbase
x

Re: the IN clause saga

View PostFlat  Thread  Threaded | < Prev - Next >
Felipe Schnack Re: the IN clause saga
| +1 vote
[ Profile | Reply to group ] [ Flat  Thread  Threaded ]
  I also prefer number one.
Maybe we should do a poll? :-)


On Tue, 22 Jul 2003 16:11:19 +1200
Oliver Jowett <oliver@opencloud.com> wrote:

> Some of the threads on this are getting a bit bogged down, I thought I'd
> summarize the viable options I've seen so far (well, from my point of view
> anyway)
>
> setObject() currently allows the user to bypass parameter escaping via
> setObject(n, string, Types.NUMERIC) (and variants on that). This needs to be
> plugged as it's a potential security hole.
>
> However the same functionality lets you do the (nonstandard) trick of
> providing an IN clause to a PreparedStatement like "SELECT * FROM table
> WHERE pk IN ?". It'd be good to still allow this functionality somehow after
> setObject is fixed. This is going to be a postgresql-specific extension
> however we do it.
>
> Here are the permutations I can remember:
>
> Option 1: add a method to PGStatement that explicitly sets an IN clause,
> taking either a java.sql.Array, java.util.Collection + component type,
> array + component type, or a custom postgresql object
>
>   + there's no confusion as to what it means
> + using a custom object allows access via setObject(..., Types.OTHER)
> consistently, as well as via the extension method.
> - java.sql.Array and java.util.Collection have problems as PGStatement is
> compiled for all JDKs and JDBC versions and those types may not be present
> (we could do a PGJDBC2Statement or something, but that's getting messy)
>   - have to downcast to a PGStatement to use it
>
> Option 2: make setArray() expand to an IN clause when the parameter follows " IN".
>
>   + no new methods or types needed
> - setArray() behaves differently depending on query context
> - user has to wrap the underlying array in a java.sql.Array
>
> Option 3: make setObject(n, Collection [, type]) expand to an IN clause.
>
>   + no new methods or types needed
> - must assume that the contents of the collection use the default type mapping
>     if a type is not provided
> - if a type is provided and we apply it to the *components* of the
> collection, this breaks the general getObject() interface of "bind this
> object interpreting it as this particular type".
> - not obvious what to do with objects that are both Collections and some
> other SQL-relevant type; solutions make setObject's behaviour complex
>     and/or query-context-dependent
>
> Option 4: as 3, but use java arrays (native arrays, not java.sql.Array) instead of
>    java.util.Collection
>
> + as 3, but the ambiguity of "object is both Collection and SQL type X"
>     goes away.
>
> Option 5: don't provide an extension at all i.e. do away with setting IN clauses
>   in this way.
>
>   + no issues with server-side prepare
> - obviously, you can't set IN clauses in one go any more.
>
> 1-4 all need to disable server-side prepare when used.
>
> Did I miss anything? My personal order of preference is 1-2-4-5-3. I have a
> partial implementation of 2 written but it's easy to adapt that to whatever
> external interface.
>
> setArray() needs fixing regardless of what happens here. I hope to have a
> patch for that ready later today.
>
> -O
>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
> (send "unregister YourEmailAddressHere" to [email protected: majo...@postgresql.org])


--

/~\ The ASCII Felipe Schnack ([email protected: fe...@ritterdosreis.br])
 \ / Ribbon Campaign  Analista de Sistemas
  X  Against HTML     Cel.: 51-91287530
 / \ Email!           Linux Counter #281893

Centro Universitário Ritter dos Reis
http://www.ritterdosreis.br
[email protected: r...@ritterdosreis.br]
Fone: 51-32303341

Thread : the IN clause saga
1)
Oliver Jowett Some of the threads on this are getting a bit bogged down, I thought I'd summarize the viable...
2)
Felipe Schnack I also prefer number one. Maybe we should do a poll? :-) > (send "unregister YourEmailAddressHere"...
3)
Fernando Nasser Oliver has to update his summary first. There are some new info from the backend side. Note that...
4)
Fernando Nasser Thanks for summarizing it Oliver. I've asked Tom Lane about the backend behavior and he informed me...
5)
Tom Lane No, it's not the same thing --- the planner can generate an indexscan plan when scalar params are...
6)
Dmitry Tkach it doesn't (at least, not in the current implementation) - Types.OTHER ends up calling setString(),...
7)
Dmitry Tkach It will throw an exception - "Unrecognized parameter type: " + Object.getClass().getName () Well......
8)
Dmitry Tkach This is the same problem, as it generally exists with x=? - the query plan is generally not as good...
9)
Dmitry Tkach Oops :-( I see... that is a world of a differnce :-( Dima ...
10)
Oliver Jowett Ouch. That syntax is going to be messy to transform into an IN clause for <7.4 backends. -O
11)
Fernando Nasser Remember we will already have to know that we are handling the <in values list> clause (i.e. it is...
12)
Dmitry Tkach If I read this correctly, there is no need for any special handling from the driver side - just...
13)
Fernando Nasser With the new V3 protocol this is probably true (7.4 will support V3).
14)
Oliver Jowett Well, certainly, we'd need to change setObject to understand this new type. Good point. Hmm, so...
15)
Oliver Jowett I assume this is only when you're doing a PREPARE/EXECUTE? Hm, then it sounds like the right...
16)
Fernando Nasser yes. That is _exactly_ what I am proposing (option 2 of your summary)...
17)
Barry Lind No you are not. --Barry ...
18)
Fernando Nasser In case you missed my last comment: Mind that this is only necessary for backward compatibility....
19)
Felipe Schnack > (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
20)
Fernando Nasser Mind that this is only necessary for backward compatibility. With 7.4 and the V3 protocol you just...
21)
Darin Ohashi I'm not sure if this makes sense, but could you have a conflict between a set containing a single...
22)
Fernando Nasser You will need to have an Array of Arrays in that case.
23)
Joe Conway Sorry for jumping in but it doesn't seem that everyone understands the new functionality Tom...
24)
peter royal not at all. i say the people that need that write their own layer on top of JDBC. -pete
25)
Darin Ohashi Will this requirement violate the SQL standard for PREPARE/EXECUTE? Darin
26)
Fernando Nasser PREPARE is not a Core SQL statement, it is only defined for embedded SQL extension as it can be...
27)
Kris Jurka Perhaps these cases would also be illustrative as I believe that is what Fernando was suggesting....
28)
Joe Conway Right, as I said, this syntax is trying to compare the scalar value to the entire array value, not...
29)
Fernando Nasser OK, I got the message that the parameter can only be used in the set predicates like ANY but not in...
30)
Joe Conway None of what I mentioned had anything specific to do with PREPARE+EXECUTE. Sorry if I caused any...
31)
Kris Jurka The prepare+execute is no different than the select. It's not going to perform any magic for you....
spacer
View PostFlat  Thread  Threaded | < Prev - Next >
Home > Groups > PostgreSQL - JDBC > the IN clause saga (31 posts) > View Post