On Monday, 22 July, 2019 04:34, Enzo <contact.enz...@gmail.com> wrote:

>It is not the same information.

>I want to be able to determine "has the user bound all placeholder
>values with data?".

>The user provides this as input:

>query="SELECT ?, ?10"
>data={"0": "data-a", "10": "data-b"}

>Note: This IS valid, as they have provided all data for placeholders.

>Using the APIs you mentioned:

>count=10
>name(10) = "?10"

>So according to the API, the indexes [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>are placeholders in the query.

>As you can see, only indexes [1, 10] are valid placeholders in the
>query.

>So, as far as I can tell, it is not possible to get this from the
>API:

>query="SELECT ?, ?10"
>valid_placeholder_indexes=[1, 10]

>It is only possible to get this:

>query="SELECT ?, ?10"
>maybe_placeholder_indexes=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

The fundamental issue is that you are confusing POSITIONAL parameters with 
NAMED parameters.  ?nnn where nnn is numeric describe POSITIONAL parameters, so 
in the query SELECT ?, ?10 you are using positional parameter 1 and positional 
parameter 10.  That implies that there are 10 positional parameters.  The fact 
that you are only using those positional parameters sparsely (only using 
positional parameter 1 and positional parameter 10) does not mean that you are 
using two parameters, it means that you are using 10, but only referencing 2 of 
them.

Said another way, you are declaring a function that looks like this:

int stmt(a, b, c, d, e, f, g, h, i, j)
   return a + j

and expecting to be able to call it as

z = stmt(1, 6)

expecting some magic to know that the second parameter is really parameter 10.

https://www.sqlite.org/lang_expr.html#varparam

There may be many positional parameters (like 999 in the default build) and 
sqlite3_bind_parameter_count returns the "index" of the greatest parameter 
number used in the statement.  Having created 10 parameters sqlite has 
absolutely no clue that you happen to be using only parameter 1 and parameter 
10.  If you only needed 2 parameters you should have only created 2, not 10.  
That is what NAMED parameters are for.

If you change from using positional (?) parameters to using named (:) or (@) 
what happens?

select :1, :10; should only create 2 parameters named :1 and :10 ...

-- 
The fact that there's a Highway to Hell but only a Stairway to Heaven says a 
lot about anticipated traffic volume.




_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to