On Monday, 10 February, 2020 14:36, Simon Slavin <slav...@bigfraud.org> wrote:
>Does this problem affect unnumbered indexes too ? In other words if I >have >(?,?,?,?,?) >and bind to the fifth one using the index do I have the same problems as >having >(?1,?2,?3,?4,?5) >and bind to the fifth one using its number ? What particular problem are you referring to? When you use a "parameter" in an SQL statement, then during prepare time the total number of unique parameters (and the highest used index) is recorded. An array must be allocated attached to the "statement" containing enough entries to allow all these parameters to be used. So if you use a parameter "?437" then the array size will be allocated of sufficient size to hold 437 parameters. In addition, whenever a "named parameter" is used (?N, :name, @name, $name) then the parameter name is entered into yet another data structure which records which "index position" corresponds to that name. This is so that the sqlite3_bind_parameter_name and sqlite3_bind_parameter_index can map between the name and the number. So if you use (?,?,?,?,?) then an array of 5 parameters will be required, and no name<->index mapping VList will be created. However, if you use: (?1,?2,?3,?4,?5) then an array of 5 parameters will be required, and a name<->index mapping VList will be created for all 5 of the named parameters. If you use: (?,?,?,?5,?4) then an array of 5 parameters will be required, and a name<->index mapping VList will be created for the 2 named parameters (?5 and ?4). If you were to use this: (?,:t,?5,?2) then an array of 5 parameters will be required (the max index used is 5, even though the parameter at index 4 is not referenced) and the name<->index mapping VList will contain ":t"<->2, "?5"<->5. The "?2" name will not be recorded since parameter index 2 already has a name. Perhaps in the case of ?N parameters the extra step of recording the name could be skipped since all "not otherwise named" ?N parameters will always have name ?N and index N. But at the moment the name is recorded in the VList for ?N parameters if no name is registered for the parameter at index N. There is probably a reason for this though I don't know what it is. The generated VDBE program will always refer to parameters by their index and not by their names. The name<->index VList table is kept attached to the statement for use by the sqlite3_bind_parameter_name and sqlite3_bind_parameter_index API functions. -- 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