I can confirm it fixes the problem
On Saturday, July 28, 2018 at 3:10:53 PM UTC-7, Jeremy Evans wrote:
>
> On Saturday, July 28, 2018 at 12:58:17 PM UTC-7, Dennis D wrote:
>>
>> JRuby 9.2
>> Sequel 5.10.0
>>
>> I've notices couple side effects with clone functionality in Sequel 5.x
>>
>> when I have a prepared statement,
>>
>> like "<Sequel::JDBC::Dataset/PreparedStatement "INSERT INTO
>> [schema_migrations] ([filename]) VALUES (?)">"
>>
>> and whe I do clone to extand it
>>
>> ps.clone()
>> opts[:prepared_args] get dulicated every time I call clone
>>
>> {:from=>[:schema_migrations],
>>
>> :bind_vars=>{},
>>
>> :prepared_statement_name=>"batch_insert",
>>
>> :prepared_type=>:insert,
>>
>> :prepared_modify_values=>[{:filename=>:$filename}],
>>
>> :orig_dataset=>#<Sequel::JDBC::Dataset: "SELECT * FROM
>> [schema_migrations]">,
>>
>> :no_cache_sql=>true,
>>
>> :prepared_args=>[:filename],
>>
>> :no_delayed_evaluations=>true}
>>
>> ps.clone()
>>
>> {:from=>[:schema_migrations],
>>
>> :bind_vars=>{},
>>
>> :prepared_statement_name=>"batch_insert",
>>
>> :prepared_type=>:insert,
>>
>> :prepared_modify_values=>[{:filename=>:$filename}],
>>
>> :orig_dataset=>#<Sequel::JDBC::Dataset: "SELECT * FROM
>> [schema_migrations]">,
>>
>> :no_cache_sql=>true,
>>
>> :prepared_args=>[:filename, :filename],
>>
>> :no_delayed_evaluations=>true}
>>
>
> My guess is when you clone a prepared statement, it probably doesn't keep
> the cached prepared sql, so it recalculates the prepared_args, appending to
> the existing values. Trying to clone/extend prepared statements is not
> something I've attempted to support before (only #call on a prepared
> statement is supported). Something like this patch will probably work for
> your case:
>
> diff --git a/lib/sequel/dataset/prepared_statements.rb
> b/lib/sequel/dataset/prepared_statements.rb
> index bb26ea404..b02096307 100644
> --- a/lib/sequel/dataset/prepared_statements.rb
> +++ b/lib/sequel/dataset/prepared_statements.rb
> @@ -315,7 +315,9 @@ module Sequel
> # DB.call(:select_by_name, name: 'Blah') # Same thing
> def prepare(type, name, *values)
> ps = to_prepared_statement(type, values, :name=>name,
> :extend=>prepared_statement_modules, :no_delayed_evaluations=>true)
> - ps.prepared_sql
> + sql = ps.prepared_sql
> + ps.prepared_args.freeze
> + ps = ps.clone(:prepared_sql=>sql, :sql=>sql)
> db.set_prepared_statement(name, ps)
> ps
> end
>
> However it would break the case where prepared statement support is
> emulated via string interpolation because the adapter lacks native support,
> as in those cases the SQL cannot be cached. The code could probably be
> changed to add a flag for the emulated vs not-emulated case, and only run
> that code in the not-emulated case. However, it's fairly close until the
> next release, and such a change needs testing on all adapters, so it's
> probably not a change that would make 5.11.0.
>
> Thanks,
> Jeremy
>
--
You received this message because you are subscribed to the Google Groups
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.