sequel 3.42.0 → 3.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. data/CHANGELOG +40 -0
  2. data/MIT-LICENSE +1 -1
  3. data/Rakefile +1 -1
  4. data/doc/opening_databases.rdoc +2 -2
  5. data/doc/prepared_statements.rdoc +7 -0
  6. data/doc/release_notes/3.43.0.txt +105 -0
  7. data/doc/schema_modification.rdoc +19 -0
  8. data/lib/sequel/adapters/do/mysql.rb +1 -1
  9. data/lib/sequel/adapters/jdbc.rb +13 -8
  10. data/lib/sequel/adapters/jdbc/hsqldb.rb +5 -0
  11. data/lib/sequel/adapters/jdbc/mysql.rb +1 -1
  12. data/lib/sequel/adapters/jdbc/oracle.rb +6 -0
  13. data/lib/sequel/adapters/jdbc/postgresql.rb +9 -3
  14. data/lib/sequel/adapters/mysql.rb +1 -1
  15. data/lib/sequel/adapters/mysql2.rb +1 -1
  16. data/lib/sequel/adapters/oracle.rb +1 -1
  17. data/lib/sequel/adapters/postgres.rb +4 -2
  18. data/lib/sequel/adapters/shared/db2.rb +12 -0
  19. data/lib/sequel/adapters/shared/mssql.rb +9 -5
  20. data/lib/sequel/adapters/shared/postgres.rb +2 -0
  21. data/lib/sequel/adapters/swift/mysql.rb +1 -1
  22. data/lib/sequel/core.rb +2 -2
  23. data/lib/sequel/database.rb +0 -2
  24. data/lib/sequel/database/query.rb +20 -5
  25. data/lib/sequel/database/schema_generator.rb +5 -0
  26. data/lib/sequel/database/schema_methods.rb +5 -0
  27. data/lib/sequel/dataset.rb +0 -2
  28. data/lib/sequel/dataset/actions.rb +25 -2
  29. data/lib/sequel/dataset/misc.rb +1 -1
  30. data/lib/sequel/dataset/sql.rb +28 -6
  31. data/lib/sequel/extensions/core_refinements.rb +221 -0
  32. data/lib/sequel/extensions/date_arithmetic.rb +194 -0
  33. data/lib/sequel/extensions/meta_def.rb +30 -0
  34. data/lib/sequel/extensions/migration.rb +5 -0
  35. data/lib/sequel/extensions/null_dataset.rb +2 -0
  36. data/lib/sequel/extensions/pagination.rb +2 -0
  37. data/lib/sequel/extensions/pg_array.rb +12 -1
  38. data/lib/sequel/extensions/pg_array_ops.rb +10 -1
  39. data/lib/sequel/extensions/pg_hstore.rb +12 -1
  40. data/lib/sequel/extensions/pg_hstore_ops.rb +10 -1
  41. data/lib/sequel/extensions/pg_json.rb +18 -1
  42. data/lib/sequel/extensions/pg_range.rb +12 -1
  43. data/lib/sequel/extensions/pg_range_ops.rb +10 -1
  44. data/lib/sequel/extensions/pg_row.rb +18 -2
  45. data/lib/sequel/extensions/pg_row_ops.rb +10 -1
  46. data/lib/sequel/extensions/query.rb +2 -0
  47. data/lib/sequel/model/associations.rb +5 -13
  48. data/lib/sequel/model/base.rb +4 -6
  49. data/lib/sequel/plugins/boolean_readers.rb +4 -2
  50. data/lib/sequel/plugins/many_through_many.rb +23 -0
  51. data/lib/sequel/plugins/string_stripper.rb +53 -3
  52. data/lib/sequel/plugins/validation_class_methods.rb +5 -0
  53. data/lib/sequel/sql.rb +3 -3
  54. data/lib/sequel/version.rb +1 -1
  55. data/spec/adapters/db2_spec.rb +19 -8
  56. data/spec/adapters/mssql_spec.rb +1 -2
  57. data/spec/adapters/mysql_spec.rb +2 -2
  58. data/spec/adapters/postgres_spec.rb +29 -3
  59. data/spec/core/dataset_spec.rb +107 -0
  60. data/spec/core/expression_filters_spec.rb +5 -0
  61. data/spec/core/schema_spec.rb +14 -3
  62. data/spec/core/spec_helper.rb +2 -0
  63. data/spec/extensions/core_refinements_spec.rb +551 -0
  64. data/spec/extensions/date_arithmetic_spec.rb +150 -0
  65. data/spec/extensions/force_encoding_spec.rb +1 -1
  66. data/spec/extensions/meta_def_spec.rb +21 -0
  67. data/spec/extensions/spec_helper.rb +5 -0
  68. data/spec/extensions/string_stripper_spec.rb +44 -2
  69. data/spec/integration/associations_test.rb +2 -2
  70. data/spec/integration/plugin_test.rb +90 -0
  71. data/spec/integration/schema_test.rb +1 -1
  72. data/spec/model/association_reflection_spec.rb +4 -4
  73. data/spec/model/associations_spec.rb +2 -2
  74. data/spec/model/base_spec.rb +2 -2
  75. data/spec/model/eager_loading_spec.rb +5 -5
  76. data/spec/model/hooks_spec.rb +4 -4
  77. data/spec/model/model_spec.rb +9 -9
  78. data/spec/model/record_spec.rb +15 -18
  79. metadata +12 -5
  80. data/lib/sequel/metaprogramming.rb +0 -13
data/CHANGELOG CHANGED
@@ -1,3 +1,43 @@
1
+ === 3.43.0 (2013-01-08)
2
+
3
+ * Move the #meta_def support for Database, Dataset, and Model to the meta_def extension (jeremyevans)
4
+
5
+ * Fix Database#copy_into on jdbc/postgres when an exception is raised (jeremyevans)
6
+
7
+ * Add core_refinements extension, providing refinement versions of Sequel's core extensions (jeremyevans)
8
+
9
+ * Make Database#copy_into raise a DatabaseError if the database signals an error in the postgres adapter (jeremyevans)
10
+
11
+ * Define respond_to_missing? where method_missing is defined and the object supports respond_to? (jeremyevans)
12
+
13
+ * Allow lambda procs with 0 arity as virtual row blocks on ruby 1.9 (jeremyevans)
14
+
15
+ * Handle schema-qualified row_types in the pg_array integration in the pg_row extension (jeremyevans) (#595)
16
+
17
+ * Support default_schema when reseting primary key sequences on PostgreSQL (jeremyevans) (#596)
18
+
19
+ * Allow treating tinyint(1) unsigned columns as booleans in the mysql adapters (jeremyevans)
20
+
21
+ * Support the jdbc-hsqldb gem in the jdbc adapter, since it has been updated to 2.2.9 (jeremyevans)
22
+
23
+ * Work with new jdbc-* gems that require manual driver loading (kares) (#598)
24
+
25
+ * Cast blobs correctly on DB2 when use_clob_as_blob is false (mluu, jeremyevans) (#594)
26
+
27
+ * Add date_arithmetic extension for database-independent date calculations (jeremyevans)
28
+
29
+ * Make Database#schema handle [host.]database.schema.table qualified tables on Microsoft SQL Server (jeremyevans)
30
+
31
+ * Add Dataset#split_qualifiers helper method for splitting a qualifier identifier into array of strings (jeremyevans)
32
+
33
+ * Make Database#schema_and_table always return strings for the schema and table (jeremyevans)
34
+
35
+ * Skip stripping of blob columns in the string_stripper plugin (jeremyevans) (#593)
36
+
37
+ * Allow Dataset#get to take an array to return multiple values, similar to map/select_map (jeremyevans)
38
+
39
+ * Default :prefetch_rows to 100 in the Oracle adapter (andrewhr) (#592)
40
+
1
41
  === 3.42.0 (2012-12-03)
2
42
 
3
43
  * If an exception occurs while committing a transaction, attempt to rollback (jeremyevans)
data/MIT-LICENSE CHANGED
@@ -1,5 +1,5 @@
1
1
  Copyright (c) 2007-2008 Sharon Rosner
2
- Copyright (c) 2008-2012 Jeremy Evans
2
+ Copyright (c) 2008-2013 Jeremy Evans
3
3
 
4
4
  Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  of this software and associated documentation files (the "Software"), to
data/Rakefile CHANGED
@@ -56,7 +56,7 @@ rescue LoadError
56
56
  begin
57
57
  require "rake/rdoctask"
58
58
  Rake::RDocTask
59
- rescue LoadError
59
+ rescue LoadError, StandardError
60
60
  end
61
61
  end
62
62
 
@@ -338,8 +338,8 @@ The following additional options are supported:
338
338
 
339
339
  :autosequence :: Set to true to use Sequel's conventions to guess the sequence to use for datasets. False
340
340
  by default.
341
- :prefetch_rows :: The number of rows to prefetch. Defaults to 1, a larger number can be specified
342
- and will improve performance when retrieving a large number of rows.
341
+ :prefetch_rows :: The number of rows to prefetch. Defaults to 100, a larger number can be specified
342
+ and may improve performance when retrieving a large number of rows.
343
343
  :privilege :: The Oracle privilege level.
344
344
 
345
345
  === postgres
@@ -75,6 +75,13 @@ and update queries, the hash to insert/update is passed to +prepare+:
75
75
  ps2.call(:n=>'Jim', :new_n=>'Bob')
76
76
  DB.call(:update_name, :n=>'Jim', :new_n=>'Bob') # same as above
77
77
 
78
+ == Implementation Issues
79
+
80
+ Currently, creating a prepared statement uses Object#extend, which can hurt
81
+ performance. For high performance applications, it's recommended to create
82
+ all of your prepared statements upon application initialization, and not
83
+ to create prepared statements dynamically at runtime.
84
+
78
85
  == Database support
79
86
 
80
87
  === PostgreSQL
@@ -0,0 +1,105 @@
1
+ = New Features
2
+
3
+ * A core_refinements extension has been added, which offers
4
+ refinement versions of Sequel's core extensions. This requires
5
+ the new experimental refinement support added in ruby 2.0, and
6
+ allows you to use the Sequel DSL methods in a file without
7
+ actually modifying the Symbol, String, Array, and Hash classes.
8
+
9
+ * A date_arithmetic extension has been added for performing
10
+ database-independent date calculations (adding/subtracting an
11
+ interval to/from a date):
12
+
13
+ Sequel.extension :date_arithmetic
14
+ e = Sequel.date_add(:date_column, :years=>1, :months=>2, :days=>3)
15
+ DB[:table].where(e > Sequel::CURRENT_DATE)
16
+
17
+ In addition to providing the interval as a hash, you can also
18
+ provide it as an ActiveSupport::Duration object. This extension
19
+ is supported on 11 database types.
20
+
21
+ * Dataset#get can now take an array of multiple expressions to get
22
+ an array of values, similar to map/select_map:
23
+
24
+ value1, value2 = DB[:table].get([:column1, :column2])
25
+
26
+ * Sequel can now handle [host.]database.schema.table qualified
27
+ tables on Microsoft SQL Server. To implement this support,
28
+ the split_qualifiers method has been added to Database and
29
+ Dataset for taking a possibly qualified identifier and splitting
30
+ it into an array of identifier strings.
31
+
32
+ * The string_stripper plugin now offers the ability to manually
33
+ specify which columns to skip stripping for via
34
+ Model.skip_string_stripping.
35
+
36
+ = Other Improvements
37
+
38
+ * The jdbc adapter now works with the new jdbc-* gems, which require
39
+ a manual load_driver step that the older jdbc-* gems did not
40
+ require.
41
+
42
+ * The string_stripper plugin no longer strips blob columns or values.
43
+
44
+ * Database#copy_into in both the postgres and jdbc/postgres adapters
45
+ has been fixed to better handle exceptions.
46
+
47
+ * Dataset#hash and Model#hash are now significantly faster.
48
+
49
+ * Lambda procs with 0 arity can now be used as virtual row blocks
50
+ on ruby 1.9. Previously, attempting to use a lambda proc with
51
+ 0 arity as a virtual row block on ruby 1.9 would raise an exception.
52
+
53
+ * Schema-qualified composite types are now handled correctly in
54
+ the pg_row extension.
55
+
56
+ * Database#reset_primary_key_sequence on PostgreSQL now works
57
+ correctly when a default_schema is set.
58
+
59
+ * tinyint(1) unsigned columns on MySQL are now parsed as booleans
60
+ instead of integers on MySQL if converting tinyint to boolean.
61
+
62
+ * The jdbc adapter now supports the jdbc-hsqldb gem, so you can
63
+ now install that instead of having to require the .jar manually.
64
+
65
+ * Blobs are now casted correctly on DB2 when the use_clob_as_blob
66
+ setting is false.
67
+
68
+ * Oracle timestamptz types are now handled correctly in the
69
+ jdbc/oracle adapter.
70
+
71
+ * Sequel now defaults to :prefetch_rows = 100 in the oracle
72
+ adapter, which can significantly improve performance.
73
+
74
+ * Sequel now defines respond_to_missing? where method_missing? is
75
+ defined and the object also responds to respond_to?.
76
+
77
+ * Sequel::BasicObject now responds to instance_exec on ruby 1.8.
78
+
79
+ = Backwards Compatibility
80
+
81
+ * The meta_def method that was defined on Database, Dataset, and
82
+ Model classes and instances has been moved to an extension named
83
+ meta_def, and is no longer loaded by default. This method was
84
+ previously used internally, and it wasn't designed for external
85
+ use. If you have code that uses meta_def, you should now load the
86
+ extension manually:
87
+
88
+ Sequel.extension :meta_def
89
+
90
+ * The private _*_dataset_helper model association methods are no
91
+ longer defined. The AssociationReflection#dataset_helper_method
92
+ public method is also no longer defined.
93
+
94
+ * Dataset#schema_and_table now always returns strings (or nil).
95
+ Before, in some cases it would return symbols.
96
+
97
+ * Using a conditions specifier array with Dataset#get no longer
98
+ works due to the new multiple values support in Database#get.
99
+ So code such as:
100
+
101
+ DB[:table].get([[:a, 1], [:b, 2]])
102
+
103
+ should be changed to:
104
+
105
+ DB[:table].get(Sequel.expr([[:a, 1], [:b, 2]]))
@@ -162,6 +162,25 @@ column, but create a foreign key constraint:
162
162
  foreign_key [:artist_name, :artist_location], :artists
163
163
  end
164
164
 
165
+ When using an array of symbols, you can also provide a :name option to name the constraint:
166
+
167
+ create_table(:albums) do
168
+ String :artist_name
169
+ String :artist_location
170
+ String :name
171
+ foreign_key [:artist_name, :artist_location], :artists, :name=>'albums_artist_name_location_fkey'
172
+ end
173
+
174
+ If you want to add a foreign key for a single column with a named constraint, you must use
175
+ the array form with a single symbol:
176
+
177
+ create_table(:albums) do
178
+ primary_key :id
179
+ Integer :artist_id
180
+ String :name
181
+ foreign_key [:artist_id], :artists, :name=>'albums_artist_id_fkey'
182
+ end
183
+
165
184
  ==== +index+
166
185
 
167
186
  +index+ creates indexes on the table. For single columns, calling index is the same as using the
@@ -20,7 +20,7 @@ module Sequel
20
20
 
21
21
  # Recognize the tinyint(1) column as boolean.
22
22
  def schema_column_type(db_type)
23
- db_type == 'tinyint(1)' ? :boolean : super
23
+ db_type =~ /\Atinyint\(1\)/ ? :boolean : super
24
24
  end
25
25
 
26
26
  # Apply the connectiong setting SQLs for every new connection.
@@ -33,14 +33,14 @@ module Sequel
33
33
  Sequel.ts_require 'adapters/jdbc/postgresql'
34
34
  db.extend(Sequel::JDBC::Postgres::DatabaseMethods)
35
35
  db.dataset_class = Sequel::JDBC::Postgres::Dataset
36
- JDBC.load_gem('postgres')
36
+ JDBC.load_gem(:Postgres)
37
37
  org.postgresql.Driver
38
38
  end,
39
39
  :mysql=>proc do |db|
40
40
  Sequel.ts_require 'adapters/jdbc/mysql'
41
41
  db.extend(Sequel::JDBC::MySQL::DatabaseMethods)
42
42
  db.extend_datasets Sequel::MySQL::DatasetMethods
43
- JDBC.load_gem('mysql')
43
+ JDBC.load_gem(:MySQL)
44
44
  com.mysql.jdbc.Driver
45
45
  end,
46
46
  :sqlite=>proc do |db|
@@ -48,7 +48,7 @@ module Sequel
48
48
  db.extend(Sequel::JDBC::SQLite::DatabaseMethods)
49
49
  db.extend_datasets Sequel::SQLite::DatasetMethods
50
50
  db.set_integer_booleans
51
- JDBC.load_gem('sqlite3')
51
+ JDBC.load_gem(:SQLite3)
52
52
  org.sqlite.JDBC
53
53
  end,
54
54
  :oracle=>proc do |db|
@@ -69,28 +69,28 @@ module Sequel
69
69
  db.extend(Sequel::JDBC::JTDS::DatabaseMethods)
70
70
  db.dataset_class = Sequel::JDBC::JTDS::Dataset
71
71
  db.send(:set_mssql_unicode_strings)
72
- JDBC.load_gem('jtds')
72
+ JDBC.load_gem(:JTDS)
73
73
  Java::net.sourceforge.jtds.jdbc.Driver
74
74
  end,
75
75
  :h2=>proc do |db|
76
76
  Sequel.ts_require 'adapters/jdbc/h2'
77
77
  db.extend(Sequel::JDBC::H2::DatabaseMethods)
78
78
  db.dataset_class = Sequel::JDBC::H2::Dataset
79
- JDBC.load_gem('h2')
79
+ JDBC.load_gem(:H2)
80
80
  org.h2.Driver
81
81
  end,
82
82
  :hsqldb=>proc do |db|
83
83
  Sequel.ts_require 'adapters/jdbc/hsqldb'
84
84
  db.extend(Sequel::JDBC::HSQLDB::DatabaseMethods)
85
85
  db.dataset_class = Sequel::JDBC::HSQLDB::Dataset
86
- # Current gem is 1.8.1.3, but Sequel supports 2.2.5
86
+ JDBC.load_gem(:HSQLDB)
87
87
  org.hsqldb.jdbcDriver
88
88
  end,
89
89
  :derby=>proc do |db|
90
90
  Sequel.ts_require 'adapters/jdbc/derby'
91
91
  db.extend(Sequel::JDBC::Derby::DatabaseMethods)
92
92
  db.dataset_class = Sequel::JDBC::Derby::Dataset
93
- JDBC.load_gem('derby')
93
+ JDBC.load_gem(:Derby)
94
94
  org.apache.derby.jdbc.EmbeddedDriver
95
95
  end,
96
96
  :as400=>proc do |db|
@@ -135,9 +135,14 @@ module Sequel
135
135
  # works for PostgreSQL, MySQL, and SQLite.
136
136
  def self.load_gem(name)
137
137
  begin
138
- Sequel.tsk_require "jdbc/#{name}"
138
+ Sequel.tsk_require "jdbc/#{name.to_s.downcase}"
139
139
  rescue LoadError
140
140
  # jdbc gem not used, hopefully the user has the .jar in their CLASSPATH
141
+ else
142
+ if defined?(::Jdbc) && ( ::Jdbc.const_defined?(name) rescue nil )
143
+ jdbc_module = ::Jdbc.const_get(name) # e.g. Jdbc::SQLite3
144
+ jdbc_module.load_driver if jdbc_module.respond_to?(:load_driver)
145
+ end
141
146
  end
142
147
  end
143
148
 
@@ -138,6 +138,11 @@ module Sequel
138
138
  true
139
139
  end
140
140
 
141
+ # HSQLDB requires SQL standard datetimes in some places.
142
+ def requires_sql_standard_datetimes?
143
+ true
144
+ end
145
+
141
146
  # HSQLDB does not support IS TRUE.
142
147
  def supports_is_true?
143
148
  false
@@ -55,7 +55,7 @@ module Sequel
55
55
 
56
56
  # Convert tinyint(1) type to boolean
57
57
  def schema_column_type(db_type)
58
- db_type == 'tinyint(1)' ? :boolean : super
58
+ db_type =~ /\Atinyint\(1\)/ ? :boolean : super
59
59
  end
60
60
 
61
61
  # Run the default connection setting SQL statements.
@@ -97,10 +97,16 @@ module Sequel
97
97
  db.to_application_timestamp(v.to_string)
98
98
  end
99
99
 
100
+ def convert_type_oracle_timestamptz(v)
101
+ convert_type_oracle_timestamp(db.synchronize{|c| v.timestampValue(c)})
102
+ end
103
+
100
104
  def convert_type_proc(v)
101
105
  case v
102
106
  when JAVA_BIG_DECIMAL
103
107
  ORACLE_DECIMAL_METHOD
108
+ when Java::OracleSql::TIMESTAMPTZ
109
+ method(:convert_type_oracle_timestamptz)
104
110
  when Java::OracleSql::TIMESTAMP
105
111
  method(:convert_type_oracle_timestamp)
106
112
  else
@@ -29,7 +29,7 @@ module Sequel
29
29
  raise Error, "Must provide either a :data option or a block to copy_into"
30
30
  end
31
31
 
32
- transaction(opts) do |conn|
32
+ synchronize(opts) do |conn|
33
33
  begin
34
34
  copy_manager = org.postgresql.copy.CopyManager.new(conn)
35
35
  copier = copy_manager.copy_in(copy_into_sql(table, opts))
@@ -41,10 +41,16 @@ module Sequel
41
41
  data.each { |d| copier.writeToCopy(d.to_java_bytes, 0, d.length) }
42
42
  end
43
43
  rescue Exception => e
44
- copier.endCopy
44
+ copier.cancelCopy
45
45
  raise
46
46
  ensure
47
- copier.endCopy unless e
47
+ unless e
48
+ begin
49
+ copier.endCopy
50
+ rescue NativeException => e2
51
+ raise_error(e2)
52
+ end
53
+ end
48
54
  end
49
55
  end
50
56
  end
@@ -275,7 +275,7 @@ module Sequel
275
275
 
276
276
  # Convert tinyint(1) type to boolean if convert_tinyint_to_bool is true
277
277
  def schema_column_type(db_type)
278
- convert_tinyint_to_bool && db_type == 'tinyint(1)' ? :boolean : super
278
+ convert_tinyint_to_bool && db_type =~ /\Atinyint\(1\)/ ? :boolean : super
279
279
  end
280
280
  end
281
281
 
@@ -124,7 +124,7 @@ module Sequel
124
124
 
125
125
  # Convert tinyint(1) type to boolean if convert_tinyint_to_bool is true
126
126
  def schema_column_type(db_type)
127
- convert_tinyint_to_bool && db_type == 'tinyint(1)' ? :boolean : super
127
+ convert_tinyint_to_bool && db_type =~ /\Atinyint\(1\)/ ? :boolean : super
128
128
  end
129
129
  end
130
130
 
@@ -37,7 +37,7 @@ module Sequel
37
37
  dbname = opts[:host]
38
38
  end
39
39
  conn = OCI8.new(opts[:user], opts[:password], dbname, opts[:privilege])
40
- conn.prefetch_rows = typecast_value_integer(opts[:prefetch_rows]) if opts[:prefetch_rows]
40
+ conn.prefetch_rows = typecast_value_integer(opts.fetch(:prefetch_rows, 100))
41
41
  conn.autocommit = true
42
42
  conn.non_blocking = true
43
43
 
@@ -328,10 +328,12 @@ module Sequel
328
328
  end
329
329
  rescue Exception => e
330
330
  conn.put_copy_end("ruby exception occurred while copying data into PostgreSQL")
331
- raise
332
331
  ensure
333
332
  conn.put_copy_end unless e
334
- conn.get_result
333
+ while res = conn.get_result
334
+ raise e if e
335
+ check_database_errors{res.check}
336
+ end
335
337
  end
336
338
  end
337
339
  end
@@ -216,6 +216,9 @@ module Sequel
216
216
  FETCH_FIRST = " FETCH FIRST ".freeze
217
217
  ROWS_ONLY = " ROWS ONLY".freeze
218
218
  EMPTY_FROM_TABLE = ' FROM "SYSIBM"."SYSDUMMY1"'.freeze
219
+ HSTAR = "H*".freeze
220
+ BLOB_OPEN = "BLOB(X'".freeze
221
+ BLOB_CLOSE = "')".freeze
219
222
 
220
223
  # DB2 casts strings using RTRIM and CHAR instead of VARCHAR.
221
224
  def cast_sql_append(sql, expr, type)
@@ -316,6 +319,15 @@ module Sequel
316
319
  BOOL_TRUE
317
320
  end
318
321
 
322
+ # DB2 uses a literal hexidecimal number for blob strings
323
+ def literal_blob_append(sql, v)
324
+ if ::Sequel::DB2.use_clob_as_blob
325
+ super
326
+ else
327
+ sql << BLOB_OPEN << v.unpack(HSTAR).first << BLOB_CLOSE
328
+ end
329
+ end
330
+
319
331
  # Add a fallback table for empty from situation
320
332
  def select_from_sql(sql)
321
333
  @opts[:from] ? super : (sql << EMPTY_FROM_TABLE)