sequel 3.21.0 → 3.41.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 (363) hide show
  1. data/CHANGELOG +1131 -3
  2. data/MIT-LICENSE +1 -1
  3. data/README.rdoc +106 -65
  4. data/Rakefile +59 -27
  5. data/bin/sequel +50 -26
  6. data/doc/active_record.rdoc +68 -52
  7. data/doc/advanced_associations.rdoc +201 -75
  8. data/doc/association_basics.rdoc +327 -79
  9. data/doc/bin_sequel.rdoc +144 -0
  10. data/doc/cheat_sheet.rdoc +21 -21
  11. data/doc/core_extensions.rdoc +374 -0
  12. data/doc/dataset_basics.rdoc +10 -10
  13. data/doc/dataset_filtering.rdoc +54 -42
  14. data/doc/mass_assignment.rdoc +56 -0
  15. data/doc/migration.rdoc +89 -557
  16. data/doc/model_hooks.rdoc +80 -29
  17. data/doc/object_model.rdoc +576 -0
  18. data/doc/opening_databases.rdoc +121 -53
  19. data/doc/prepared_statements.rdoc +41 -15
  20. data/doc/querying.rdoc +137 -56
  21. data/doc/reflection.rdoc +36 -10
  22. data/doc/release_notes/3.22.0.txt +39 -0
  23. data/doc/release_notes/3.23.0.txt +172 -0
  24. data/doc/release_notes/3.24.0.txt +420 -0
  25. data/doc/release_notes/3.25.0.txt +88 -0
  26. data/doc/release_notes/3.26.0.txt +88 -0
  27. data/doc/release_notes/3.27.0.txt +82 -0
  28. data/doc/release_notes/3.28.0.txt +304 -0
  29. data/doc/release_notes/3.29.0.txt +459 -0
  30. data/doc/release_notes/3.30.0.txt +135 -0
  31. data/doc/release_notes/3.31.0.txt +146 -0
  32. data/doc/release_notes/3.32.0.txt +202 -0
  33. data/doc/release_notes/3.33.0.txt +157 -0
  34. data/doc/release_notes/3.34.0.txt +671 -0
  35. data/doc/release_notes/3.35.0.txt +144 -0
  36. data/doc/release_notes/3.36.0.txt +245 -0
  37. data/doc/release_notes/3.37.0.txt +338 -0
  38. data/doc/release_notes/3.38.0.txt +234 -0
  39. data/doc/release_notes/3.39.0.txt +237 -0
  40. data/doc/release_notes/3.40.0.txt +73 -0
  41. data/doc/release_notes/3.41.0.txt +155 -0
  42. data/doc/schema_modification.rdoc +585 -0
  43. data/doc/sharding.rdoc +99 -8
  44. data/doc/sql.rdoc +154 -112
  45. data/doc/testing.rdoc +169 -0
  46. data/doc/thread_safety.rdoc +17 -0
  47. data/doc/transactions.rdoc +137 -0
  48. data/doc/validations.rdoc +1 -1
  49. data/doc/virtual_rows.rdoc +78 -43
  50. data/lib/sequel/adapters/ado/access.rb +334 -0
  51. data/lib/sequel/adapters/ado/mssql.rb +18 -12
  52. data/lib/sequel/adapters/ado.rb +69 -21
  53. data/lib/sequel/adapters/amalgalite.rb +17 -14
  54. data/lib/sequel/adapters/cubrid.rb +143 -0
  55. data/lib/sequel/adapters/db2.rb +178 -85
  56. data/lib/sequel/adapters/dbi.rb +19 -21
  57. data/lib/sequel/adapters/do/mysql.rb +17 -11
  58. data/lib/sequel/adapters/do/postgres.rb +2 -61
  59. data/lib/sequel/adapters/do/sqlite.rb +0 -10
  60. data/lib/sequel/adapters/do.rb +20 -39
  61. data/lib/sequel/adapters/firebird.rb +33 -210
  62. data/lib/sequel/adapters/ibmdb.rb +452 -0
  63. data/lib/sequel/adapters/informix.rb +6 -29
  64. data/lib/sequel/adapters/jdbc/as400.rb +16 -34
  65. data/lib/sequel/adapters/jdbc/cubrid.rb +52 -0
  66. data/lib/sequel/adapters/jdbc/db2.rb +78 -0
  67. data/lib/sequel/adapters/jdbc/derby.rb +325 -0
  68. data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
  69. data/lib/sequel/adapters/jdbc/h2.rb +68 -31
  70. data/lib/sequel/adapters/jdbc/hsqldb.rb +189 -0
  71. data/lib/sequel/adapters/jdbc/informix.rb +21 -0
  72. data/lib/sequel/adapters/jdbc/jtds.rb +40 -0
  73. data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
  74. data/lib/sequel/adapters/jdbc/mysql.rb +16 -28
  75. data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
  76. data/lib/sequel/adapters/jdbc/postgresql.rb +77 -52
  77. data/lib/sequel/adapters/jdbc/progress.rb +21 -0
  78. data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
  79. data/lib/sequel/adapters/jdbc/sqlserver.rb +72 -0
  80. data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
  81. data/lib/sequel/adapters/jdbc.rb +308 -114
  82. data/lib/sequel/adapters/mock.rb +372 -0
  83. data/lib/sequel/adapters/mysql.rb +130 -230
  84. data/lib/sequel/adapters/mysql2.rb +64 -63
  85. data/lib/sequel/adapters/odbc/mssql.rb +17 -9
  86. data/lib/sequel/adapters/odbc.rb +29 -10
  87. data/lib/sequel/adapters/openbase.rb +7 -11
  88. data/lib/sequel/adapters/oracle.rb +364 -57
  89. data/lib/sequel/adapters/postgres.rb +379 -145
  90. data/lib/sequel/adapters/shared/access.rb +236 -11
  91. data/lib/sequel/adapters/shared/cubrid.rb +216 -0
  92. data/lib/sequel/adapters/shared/db2.rb +353 -0
  93. data/lib/sequel/adapters/shared/firebird.rb +231 -0
  94. data/lib/sequel/adapters/shared/informix.rb +53 -0
  95. data/lib/sequel/adapters/shared/mssql.rb +412 -116
  96. data/lib/sequel/adapters/shared/mysql.rb +396 -89
  97. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +166 -0
  98. data/lib/sequel/adapters/shared/oracle.rb +262 -45
  99. data/lib/sequel/adapters/shared/postgres.rb +688 -279
  100. data/lib/sequel/adapters/shared/progress.rb +5 -8
  101. data/lib/sequel/adapters/shared/sqlite.rb +317 -96
  102. data/lib/sequel/adapters/sqlite.rb +109 -46
  103. data/lib/sequel/adapters/swift/mysql.rb +10 -12
  104. data/lib/sequel/adapters/swift/postgres.rb +13 -79
  105. data/lib/sequel/adapters/swift/sqlite.rb +9 -6
  106. data/lib/sequel/adapters/swift.rb +31 -27
  107. data/lib/sequel/adapters/tinytds.rb +177 -25
  108. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +77 -0
  109. data/lib/sequel/adapters/utils/pg_types.rb +81 -0
  110. data/lib/sequel/adapters/utils/split_alter_table.rb +36 -0
  111. data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
  112. data/lib/sequel/ast_transformer.rb +194 -0
  113. data/lib/sequel/connection_pool/sharded_single.rb +23 -13
  114. data/lib/sequel/connection_pool/sharded_threaded.rb +64 -13
  115. data/lib/sequel/connection_pool/single.rb +11 -3
  116. data/lib/sequel/connection_pool/threaded.rb +69 -20
  117. data/lib/sequel/connection_pool.rb +20 -18
  118. data/lib/sequel/core.rb +143 -11
  119. data/lib/sequel/database/connecting.rb +66 -29
  120. data/lib/sequel/database/dataset.rb +4 -4
  121. data/lib/sequel/database/dataset_defaults.rb +63 -2
  122. data/lib/sequel/database/logging.rb +7 -2
  123. data/lib/sequel/database/misc.rb +192 -51
  124. data/lib/sequel/database/query.rb +299 -114
  125. data/lib/sequel/database/schema_generator.rb +103 -36
  126. data/lib/sequel/database/schema_methods.rb +310 -69
  127. data/lib/sequel/dataset/actions.rb +344 -90
  128. data/lib/sequel/dataset/features.rb +101 -8
  129. data/lib/sequel/dataset/graph.rb +42 -15
  130. data/lib/sequel/dataset/misc.rb +52 -25
  131. data/lib/sequel/dataset/mutation.rb +12 -7
  132. data/lib/sequel/dataset/prepared_statements.rb +68 -30
  133. data/lib/sequel/dataset/query.rb +322 -68
  134. data/lib/sequel/dataset/sql.rb +716 -293
  135. data/lib/sequel/dataset.rb +8 -0
  136. data/lib/sequel/exceptions.rb +4 -0
  137. data/lib/sequel/extensions/_pretty_table.rb +83 -0
  138. data/lib/sequel/extensions/arbitrary_servers.rb +109 -0
  139. data/lib/sequel/extensions/blank.rb +4 -0
  140. data/lib/sequel/extensions/columns_introspection.rb +72 -0
  141. data/lib/sequel/extensions/connection_validator.rb +109 -0
  142. data/lib/sequel/extensions/constraint_validations.rb +451 -0
  143. data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +30 -46
  144. data/lib/sequel/extensions/eval_inspect.rb +173 -0
  145. data/lib/sequel/extensions/inflector.rb +4 -0
  146. data/lib/sequel/extensions/looser_typecasting.rb +5 -4
  147. data/lib/sequel/extensions/migration.rb +100 -11
  148. data/lib/sequel/extensions/named_timezones.rb +9 -0
  149. data/lib/sequel/extensions/null_dataset.rb +94 -0
  150. data/lib/sequel/extensions/pagination.rb +4 -0
  151. data/lib/sequel/extensions/pg_array.rb +539 -0
  152. data/lib/sequel/extensions/pg_array_ops.rb +263 -0
  153. data/lib/sequel/extensions/pg_auto_parameterize.rb +175 -0
  154. data/lib/sequel/extensions/pg_hstore.rb +334 -0
  155. data/lib/sequel/extensions/pg_hstore_ops.rb +293 -0
  156. data/lib/sequel/extensions/pg_inet.rb +113 -0
  157. data/lib/sequel/extensions/pg_interval.rb +191 -0
  158. data/lib/sequel/extensions/pg_json.rb +212 -0
  159. data/lib/sequel/extensions/pg_range.rb +513 -0
  160. data/lib/sequel/extensions/pg_range_ops.rb +150 -0
  161. data/lib/sequel/extensions/pg_row.rb +576 -0
  162. data/lib/sequel/extensions/pg_row_ops.rb +182 -0
  163. data/lib/sequel/extensions/pg_statement_cache.rb +317 -0
  164. data/lib/sequel/extensions/pretty_table.rb +17 -72
  165. data/lib/sequel/extensions/query.rb +8 -4
  166. data/lib/sequel/extensions/query_literals.rb +79 -0
  167. data/lib/sequel/extensions/schema_caching.rb +76 -0
  168. data/lib/sequel/extensions/schema_dumper.rb +282 -76
  169. data/lib/sequel/extensions/select_remove.rb +39 -0
  170. data/lib/sequel/extensions/server_block.rb +140 -0
  171. data/lib/sequel/extensions/split_array_nil.rb +65 -0
  172. data/lib/sequel/extensions/sql_expr.rb +8 -110
  173. data/lib/sequel/extensions/string_date_time.rb +4 -0
  174. data/lib/sequel/extensions/thread_local_timezones.rb +10 -4
  175. data/lib/sequel/extensions/to_dot.rb +99 -83
  176. data/lib/sequel/model/associations.rb +1263 -409
  177. data/lib/sequel/model/base.rb +624 -171
  178. data/lib/sequel/model/errors.rb +1 -1
  179. data/lib/sequel/model/exceptions.rb +24 -2
  180. data/lib/sequel/model/inflections.rb +1 -1
  181. data/lib/sequel/model.rb +30 -11
  182. data/lib/sequel/no_core_ext.rb +2 -0
  183. data/lib/sequel/plugins/active_model.rb +13 -1
  184. data/lib/sequel/plugins/association_pks.rb +137 -16
  185. data/lib/sequel/plugins/caching.rb +25 -18
  186. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  187. data/lib/sequel/plugins/composition.rb +44 -12
  188. data/lib/sequel/plugins/constraint_validations.rb +198 -0
  189. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  190. data/lib/sequel/plugins/defaults_setter.rb +72 -0
  191. data/lib/sequel/plugins/dirty.rb +214 -0
  192. data/lib/sequel/plugins/eager_each.rb +59 -0
  193. data/lib/sequel/plugins/force_encoding.rb +6 -6
  194. data/lib/sequel/plugins/hook_class_methods.rb +1 -1
  195. data/lib/sequel/plugins/identity_map.rb +134 -15
  196. data/lib/sequel/plugins/instance_filters.rb +10 -0
  197. data/lib/sequel/plugins/instance_hooks.rb +1 -1
  198. data/lib/sequel/plugins/json_serializer.rb +77 -6
  199. data/lib/sequel/plugins/list.rb +13 -2
  200. data/lib/sequel/plugins/many_through_many.rb +103 -51
  201. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
  202. data/lib/sequel/plugins/nested_attributes.rb +150 -66
  203. data/lib/sequel/plugins/optimistic_locking.rb +8 -0
  204. data/lib/sequel/plugins/pg_row.rb +121 -0
  205. data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
  206. data/lib/sequel/plugins/prepared_statements.rb +168 -0
  207. data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
  208. data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
  209. data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
  210. data/lib/sequel/plugins/rcte_tree.rb +31 -17
  211. data/lib/sequel/plugins/schema.rb +8 -3
  212. data/lib/sequel/plugins/serialization.rb +98 -49
  213. data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
  214. data/lib/sequel/plugins/sharding.rb +21 -54
  215. data/lib/sequel/plugins/single_table_inheritance.rb +57 -12
  216. data/lib/sequel/plugins/static_cache.rb +99 -0
  217. data/lib/sequel/plugins/subclasses.rb +29 -3
  218. data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
  219. data/lib/sequel/plugins/timestamps.rb +1 -1
  220. data/lib/sequel/plugins/touch.rb +18 -6
  221. data/lib/sequel/plugins/tree.rb +3 -3
  222. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  223. data/lib/sequel/plugins/update_primary_key.rb +2 -2
  224. data/lib/sequel/plugins/validation_class_methods.rb +2 -1
  225. data/lib/sequel/plugins/validation_helpers.rb +57 -4
  226. data/lib/sequel/plugins/xml_serializer.rb +15 -4
  227. data/lib/sequel/sql.rb +721 -141
  228. data/lib/sequel/timezones.rb +67 -40
  229. data/lib/sequel/version.rb +1 -1
  230. data/spec/adapters/db2_spec.rb +146 -0
  231. data/spec/adapters/firebird_spec.rb +53 -39
  232. data/spec/adapters/mssql_spec.rb +261 -66
  233. data/spec/adapters/mysql_spec.rb +597 -352
  234. data/spec/adapters/oracle_spec.rb +92 -117
  235. data/spec/adapters/postgres_spec.rb +2103 -341
  236. data/spec/adapters/spec_helper.rb +16 -6
  237. data/spec/adapters/sqlite_spec.rb +237 -76
  238. data/spec/core/connection_pool_spec.rb +270 -141
  239. data/spec/core/database_spec.rb +980 -524
  240. data/spec/core/dataset_spec.rb +1658 -1243
  241. data/spec/core/expression_filters_spec.rb +741 -334
  242. data/spec/core/mock_adapter_spec.rb +453 -0
  243. data/spec/core/object_graph_spec.rb +88 -129
  244. data/spec/core/schema_generator_spec.rb +4 -4
  245. data/spec/core/schema_spec.rb +556 -53
  246. data/spec/core/spec_helper.rb +7 -48
  247. data/spec/core_extensions_spec.rb +626 -0
  248. data/spec/extensions/active_model_spec.rb +13 -0
  249. data/spec/extensions/arbitrary_servers_spec.rb +110 -0
  250. data/spec/extensions/association_autoreloading_spec.rb +18 -10
  251. data/spec/extensions/association_dependencies_spec.rb +15 -25
  252. data/spec/extensions/association_pks_spec.rb +227 -33
  253. data/spec/extensions/association_proxies_spec.rb +4 -4
  254. data/spec/extensions/boolean_readers_spec.rb +25 -25
  255. data/spec/extensions/caching_spec.rb +47 -51
  256. data/spec/extensions/class_table_inheritance_spec.rb +31 -83
  257. data/spec/extensions/columns_introspection_spec.rb +91 -0
  258. data/spec/extensions/composition_spec.rb +18 -13
  259. data/spec/extensions/connection_validator_spec.rb +118 -0
  260. data/spec/extensions/constraint_validations_plugin_spec.rb +196 -0
  261. data/spec/extensions/constraint_validations_spec.rb +316 -0
  262. data/spec/extensions/dataset_associations_spec.rb +199 -0
  263. data/spec/extensions/defaults_setter_spec.rb +88 -0
  264. data/spec/extensions/dirty_spec.rb +155 -0
  265. data/spec/extensions/eager_each_spec.rb +34 -0
  266. data/spec/extensions/eval_inspect_spec.rb +67 -0
  267. data/spec/extensions/force_encoding_spec.rb +4 -2
  268. data/spec/extensions/hook_class_methods_spec.rb +97 -128
  269. data/spec/extensions/identity_map_spec.rb +142 -24
  270. data/spec/extensions/inflector_spec.rb +0 -4
  271. data/spec/extensions/instance_filters_spec.rb +11 -21
  272. data/spec/extensions/instance_hooks_spec.rb +72 -0
  273. data/spec/extensions/json_serializer_spec.rb +49 -12
  274. data/spec/extensions/lazy_attributes_spec.rb +16 -20
  275. data/spec/extensions/list_spec.rb +49 -40
  276. data/spec/extensions/looser_typecasting_spec.rb +7 -7
  277. data/spec/extensions/many_through_many_spec.rb +368 -254
  278. data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
  279. data/spec/extensions/migration_spec.rb +140 -35
  280. data/spec/extensions/named_timezones_spec.rb +29 -11
  281. data/spec/extensions/nested_attributes_spec.rb +268 -89
  282. data/spec/extensions/null_dataset_spec.rb +85 -0
  283. data/spec/extensions/optimistic_locking_spec.rb +24 -21
  284. data/spec/extensions/pg_array_ops_spec.rb +112 -0
  285. data/spec/extensions/pg_array_spec.rb +324 -0
  286. data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
  287. data/spec/extensions/pg_hstore_ops_spec.rb +140 -0
  288. data/spec/extensions/pg_hstore_spec.rb +200 -0
  289. data/spec/extensions/pg_inet_spec.rb +47 -0
  290. data/spec/extensions/pg_interval_spec.rb +72 -0
  291. data/spec/extensions/pg_json_spec.rb +99 -0
  292. data/spec/extensions/pg_range_ops_spec.rb +56 -0
  293. data/spec/extensions/pg_range_spec.rb +395 -0
  294. data/spec/extensions/pg_row_ops_spec.rb +58 -0
  295. data/spec/extensions/pg_row_plugin_spec.rb +49 -0
  296. data/spec/extensions/pg_row_spec.rb +340 -0
  297. data/spec/extensions/pg_statement_cache_spec.rb +208 -0
  298. data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
  299. data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
  300. data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
  301. data/spec/extensions/prepared_statements_spec.rb +87 -0
  302. data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
  303. data/spec/extensions/pretty_table_spec.rb +7 -6
  304. data/spec/extensions/query_literals_spec.rb +167 -0
  305. data/spec/extensions/query_spec.rb +9 -3
  306. data/spec/extensions/rcte_tree_spec.rb +50 -43
  307. data/spec/extensions/schema_caching_spec.rb +41 -0
  308. data/spec/extensions/schema_dumper_spec.rb +434 -49
  309. data/spec/extensions/schema_spec.rb +30 -49
  310. data/spec/extensions/select_remove_spec.rb +38 -0
  311. data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
  312. data/spec/extensions/serialization_spec.rb +86 -48
  313. data/spec/extensions/server_block_spec.rb +90 -0
  314. data/spec/extensions/sharding_spec.rb +69 -143
  315. data/spec/extensions/single_table_inheritance_spec.rb +65 -29
  316. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  317. data/spec/extensions/spec_helper.rb +34 -67
  318. data/spec/extensions/split_array_nil_spec.rb +24 -0
  319. data/spec/extensions/sql_expr_spec.rb +29 -60
  320. data/spec/extensions/static_cache_spec.rb +145 -0
  321. data/spec/extensions/subclasses_spec.rb +14 -0
  322. data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
  323. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  324. data/spec/extensions/timestamps_spec.rb +6 -6
  325. data/spec/extensions/to_dot_spec.rb +8 -11
  326. data/spec/extensions/touch_spec.rb +53 -14
  327. data/spec/extensions/tree_spec.rb +11 -26
  328. data/spec/extensions/typecast_on_load_spec.rb +9 -6
  329. data/spec/extensions/update_primary_key_spec.rb +30 -24
  330. data/spec/extensions/validation_class_methods_spec.rb +77 -68
  331. data/spec/extensions/validation_helpers_spec.rb +48 -37
  332. data/spec/extensions/xml_serializer_spec.rb +29 -4
  333. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
  334. data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
  335. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
  336. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
  337. data/spec/integration/associations_test.rb +659 -21
  338. data/spec/integration/database_test.rb +25 -5
  339. data/spec/integration/dataset_test.rb +729 -141
  340. data/spec/integration/eager_loader_test.rb +38 -54
  341. data/spec/integration/migrator_test.rb +2 -3
  342. data/spec/integration/model_test.rb +81 -2
  343. data/spec/integration/plugin_test.rb +871 -160
  344. data/spec/integration/prepared_statement_test.rb +272 -128
  345. data/spec/integration/schema_test.rb +377 -57
  346. data/spec/integration/spec_helper.rb +49 -32
  347. data/spec/integration/timezone_test.rb +38 -12
  348. data/spec/integration/transaction_test.rb +183 -8
  349. data/spec/integration/type_test.rb +40 -8
  350. data/spec/model/association_reflection_spec.rb +207 -8
  351. data/spec/model/associations_spec.rb +1206 -693
  352. data/spec/model/base_spec.rb +334 -100
  353. data/spec/model/dataset_methods_spec.rb +45 -27
  354. data/spec/model/eager_loading_spec.rb +828 -692
  355. data/spec/model/hooks_spec.rb +355 -67
  356. data/spec/model/model_spec.rb +251 -179
  357. data/spec/model/plugins_spec.rb +24 -13
  358. data/spec/model/record_spec.rb +506 -232
  359. data/spec/model/spec_helper.rb +16 -77
  360. data/spec/model/validations_spec.rb +38 -2
  361. data/spec/rcov.opts +2 -0
  362. metadata +223 -81
  363. data/spec/core/core_sql_spec.rb +0 -451
@@ -0,0 +1,78 @@
1
+ Sequel.require 'adapters/shared/db2'
2
+ Sequel.require 'adapters/jdbc/transactions'
3
+
4
+ module Sequel
5
+ module JDBC
6
+ class Database
7
+ # Alias the generic JDBC versions so they can be called directly later
8
+ alias jdbc_schema_parse_table schema_parse_table
9
+ alias jdbc_tables tables
10
+ alias jdbc_views views
11
+ alias jdbc_indexes indexes
12
+ end
13
+
14
+ # Database and Dataset instance methods for DB2 specific
15
+ # support via JDBC.
16
+ module DB2
17
+ # Database instance methods for DB2 databases accessed via JDBC.
18
+ module DatabaseMethods
19
+ PRIMARY_KEY_INDEX_RE = /\Asql\d+\z/i.freeze
20
+
21
+ include Sequel::DB2::DatabaseMethods
22
+ include Sequel::JDBC::Transactions
23
+ IDENTITY_VAL_LOCAL = "SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1".freeze
24
+
25
+ %w'schema_parse_table tables views indexes'.each do |s|
26
+ class_eval("def #{s}(*a) jdbc_#{s}(*a) end", __FILE__, __LINE__)
27
+ end
28
+
29
+ private
30
+
31
+ def set_ps_arg(cps, arg, i)
32
+ case arg
33
+ when Sequel::SQL::Blob
34
+ cps.setString(i, arg)
35
+ else
36
+ super
37
+ end
38
+ end
39
+
40
+ def last_insert_id(conn, opts={})
41
+ statement(conn) do |stmt|
42
+ sql = IDENTITY_VAL_LOCAL
43
+ rs = log_yield(sql){stmt.executeQuery(sql)}
44
+ rs.next
45
+ rs.getInt(1)
46
+ end
47
+ end
48
+
49
+ # Primary key indexes appear to be named sqlNNNN on DB2
50
+ def primary_key_index_re
51
+ PRIMARY_KEY_INDEX_RE
52
+ end
53
+ end
54
+
55
+ class Dataset < JDBC::Dataset
56
+ include Sequel::DB2::DatasetMethods
57
+
58
+ class ::Sequel::JDBC::Dataset::TYPE_TRANSLATOR
59
+ def db2_clob(v) Sequel::SQL::Blob.new(v.getSubString(1, v.length)) end
60
+ end
61
+
62
+ DB2_CLOB_METHOD = TYPE_TRANSLATOR_INSTANCE.method(:db2_clob)
63
+
64
+ private
65
+
66
+ # Return clob as blob if use_clob_as_blob is true
67
+ def convert_type_proc(v)
68
+ case v
69
+ when JAVA_SQL_CLOB
70
+ ::Sequel::DB2::use_clob_as_blob ? DB2_CLOB_METHOD : super
71
+ else
72
+ super
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,325 @@
1
+ Sequel.require 'adapters/jdbc/transactions'
2
+
3
+ module Sequel
4
+ module JDBC
5
+ # Database and Dataset support for Derby databases accessed via JDBC.
6
+ module Derby
7
+ # Instance methods for Derby Database objects accessed via JDBC.
8
+ module DatabaseMethods
9
+ PRIMARY_KEY_INDEX_RE = /\Asql\d+\z/i.freeze
10
+
11
+ include ::Sequel::JDBC::Transactions
12
+
13
+ # Derby doesn't support casting integer to varchar, only integer to char,
14
+ # and char(254) appears to have the widest support (with char(255) failing).
15
+ # This does add a bunch of extra spaces at the end, but those will be trimmed
16
+ # elsewhere.
17
+ def cast_type_literal(type)
18
+ (type == String) ? 'CHAR(254)' : super
19
+ end
20
+
21
+ # Derby uses the :derby database type.
22
+ def database_type
23
+ :derby
24
+ end
25
+
26
+ # Derby uses an IDENTITY sequence for autoincrementing columns.
27
+ def serial_primary_key_options
28
+ {:primary_key => true, :type => :integer, :identity=>true, :start_with=>1}
29
+ end
30
+
31
+ # The SVN version of the database.
32
+ def svn_version
33
+ @svn_version ||= begin
34
+ v = synchronize{|c| c.get_meta_data.get_database_product_version}
35
+ v =~ /\((\d+)\)\z/
36
+ $1.to_i
37
+ end
38
+ end
39
+
40
+ # Derby supports transaction DDL statements.
41
+ def supports_transactional_ddl?
42
+ true
43
+ end
44
+
45
+ private
46
+
47
+ # Derby optimizes away Sequel's default check of SELECT NULL FROM table,
48
+ # so use a SELECT * FROM table there.
49
+ def _table_exists?(ds)
50
+ ds.first
51
+ end
52
+
53
+ # Derby-specific syntax for renaming columns and changing a columns type/nullity.
54
+ def alter_table_sql(table, op)
55
+ case op[:op]
56
+ when :rename_column
57
+ "RENAME COLUMN #{quote_schema_table(table)}.#{quote_identifier(op[:name])} TO #{quote_identifier(op[:new_name])}"
58
+ when :set_column_type
59
+ # Derby is very limited in changing a columns type, so adding a new column and then dropping the existing column is
60
+ # the best approach, as mentioned in the Derby documentation.
61
+ temp_name = :x_sequel_temp_column_x
62
+ [alter_table_sql(table, op.merge(:op=>:add_column, :name=>temp_name)),
63
+ from(table).update_sql(temp_name=>::Sequel::SQL::Cast.new(op[:name], op[:type])),
64
+ alter_table_sql(table, op.merge(:op=>:drop_column)),
65
+ alter_table_sql(table, op.merge(:op=>:rename_column, :name=>temp_name, :new_name=>op[:name]))]
66
+ when :set_column_null
67
+ "ALTER TABLE #{quote_schema_table(table)} ALTER COLUMN #{quote_identifier(op[:name])} #{op[:null] ? 'NULL' : 'NOT NULL'}"
68
+ else
69
+ super
70
+ end
71
+ end
72
+
73
+ # Derby doesn't allow specifying NULL for columns, only NOT NULL.
74
+ def column_definition_null_sql(sql, column)
75
+ sql << " NOT NULL" if column.fetch(:null, column[:allow_null]) == false
76
+ end
77
+
78
+ # Add NOT LOGGED for temporary tables to improve performance.
79
+ def create_table_sql(name, generator, options)
80
+ s = super
81
+ s << ' NOT LOGGED' if options[:temp]
82
+ s
83
+ end
84
+
85
+ # Insert data from the current table into the new table after
86
+ # creating the table, since it is not possible to do it in one step.
87
+ def create_table_as(name, sql, options)
88
+ super
89
+ from(name).insert(sql.is_a?(Dataset) ? sql : dataset.with_sql(sql))
90
+ end
91
+
92
+ # Derby currently only requires WITH NO DATA, with a separate insert
93
+ # to import data.
94
+ def create_table_as_sql(name, sql, options)
95
+ "#{create_table_prefix_sql(name, options)} AS #{sql} WITH NO DATA"
96
+ end
97
+
98
+ # Temporary table creation on Derby uses DECLARE instead of CREATE.
99
+ def create_table_prefix_sql(name, options)
100
+ if options[:temp]
101
+ "DECLARE GLOBAL TEMPORARY TABLE #{quote_identifier(name)}"
102
+ else
103
+ super
104
+ end
105
+ end
106
+
107
+ # Use IDENTITY_VAL_LOCAL() to get the last inserted id.
108
+ def last_insert_id(conn, opts={})
109
+ statement(conn) do |stmt|
110
+ sql = 'SELECT IDENTITY_VAL_LOCAL() FROM sysibm.sysdummy1'
111
+ rs = log_yield(sql){stmt.executeQuery(sql)}
112
+ rs.next
113
+ rs.getInt(1)
114
+ end
115
+ end
116
+
117
+ # Handle nil values by using setNull with the correct parameter type.
118
+ def set_ps_arg_nil(cps, i)
119
+ cps.setNull(i, cps.getParameterMetaData.getParameterType(i))
120
+ end
121
+
122
+ # Derby uses RENAME TABLE syntax to rename tables.
123
+ def rename_table_sql(name, new_name)
124
+ "RENAME TABLE #{quote_schema_table(name)} TO #{quote_schema_table(new_name)}"
125
+ end
126
+
127
+ # Primary key indexes appear to be named sqlNNNN on Derby
128
+ def primary_key_index_re
129
+ PRIMARY_KEY_INDEX_RE
130
+ end
131
+
132
+ # If an :identity option is present in the column, add the necessary IDENTITY SQL.
133
+ def type_literal(column)
134
+ if column[:identity]
135
+ sql = "#{super} GENERATED BY DEFAULT AS IDENTITY"
136
+ if sw = column[:start_with]
137
+ sql << " (START WITH #{sw.to_i}"
138
+ sql << " INCREMENT BY #{column[:increment_by].to_i}" if column[:increment_by]
139
+ sql << ")"
140
+ end
141
+ sql
142
+ else
143
+ super
144
+ end
145
+ end
146
+
147
+ # Derby uses clob for text types.
148
+ def uses_clob_for_text?
149
+ true
150
+ end
151
+
152
+ # The SQL query to issue to check if a connection is valid.
153
+ def valid_connection_sql
154
+ @valid_connection_sql ||= select(1).sql
155
+ end
156
+ end
157
+
158
+ # Dataset class for Derby datasets accessed via JDBC.
159
+ class Dataset < JDBC::Dataset
160
+ PAREN_CLOSE = Dataset::PAREN_CLOSE
161
+ PAREN_OPEN = Dataset::PAREN_OPEN
162
+ OFFSET = Dataset::OFFSET
163
+ CAST_STRING_OPEN = "RTRIM(".freeze
164
+ BITCOMP_OPEN = "((0 - ".freeze
165
+ BITCOMP_CLOSE = ") - 1)".freeze
166
+ BLOB_OPEN = "CAST(X'".freeze
167
+ BLOB_CLOSE = "' AS BLOB)".freeze
168
+ HSTAR = "H*".freeze
169
+ TIME_FORMAT = "'%H:%M:%S'".freeze
170
+ DEFAULT_FROM = " FROM sysibm.sysdummy1".freeze
171
+ ROWS = " ROWS".freeze
172
+ FETCH_FIRST = " FETCH FIRST ".freeze
173
+ ROWS_ONLY = " ROWS ONLY".freeze
174
+ BOOL_TRUE_OLD = '(1 = 1)'.freeze
175
+ BOOL_FALSE_OLD = '(1 = 0)'.freeze
176
+ BOOL_TRUE = 'TRUE'.freeze
177
+ BOOL_FALSE = 'FALSE'.freeze
178
+ SELECT_CLAUSE_METHODS = clause_methods(:select, %w'select distinct columns from join where group having compounds order limit lock')
179
+ EMULATED_FUNCTION_MAP = {:char_length=>'length'.freeze}
180
+
181
+ # Derby doesn't support an expression between CASE and WHEN,
182
+ # so remove
183
+ # conditions.
184
+ def case_expression_sql_append(sql, ce)
185
+ super(sql, ce.with_merged_expression)
186
+ end
187
+
188
+ # If the type is String, trim the extra spaces since CHAR is used instead
189
+ # of varchar. This can cause problems if you are casting a char/varchar to
190
+ # a string and the ending whitespace is important.
191
+ def cast_sql_append(sql, expr, type)
192
+ if type == String
193
+ sql << CAST_STRING_OPEN
194
+ super
195
+ sql << PAREN_CLOSE
196
+ else
197
+ super
198
+ end
199
+ end
200
+
201
+ # Handle Derby specific LIKE, extract, and some bitwise compliment support.
202
+ def complex_expression_sql_append(sql, op, args)
203
+ case op
204
+ when :ILIKE
205
+ super(sql, :LIKE, [SQL::Function.new(:upper, args.at(0)), SQL::Function.new(:upper, args.at(1))])
206
+ when :"NOT ILIKE"
207
+ super(sql, :"NOT LIKE", [SQL::Function.new(:upper, args.at(0)), SQL::Function.new(:upper, args.at(1))])
208
+ when :%
209
+ sql << complex_expression_arg_pairs(args){|a, b| "MOD(#{literal(a)}, #{literal(b)})"}
210
+ when :&, :|, :^, :<<, :>>
211
+ raise Error, "Derby doesn't support the #{op} operator"
212
+ when :'B~'
213
+ sql << BITCOMP_OPEN
214
+ literal_append(sql, args.at(0))
215
+ sql << BITCOMP_CLOSE
216
+ when :extract
217
+ sql << args.at(0).to_s << PAREN_OPEN
218
+ literal_append(sql, args.at(1))
219
+ sql << PAREN_CLOSE
220
+ else
221
+ super
222
+ end
223
+ end
224
+
225
+ # Derby supports GROUP BY ROLLUP (but not CUBE)
226
+ def supports_group_rollup?
227
+ true
228
+ end
229
+
230
+ # Derby does not support IS TRUE.
231
+ def supports_is_true?
232
+ false
233
+ end
234
+
235
+ # Derby does not support IN/NOT IN with multiple columns
236
+ def supports_multiple_column_in?
237
+ false
238
+ end
239
+
240
+ private
241
+
242
+ JAVA_SQL_CLOB = Java::JavaSQL::Clob
243
+
244
+ class ::Sequel::JDBC::Dataset::TYPE_TRANSLATOR
245
+ def derby_clob(v) v.getSubString(1, v.length) end
246
+ end
247
+
248
+ DERBY_CLOB_METHOD = TYPE_TRANSLATOR_INSTANCE.method(:derby_clob)
249
+
250
+ # Handle clobs on Derby as strings.
251
+ def convert_type_proc(v)
252
+ if v.is_a?(JAVA_SQL_CLOB)
253
+ DERBY_CLOB_METHOD
254
+ else
255
+ super
256
+ end
257
+ end
258
+
259
+ # Derby needs a hex string casted to BLOB for blobs.
260
+ def literal_blob_append(sql, v)
261
+ sql << BLOB_OPEN << v.unpack(HSTAR).first << BLOB_CLOSE
262
+ end
263
+
264
+ # Derby needs the standard workaround to insert all default values into
265
+ # a table with more than one column.
266
+ def insert_supports_empty_values?
267
+ false
268
+ end
269
+
270
+ # Derby uses an expression yielding false for false values.
271
+ # Newer versions can use the FALSE literal, but the latest gem version cannot.
272
+ def literal_false
273
+ if db.svn_version >= 1040133
274
+ BOOL_FALSE
275
+ else
276
+ BOOL_FALSE_OLD
277
+ end
278
+ end
279
+
280
+ # Derby handles fractional seconds in timestamps, but not in times
281
+ def literal_sqltime(v)
282
+ v.strftime(TIME_FORMAT)
283
+ end
284
+
285
+ # Derby uses an expression yielding true for true values.
286
+ # Newer versions can use the TRUE literal, but the latest gem version cannot.
287
+ def literal_true
288
+ if db.svn_version >= 1040133
289
+ BOOL_TRUE
290
+ else
291
+ BOOL_TRUE_OLD
292
+ end
293
+ end
294
+
295
+ # Derby doesn't support common table expressions.
296
+ def select_clause_methods
297
+ SELECT_CLAUSE_METHODS
298
+ end
299
+
300
+ # Use a default FROM table if the dataset does not contain a FROM table.
301
+ def select_from_sql(sql)
302
+ if @opts[:from]
303
+ super
304
+ else
305
+ sql << DEFAULT_FROM
306
+ end
307
+ end
308
+
309
+ # Offset comes before limit in Derby
310
+ def select_limit_sql(sql)
311
+ if o = @opts[:offset]
312
+ sql << OFFSET
313
+ literal_append(sql, o)
314
+ sql << ROWS
315
+ end
316
+ if l = @opts[:limit]
317
+ sql << FETCH_FIRST
318
+ literal_append(sql, l)
319
+ sql << ROWS_ONLY
320
+ end
321
+ end
322
+ end
323
+ end
324
+ end
325
+ end
@@ -0,0 +1,24 @@
1
+ Sequel.require 'adapters/shared/firebird'
2
+ Sequel.require 'adapters/jdbc/transactions'
3
+
4
+ module Sequel
5
+ module JDBC
6
+ # Database and Dataset instance methods for Firebird specific
7
+ # support via JDBC.
8
+ module Firebird
9
+ # Database instance methods for Firebird databases accessed via JDBC.
10
+ module DatabaseMethods
11
+ include Sequel::Firebird::DatabaseMethods
12
+ include Sequel::JDBC::Transactions
13
+
14
+ # Add the primary_keys and primary_key_sequences instance variables,
15
+ # so we can get the correct return values for inserted rows.
16
+ def self.extended(db)
17
+ db.instance_eval do
18
+ @primary_keys = {}
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -17,11 +17,6 @@ module Sequel
17
17
  :h2
18
18
  end
19
19
 
20
- # Return Sequel::JDBC::H2::Dataset object with the given opts.
21
- def dataset(opts=nil)
22
- Sequel::JDBC::H2::Dataset.new(self, opts)
23
- end
24
-
25
20
  # Rollback an existing prepared transaction with the given transaction
26
21
  # identifier string.
27
22
  def rollback_prepared_transaction(transaction_id)
@@ -30,9 +25,14 @@ module Sequel
30
25
 
31
26
  # H2 uses an IDENTITY type
32
27
  def serial_primary_key_options
33
- {:primary_key => true, :type => :identity}
28
+ {:primary_key => true, :type => :identity, :identity=>true}
34
29
  end
35
30
 
31
+ # H2 supports CREATE TABLE IF NOT EXISTS syntax.
32
+ def supports_create_table_if_not_exists?
33
+ true
34
+ end
35
+
36
36
  # H2 supports prepared transactions
37
37
  def supports_prepared_transactions?
38
38
  true
@@ -48,8 +48,8 @@ module Sequel
48
48
  # If the :prepare option is given and we aren't in a savepoint,
49
49
  # prepare the transaction for a two-phase commit.
50
50
  def commit_transaction(conn, opts={})
51
- if opts[:prepare] && Thread.current[:sequel_transaction_depth] <= 1
52
- log_connection_execute(conn, "PREPARE COMMIT #{opts[:prepare]}")
51
+ if (s = opts[:prepare]) && _trans(conn)[:savepoint_level] <= 1
52
+ log_connection_execute(conn, "PREPARE COMMIT #{s}")
53
53
  else
54
54
  super
55
55
  end
@@ -75,7 +75,16 @@ module Sequel
75
75
  when :set_column_null
76
76
  "ALTER TABLE #{quote_schema_table(table)} ALTER COLUMN #{quote_identifier(op[:name])} SET#{' NOT' unless op[:null]} NULL"
77
77
  when :set_column_type
78
- "ALTER TABLE #{quote_schema_table(table)} ALTER COLUMN #{quote_identifier(op[:name])} #{type_literal(op)}"
78
+ if sch = schema(table)
79
+ if cs = sch.each{|k, v| break v if k == op[:name]; nil}
80
+ cs = cs.dup
81
+ cs[:default] = cs[:ruby_default]
82
+ op = cs.merge!(op)
83
+ end
84
+ end
85
+ sql = "ALTER TABLE #{quote_schema_table(table)} ALTER COLUMN #{quote_identifier(op[:name])} #{type_literal(op)}"
86
+ column_definition_order.each{|m| send(:"column_definition_#{m}_sql", sql, op)}
87
+ sql
79
88
  else
80
89
  super(table, op)
81
90
  end
@@ -90,7 +99,8 @@ module Sequel
90
99
  # Use IDENTITY() to get the last inserted id.
91
100
  def last_insert_id(conn, opts={})
92
101
  statement(conn) do |stmt|
93
- rs = stmt.executeQuery('SELECT IDENTITY();')
102
+ sql = 'SELECT IDENTITY();'
103
+ rs = log_yield(sql){stmt.executeQuery(sql)}
94
104
  rs.next
95
105
  rs.getInt(1)
96
106
  end
@@ -99,28 +109,42 @@ module Sequel
99
109
  def primary_key_index_re
100
110
  PRIMARY_KEY_INDEX_RE
101
111
  end
112
+
113
+ # Use BIGINT IDENTITY for identity columns that use bigint, fixes
114
+ # the case where primary_key :column, :type=>Bignum is used.
115
+ def type_literal_generic_bignum(column)
116
+ column[:identity] ? 'BIGINT IDENTITY' : super
117
+ end
102
118
  end
103
119
 
104
120
  # Dataset class for H2 datasets accessed via JDBC.
105
121
  class Dataset < JDBC::Dataset
106
- SELECT_CLAUSE_METHODS = clause_methods(:select, %w'distinct columns from join where group having compounds order limit')
122
+ SELECT_CLAUSE_METHODS = clause_methods(:select, %w'select distinct columns from join where group having compounds order limit')
107
123
  BITWISE_METHOD_MAP = {:& =>:BITAND, :| => :BITOR, :^ => :BITXOR}
124
+ APOS = Dataset::APOS
125
+ HSTAR = "H*".freeze
126
+ BITCOMP_OPEN = "((0 - ".freeze
127
+ BITCOMP_CLOSE = ") - 1)".freeze
128
+ ILIKE_PLACEHOLDER = ["CAST(".freeze, " AS VARCHAR_IGNORECASE)".freeze].freeze
129
+ TIME_FORMAT = "'%H:%M:%S'".freeze
108
130
 
109
- # Work around H2's lack of a case insensitive LIKE operator
110
- def complex_expression_sql(op, args)
131
+ # Emulate the case insensitive LIKE operator and the bitwise operators.
132
+ def complex_expression_sql_append(sql, op, args)
111
133
  case op
112
- when :ILIKE
113
- super(:LIKE, [SQL::PlaceholderLiteralString.new("CAST(? AS VARCHAR_IGNORECASE)", [args.at(0)]), args.at(1)])
114
- when :"NOT ILIKE"
115
- super(:"NOT LIKE", [SQL::PlaceholderLiteralString.new("CAST(? AS VARCHAR_IGNORECASE)", [args.at(0)]), args.at(1)])
134
+ when :ILIKE, :"NOT ILIKE"
135
+ super(sql, (op == :ILIKE ? :LIKE : :"NOT LIKE"), [SQL::PlaceholderLiteralString.new(ILIKE_PLACEHOLDER, [args.at(0)]), args.at(1)])
116
136
  when :&, :|, :^
117
- literal(SQL::Function.new(BITWISE_METHOD_MAP[op], *args))
137
+ sql << complex_expression_arg_pairs(args){|a, b| literal(SQL::Function.new(BITWISE_METHOD_MAP[op], a, b))}
118
138
  when :<<
119
- "(#{literal(args[0])} * POWER(2, #{literal(args[1])}))"
139
+ sql << complex_expression_arg_pairs(args){|a, b| "(#{literal(a)} * POWER(2, #{literal(b)}))"}
120
140
  when :>>
121
- "(#{literal(args[0])} / POWER(2, #{literal(args[1])}))"
141
+ sql << complex_expression_arg_pairs(args){|a, b| "(#{literal(a)} / POWER(2, #{literal(b)}))"}
142
+ when :'B~'
143
+ sql << BITCOMP_OPEN
144
+ literal_append(sql, args.at(0))
145
+ sql << BITCOMP_CLOSE
122
146
  else
123
- super(op, args)
147
+ super
124
148
  end
125
149
  end
126
150
 
@@ -145,21 +169,34 @@ module Sequel
145
169
  end
146
170
 
147
171
  private
148
-
149
- # H2 expects hexadecimal strings for blob values
150
- def literal_blob(v)
151
- literal_string v.unpack("H*").first
172
+
173
+ #JAVA_H2_CLOB = Java::OrgH2Jdbc::JdbcClob
174
+
175
+ class ::Sequel::JDBC::Dataset::TYPE_TRANSLATOR
176
+ def h2_clob(v) v.getSubString(1, v.length) end
152
177
  end
153
-
154
- def convert_type(v)
155
- case v
156
- when Java::OrgH2Jdbc::JdbcClob
157
- convert_type(v.getSubString(1, v.length))
178
+
179
+ H2_CLOB_METHOD = TYPE_TRANSLATOR_INSTANCE.method(:h2_clob)
180
+
181
+ # Handle H2 specific clobs as strings.
182
+ def convert_type_proc(v)
183
+ if v.is_a?(Java::OrgH2Jdbc::JdbcClob)
184
+ H2_CLOB_METHOD
158
185
  else
159
- super(v)
186
+ super
160
187
  end
161
188
  end
162
189
 
190
+ # H2 expects hexadecimal strings for blob values
191
+ def literal_blob_append(sql, v)
192
+ sql << APOS << v.unpack(HSTAR).first << APOS
193
+ end
194
+
195
+ # H2 handles fractional seconds in timestamps, but not in times
196
+ def literal_sqltime(v)
197
+ v.strftime(TIME_FORMAT)
198
+ end
199
+
163
200
  def select_clause_methods
164
201
  SELECT_CLAUSE_METHODS
165
202
  end