sequel 4.49.0 → 5.3.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 (484) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +130 -0
  3. data/README.rdoc +195 -136
  4. data/Rakefile +26 -42
  5. data/bin/sequel +6 -9
  6. data/doc/advanced_associations.rdoc +91 -168
  7. data/doc/association_basics.rdoc +197 -274
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +66 -43
  10. data/doc/code_order.rdoc +1 -8
  11. data/doc/core_extensions.rdoc +81 -56
  12. data/doc/dataset_basics.rdoc +8 -17
  13. data/doc/dataset_filtering.rdoc +81 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +73 -30
  16. data/doc/migration.rdoc +19 -36
  17. data/doc/model_dataset_method_design.rdoc +14 -17
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +10 -10
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +52 -70
  22. data/doc/opening_databases.rdoc +39 -32
  23. data/doc/postgresql.rdoc +48 -38
  24. data/doc/prepared_statements.rdoc +27 -22
  25. data/doc/querying.rdoc +173 -150
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/release_notes/5.1.0.txt +31 -0
  29. data/doc/release_notes/5.2.0.txt +33 -0
  30. data/doc/release_notes/5.3.0.txt +121 -0
  31. data/doc/schema_modification.rdoc +78 -64
  32. data/doc/security.rdoc +97 -88
  33. data/doc/sharding.rdoc +43 -30
  34. data/doc/sql.rdoc +53 -65
  35. data/doc/testing.rdoc +4 -5
  36. data/doc/thread_safety.rdoc +2 -4
  37. data/doc/transactions.rdoc +18 -17
  38. data/doc/validations.rdoc +48 -45
  39. data/doc/virtual_rows.rdoc +87 -115
  40. data/lib/sequel/adapters/ado/access.rb +7 -13
  41. data/lib/sequel/adapters/ado/mssql.rb +2 -9
  42. data/lib/sequel/adapters/ado.rb +9 -25
  43. data/lib/sequel/adapters/amalgalite.rb +3 -18
  44. data/lib/sequel/adapters/ibmdb.rb +9 -45
  45. data/lib/sequel/adapters/jdbc/db2.rb +8 -37
  46. data/lib/sequel/adapters/jdbc/derby.rb +4 -50
  47. data/lib/sequel/adapters/jdbc/h2.rb +6 -26
  48. data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
  49. data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
  50. data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
  51. data/lib/sequel/adapters/jdbc/mysql.rb +11 -15
  52. data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
  53. data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
  54. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
  55. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
  56. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
  57. data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
  58. data/lib/sequel/adapters/jdbc.rb +18 -74
  59. data/lib/sequel/adapters/mock.rb +4 -30
  60. data/lib/sequel/adapters/mysql.rb +7 -44
  61. data/lib/sequel/adapters/mysql2.rb +5 -23
  62. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  63. data/lib/sequel/adapters/odbc/mssql.rb +4 -12
  64. data/lib/sequel/adapters/odbc/oracle.rb +1 -1
  65. data/lib/sequel/adapters/odbc.rb +0 -19
  66. data/lib/sequel/adapters/oracle.rb +8 -13
  67. data/lib/sequel/adapters/postgres.rb +28 -150
  68. data/lib/sequel/adapters/postgresql.rb +1 -1
  69. data/lib/sequel/adapters/shared/access.rb +11 -51
  70. data/lib/sequel/adapters/shared/db2.rb +3 -61
  71. data/lib/sequel/adapters/shared/mssql.rb +21 -157
  72. data/lib/sequel/adapters/shared/mysql.rb +61 -227
  73. data/lib/sequel/adapters/shared/oracle.rb +13 -41
  74. data/lib/sequel/adapters/shared/postgres.rb +58 -264
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
  76. data/lib/sequel/adapters/shared/sqlite.rb +22 -101
  77. data/lib/sequel/adapters/sqlanywhere.rb +4 -23
  78. data/lib/sequel/adapters/sqlite.rb +2 -19
  79. data/lib/sequel/adapters/tinytds.rb +5 -15
  80. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -4
  82. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
  83. data/lib/sequel/adapters/utils/replace.rb +0 -5
  84. data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
  85. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
  86. data/lib/sequel/ast_transformer.rb +3 -94
  87. data/lib/sequel/connection_pool/sharded_single.rb +1 -4
  88. data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
  89. data/lib/sequel/connection_pool/single.rb +0 -2
  90. data/lib/sequel/connection_pool/threaded.rb +94 -110
  91. data/lib/sequel/connection_pool.rb +38 -28
  92. data/lib/sequel/core.rb +42 -101
  93. data/lib/sequel/database/connecting.rb +23 -60
  94. data/lib/sequel/database/dataset.rb +6 -9
  95. data/lib/sequel/database/dataset_defaults.rb +4 -48
  96. data/lib/sequel/database/features.rb +5 -4
  97. data/lib/sequel/database/logging.rb +2 -9
  98. data/lib/sequel/database/misc.rb +36 -55
  99. data/lib/sequel/database/query.rb +8 -13
  100. data/lib/sequel/database/schema_generator.rb +93 -64
  101. data/lib/sequel/database/schema_methods.rb +61 -79
  102. data/lib/sequel/database/transactions.rb +4 -24
  103. data/lib/sequel/database.rb +12 -2
  104. data/lib/sequel/dataset/actions.rb +57 -107
  105. data/lib/sequel/dataset/dataset_module.rb +4 -16
  106. data/lib/sequel/dataset/features.rb +35 -30
  107. data/lib/sequel/dataset/graph.rb +40 -49
  108. data/lib/sequel/dataset/misc.rb +12 -37
  109. data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
  110. data/lib/sequel/dataset/prepared_statements.rb +23 -51
  111. data/lib/sequel/dataset/query.rb +91 -161
  112. data/lib/sequel/dataset/sql.rb +33 -225
  113. data/lib/sequel/dataset.rb +18 -10
  114. data/lib/sequel/deprecated.rb +18 -27
  115. data/lib/sequel/exceptions.rb +1 -17
  116. data/lib/sequel/extensions/_model_pg_row.rb +0 -7
  117. data/lib/sequel/extensions/_pretty_table.rb +1 -3
  118. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  119. data/lib/sequel/extensions/connection_expiration.rb +1 -1
  120. data/lib/sequel/extensions/connection_validator.rb +1 -1
  121. data/lib/sequel/extensions/constraint_validations.rb +11 -11
  122. data/lib/sequel/extensions/core_extensions.rb +39 -49
  123. data/lib/sequel/extensions/core_refinements.rb +39 -45
  124. data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
  125. data/lib/sequel/extensions/date_arithmetic.rb +7 -7
  126. data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
  127. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  128. data/lib/sequel/extensions/eval_inspect.rb +4 -11
  129. data/lib/sequel/extensions/freeze_datasets.rb +1 -69
  130. data/lib/sequel/extensions/from_block.rb +1 -35
  131. data/lib/sequel/extensions/graph_each.rb +2 -2
  132. data/lib/sequel/extensions/identifier_mangling.rb +9 -19
  133. data/lib/sequel/extensions/implicit_subquery.rb +2 -2
  134. data/lib/sequel/extensions/inflector.rb +4 -4
  135. data/lib/sequel/extensions/migration.rb +27 -43
  136. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
  137. data/lib/sequel/extensions/null_dataset.rb +2 -8
  138. data/lib/sequel/extensions/pagination.rb +1 -17
  139. data/lib/sequel/extensions/pg_array.rb +20 -189
  140. data/lib/sequel/extensions/pg_extended_date_support.rb +230 -0
  141. data/lib/sequel/extensions/pg_hstore.rb +11 -50
  142. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
  143. data/lib/sequel/extensions/pg_inet.rb +3 -16
  144. data/lib/sequel/extensions/pg_interval.rb +1 -20
  145. data/lib/sequel/extensions/pg_json.rb +7 -27
  146. data/lib/sequel/extensions/pg_loose_count.rb +1 -1
  147. data/lib/sequel/extensions/pg_range.rb +6 -121
  148. data/lib/sequel/extensions/pg_range_ops.rb +1 -3
  149. data/lib/sequel/extensions/pg_row.rb +5 -77
  150. data/lib/sequel/extensions/pg_row_ops.rb +2 -13
  151. data/lib/sequel/extensions/query.rb +3 -4
  152. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  153. data/lib/sequel/extensions/schema_dumper.rb +13 -13
  154. data/lib/sequel/extensions/select_remove.rb +3 -3
  155. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  156. data/lib/sequel/extensions/sql_comments.rb +2 -2
  157. data/lib/sequel/extensions/string_agg.rb +11 -8
  158. data/lib/sequel/extensions/symbol_aref.rb +6 -20
  159. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  160. data/lib/sequel/model/associations.rb +129 -131
  161. data/lib/sequel/model/base.rb +133 -731
  162. data/lib/sequel/model/default_inflections.rb +1 -1
  163. data/lib/sequel/model/errors.rb +0 -3
  164. data/lib/sequel/model/exceptions.rb +2 -6
  165. data/lib/sequel/model/inflections.rb +1 -26
  166. data/lib/sequel/model/plugins.rb +1 -0
  167. data/lib/sequel/model.rb +27 -62
  168. data/lib/sequel/plugins/active_model.rb +2 -5
  169. data/lib/sequel/plugins/association_dependencies.rb +15 -15
  170. data/lib/sequel/plugins/association_pks.rb +14 -28
  171. data/lib/sequel/plugins/association_proxies.rb +6 -7
  172. data/lib/sequel/plugins/auto_validations.rb +4 -4
  173. data/lib/sequel/plugins/before_after_save.rb +0 -43
  174. data/lib/sequel/plugins/blacklist_security.rb +9 -8
  175. data/lib/sequel/plugins/boolean_readers.rb +3 -3
  176. data/lib/sequel/plugins/boolean_subsets.rb +2 -2
  177. data/lib/sequel/plugins/caching.rb +5 -5
  178. data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
  179. data/lib/sequel/plugins/column_conflicts.rb +2 -2
  180. data/lib/sequel/plugins/column_select.rb +2 -2
  181. data/lib/sequel/plugins/composition.rb +15 -24
  182. data/lib/sequel/plugins/constraint_validations.rb +4 -3
  183. data/lib/sequel/plugins/csv_serializer.rb +13 -20
  184. data/lib/sequel/plugins/dataset_associations.rb +2 -2
  185. data/lib/sequel/plugins/def_dataset_method.rb +5 -5
  186. data/lib/sequel/plugins/defaults_setter.rb +1 -1
  187. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  188. data/lib/sequel/plugins/finder.rb +16 -10
  189. data/lib/sequel/plugins/force_encoding.rb +1 -7
  190. data/lib/sequel/plugins/hook_class_methods.rb +4 -106
  191. data/lib/sequel/plugins/input_transformer.rb +10 -11
  192. data/lib/sequel/plugins/insert_returning_select.rb +1 -9
  193. data/lib/sequel/plugins/instance_filters.rb +5 -5
  194. data/lib/sequel/plugins/instance_hooks.rb +7 -52
  195. data/lib/sequel/plugins/inverted_subsets.rb +3 -1
  196. data/lib/sequel/plugins/json_serializer.rb +19 -19
  197. data/lib/sequel/plugins/lazy_attributes.rb +1 -10
  198. data/lib/sequel/plugins/list.rb +6 -6
  199. data/lib/sequel/plugins/many_through_many.rb +11 -8
  200. data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
  201. data/lib/sequel/plugins/nested_attributes.rb +18 -31
  202. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  203. data/lib/sequel/plugins/pg_array_associations.rb +8 -2
  204. data/lib/sequel/plugins/pg_row.rb +2 -11
  205. data/lib/sequel/plugins/prepared_statements.rb +13 -66
  206. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
  207. data/lib/sequel/plugins/rcte_tree.rb +7 -7
  208. data/lib/sequel/plugins/serialization.rb +15 -33
  209. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  210. data/lib/sequel/plugins/sharding.rb +2 -8
  211. data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
  212. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  213. data/lib/sequel/plugins/static_cache.rb +8 -9
  214. data/lib/sequel/plugins/string_stripper.rb +3 -3
  215. data/lib/sequel/plugins/subclasses.rb +1 -1
  216. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  217. data/lib/sequel/plugins/table_select.rb +2 -2
  218. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  219. data/lib/sequel/plugins/timestamps.rb +6 -7
  220. data/lib/sequel/plugins/touch.rb +4 -8
  221. data/lib/sequel/plugins/tree.rb +3 -3
  222. data/lib/sequel/plugins/typecast_on_load.rb +2 -2
  223. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  224. data/lib/sequel/plugins/update_or_create.rb +3 -3
  225. data/lib/sequel/plugins/update_refresh.rb +3 -3
  226. data/lib/sequel/plugins/uuid.rb +7 -11
  227. data/lib/sequel/plugins/validation_class_methods.rb +10 -9
  228. data/lib/sequel/plugins/validation_contexts.rb +4 -4
  229. data/lib/sequel/plugins/validation_helpers.rb +26 -25
  230. data/lib/sequel/plugins/whitelist_security.rb +13 -9
  231. data/lib/sequel/plugins/xml_serializer.rb +24 -25
  232. data/lib/sequel/sql.rb +145 -276
  233. data/lib/sequel/timezones.rb +8 -23
  234. data/lib/sequel/version.rb +2 -2
  235. data/lib/sequel.rb +1 -1
  236. data/spec/adapter_spec.rb +1 -1
  237. data/spec/adapters/db2_spec.rb +2 -103
  238. data/spec/adapters/mssql_spec.rb +89 -68
  239. data/spec/adapters/mysql_spec.rb +111 -478
  240. data/spec/adapters/oracle_spec.rb +1 -9
  241. data/spec/adapters/postgres_spec.rb +459 -664
  242. data/spec/adapters/spec_helper.rb +12 -31
  243. data/spec/adapters/sqlanywhere_spec.rb +2 -77
  244. data/spec/adapters/sqlite_spec.rb +8 -146
  245. data/spec/bin_spec.rb +11 -16
  246. data/spec/core/connection_pool_spec.rb +173 -74
  247. data/spec/core/database_spec.rb +96 -244
  248. data/spec/core/dataset_spec.rb +99 -414
  249. data/spec/core/deprecated_spec.rb +3 -3
  250. data/spec/core/expression_filters_spec.rb +37 -144
  251. data/spec/core/mock_adapter_spec.rb +241 -4
  252. data/spec/core/object_graph_spec.rb +11 -60
  253. data/spec/core/placeholder_literalizer_spec.rb +1 -14
  254. data/spec/core/schema_generator_spec.rb +51 -40
  255. data/spec/core/schema_spec.rb +88 -77
  256. data/spec/core/spec_helper.rb +6 -24
  257. data/spec/core/version_spec.rb +1 -1
  258. data/spec/core_extensions_spec.rb +7 -83
  259. data/spec/core_model_spec.rb +2 -2
  260. data/spec/deprecation_helper.rb +2 -14
  261. data/spec/extensions/accessed_columns_spec.rb +1 -1
  262. data/spec/extensions/active_model_spec.rb +3 -3
  263. data/spec/extensions/after_initialize_spec.rb +1 -1
  264. data/spec/extensions/arbitrary_servers_spec.rb +2 -2
  265. data/spec/extensions/association_dependencies_spec.rb +1 -1
  266. data/spec/extensions/association_pks_spec.rb +30 -92
  267. data/spec/extensions/association_proxies_spec.rb +1 -1
  268. data/spec/extensions/auto_literal_strings_spec.rb +1 -12
  269. data/spec/extensions/auto_validations_spec.rb +1 -1
  270. data/spec/extensions/blacklist_security_spec.rb +1 -1
  271. data/spec/extensions/blank_spec.rb +1 -1
  272. data/spec/extensions/boolean_readers_spec.rb +1 -1
  273. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  274. data/spec/extensions/caching_spec.rb +1 -1
  275. data/spec/extensions/class_table_inheritance_spec.rb +53 -1118
  276. data/spec/extensions/column_conflicts_spec.rb +1 -1
  277. data/spec/extensions/column_select_spec.rb +4 -4
  278. data/spec/extensions/columns_introspection_spec.rb +1 -1
  279. data/spec/extensions/columns_updated_spec.rb +1 -1
  280. data/spec/extensions/composition_spec.rb +8 -30
  281. data/spec/extensions/connection_expiration_spec.rb +3 -3
  282. data/spec/extensions/connection_validator_spec.rb +3 -3
  283. data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
  284. data/spec/extensions/constraint_validations_spec.rb +1 -1
  285. data/spec/extensions/core_refinements_spec.rb +1 -3
  286. data/spec/extensions/csv_serializer_spec.rb +4 -9
  287. data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
  288. data/spec/extensions/dataset_associations_spec.rb +2 -1
  289. data/spec/extensions/dataset_source_alias_spec.rb +1 -1
  290. data/spec/extensions/date_arithmetic_spec.rb +3 -3
  291. data/spec/extensions/def_dataset_method_spec.rb +1 -1
  292. data/spec/extensions/defaults_setter_spec.rb +2 -2
  293. data/spec/extensions/delay_add_association_spec.rb +8 -9
  294. data/spec/extensions/dirty_spec.rb +1 -1
  295. data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
  296. data/spec/extensions/eager_each_spec.rb +2 -2
  297. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  298. data/spec/extensions/error_splitter_spec.rb +1 -1
  299. data/spec/extensions/error_sql_spec.rb +1 -1
  300. data/spec/extensions/eval_inspect_spec.rb +1 -1
  301. data/spec/extensions/finder_spec.rb +1 -1
  302. data/spec/extensions/force_encoding_spec.rb +2 -5
  303. data/spec/extensions/freeze_datasets_spec.rb +1 -1
  304. data/spec/extensions/graph_each_spec.rb +5 -5
  305. data/spec/extensions/hook_class_methods_spec.rb +1 -194
  306. data/spec/extensions/identifier_mangling_spec.rb +17 -170
  307. data/spec/extensions/implicit_subquery_spec.rb +1 -5
  308. data/spec/extensions/inflector_spec.rb +1 -1
  309. data/spec/extensions/input_transformer_spec.rb +7 -2
  310. data/spec/extensions/insert_returning_select_spec.rb +1 -1
  311. data/spec/extensions/instance_filters_spec.rb +1 -1
  312. data/spec/extensions/instance_hooks_spec.rb +1 -95
  313. data/spec/extensions/inverted_subsets_spec.rb +1 -1
  314. data/spec/extensions/json_serializer_spec.rb +1 -1
  315. data/spec/extensions/lazy_attributes_spec.rb +1 -7
  316. data/spec/extensions/list_spec.rb +5 -6
  317. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  318. data/spec/extensions/many_through_many_spec.rb +25 -33
  319. data/spec/extensions/migration_spec.rb +12 -2
  320. data/spec/extensions/modification_detection_spec.rb +1 -1
  321. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  322. data/spec/extensions/named_timezones_spec.rb +3 -3
  323. data/spec/extensions/nested_attributes_spec.rb +1 -29
  324. data/spec/extensions/null_dataset_spec.rb +1 -11
  325. data/spec/extensions/optimistic_locking_spec.rb +2 -2
  326. data/spec/extensions/pagination_spec.rb +1 -1
  327. data/spec/extensions/pg_array_associations_spec.rb +22 -26
  328. data/spec/extensions/pg_array_ops_spec.rb +1 -1
  329. data/spec/extensions/pg_array_spec.rb +3 -48
  330. data/spec/extensions/pg_enum_spec.rb +1 -1
  331. data/spec/extensions/pg_extended_date_support_spec.rb +122 -0
  332. data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
  333. data/spec/extensions/pg_hstore_spec.rb +22 -31
  334. data/spec/extensions/pg_inet_ops_spec.rb +1 -1
  335. data/spec/extensions/pg_inet_spec.rb +1 -14
  336. data/spec/extensions/pg_interval_spec.rb +3 -13
  337. data/spec/extensions/pg_json_ops_spec.rb +1 -1
  338. data/spec/extensions/pg_json_spec.rb +1 -13
  339. data/spec/extensions/pg_loose_count_spec.rb +1 -1
  340. data/spec/extensions/pg_range_ops_spec.rb +1 -1
  341. data/spec/extensions/pg_range_spec.rb +3 -88
  342. data/spec/extensions/pg_row_ops_spec.rb +1 -1
  343. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  344. data/spec/extensions/pg_row_spec.rb +1 -44
  345. data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
  346. data/spec/extensions/prepared_statements_safe_spec.rb +7 -7
  347. data/spec/extensions/prepared_statements_spec.rb +13 -48
  348. data/spec/extensions/pretty_table_spec.rb +40 -9
  349. data/spec/extensions/query_spec.rb +1 -12
  350. data/spec/extensions/rcte_tree_spec.rb +23 -34
  351. data/spec/extensions/round_timestamps_spec.rb +1 -5
  352. data/spec/extensions/s_spec.rb +1 -1
  353. data/spec/extensions/schema_caching_spec.rb +1 -1
  354. data/spec/extensions/schema_dumper_spec.rb +43 -32
  355. data/spec/extensions/select_remove_spec.rb +1 -1
  356. data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
  357. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  358. data/spec/extensions/serialization_spec.rb +5 -17
  359. data/spec/extensions/server_block_spec.rb +1 -1
  360. data/spec/extensions/server_logging_spec.rb +2 -2
  361. data/spec/extensions/sharding_spec.rb +1 -1
  362. data/spec/extensions/shared_caching_spec.rb +1 -28
  363. data/spec/extensions/single_table_inheritance_spec.rb +2 -5
  364. data/spec/extensions/singular_table_names_spec.rb +1 -1
  365. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  366. data/spec/extensions/spec_helper.rb +5 -27
  367. data/spec/extensions/split_array_nil_spec.rb +1 -1
  368. data/spec/extensions/split_values_spec.rb +1 -1
  369. data/spec/extensions/sql_comments_spec.rb +1 -1
  370. data/spec/extensions/sql_expr_spec.rb +1 -1
  371. data/spec/extensions/static_cache_spec.rb +1 -1
  372. data/spec/extensions/string_agg_spec.rb +2 -2
  373. data/spec/extensions/string_date_time_spec.rb +1 -1
  374. data/spec/extensions/string_stripper_spec.rb +1 -1
  375. data/spec/extensions/subclasses_spec.rb +1 -1
  376. data/spec/extensions/subset_conditions_spec.rb +1 -1
  377. data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
  378. data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
  379. data/spec/extensions/synchronize_sql_spec.rb +124 -0
  380. data/spec/extensions/table_select_spec.rb +4 -4
  381. data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
  382. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  383. data/spec/extensions/timestamps_spec.rb +5 -7
  384. data/spec/extensions/to_dot_spec.rb +1 -1
  385. data/spec/extensions/touch_spec.rb +1 -1
  386. data/spec/extensions/tree_spec.rb +1 -1
  387. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  388. data/spec/extensions/unlimited_update_spec.rb +1 -1
  389. data/spec/extensions/update_or_create_spec.rb +12 -16
  390. data/spec/extensions/update_primary_key_spec.rb +4 -3
  391. data/spec/extensions/update_refresh_spec.rb +1 -1
  392. data/spec/extensions/uuid_spec.rb +10 -13
  393. data/spec/extensions/validate_associated_spec.rb +1 -1
  394. data/spec/extensions/validation_class_methods_spec.rb +3 -3
  395. data/spec/extensions/validation_contexts_spec.rb +1 -1
  396. data/spec/extensions/validation_helpers_spec.rb +10 -44
  397. data/spec/extensions/whitelist_security_spec.rb +5 -5
  398. data/spec/extensions/xml_serializer_spec.rb +8 -13
  399. data/spec/guards_helper.rb +2 -1
  400. data/spec/integration/associations_test.rb +1 -23
  401. data/spec/integration/database_test.rb +7 -7
  402. data/spec/integration/dataset_test.rb +12 -47
  403. data/spec/integration/eager_loader_test.rb +1 -1
  404. data/spec/integration/migrator_test.rb +1 -1
  405. data/spec/integration/model_test.rb +4 -82
  406. data/spec/integration/plugin_test.rb +7 -23
  407. data/spec/integration/prepared_statement_test.rb +8 -88
  408. data/spec/integration/schema_test.rb +10 -10
  409. data/spec/integration/spec_helper.rb +17 -21
  410. data/spec/integration/timezone_test.rb +5 -5
  411. data/spec/integration/transaction_test.rb +3 -55
  412. data/spec/integration/type_test.rb +9 -9
  413. data/spec/model/association_reflection_spec.rb +24 -9
  414. data/spec/model/associations_spec.rb +124 -303
  415. data/spec/model/base_spec.rb +43 -137
  416. data/spec/model/class_dataset_methods_spec.rb +2 -20
  417. data/spec/model/dataset_methods_spec.rb +1 -20
  418. data/spec/model/eager_loading_spec.rb +48 -17
  419. data/spec/model/hooks_spec.rb +5 -300
  420. data/spec/model/inflector_spec.rb +1 -1
  421. data/spec/model/model_spec.rb +29 -339
  422. data/spec/model/plugins_spec.rb +2 -16
  423. data/spec/model/record_spec.rb +33 -129
  424. data/spec/model/spec_helper.rb +5 -15
  425. data/spec/model/validations_spec.rb +1 -1
  426. data/spec/sequel_warning.rb +1 -12
  427. metadata +19 -65
  428. data/doc/active_record.rdoc +0 -927
  429. data/lib/sequel/adapters/cubrid.rb +0 -160
  430. data/lib/sequel/adapters/do/mysql.rb +0 -69
  431. data/lib/sequel/adapters/do/postgres.rb +0 -46
  432. data/lib/sequel/adapters/do/sqlite3.rb +0 -41
  433. data/lib/sequel/adapters/do.rb +0 -166
  434. data/lib/sequel/adapters/jdbc/as400.rb +0 -92
  435. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
  436. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
  437. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
  438. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
  439. data/lib/sequel/adapters/odbc/progress.rb +0 -12
  440. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  441. data/lib/sequel/adapters/shared/firebird.rb +0 -261
  442. data/lib/sequel/adapters/shared/informix.rb +0 -63
  443. data/lib/sequel/adapters/shared/progress.rb +0 -40
  444. data/lib/sequel/adapters/swift/mysql.rb +0 -50
  445. data/lib/sequel/adapters/swift/postgres.rb +0 -49
  446. data/lib/sequel/adapters/swift/sqlite.rb +0 -48
  447. data/lib/sequel/adapters/swift.rb +0 -169
  448. data/lib/sequel/adapters/utils/pg_types.rb +0 -4
  449. data/lib/sequel/dataset/mutation.rb +0 -98
  450. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
  451. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
  452. data/lib/sequel/extensions/filter_having.rb +0 -65
  453. data/lib/sequel/extensions/hash_aliases.rb +0 -51
  454. data/lib/sequel/extensions/meta_def.rb +0 -37
  455. data/lib/sequel/extensions/query_literals.rb +0 -86
  456. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
  457. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
  458. data/lib/sequel/extensions/set_overrides.rb +0 -82
  459. data/lib/sequel/no_core_ext.rb +0 -4
  460. data/lib/sequel/plugins/association_autoreloading.rb +0 -11
  461. data/lib/sequel/plugins/identifier_columns.rb +0 -49
  462. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
  463. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
  464. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
  465. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
  466. data/lib/sequel/plugins/schema.rb +0 -84
  467. data/lib/sequel/plugins/scissors.rb +0 -37
  468. data/spec/core/dataset_mutation_spec.rb +0 -253
  469. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
  470. data/spec/extensions/before_after_save_spec.rb +0 -40
  471. data/spec/extensions/filter_having_spec.rb +0 -42
  472. data/spec/extensions/from_block_spec.rb +0 -21
  473. data/spec/extensions/hash_aliases_spec.rb +0 -26
  474. data/spec/extensions/identifier_columns_spec.rb +0 -19
  475. data/spec/extensions/meta_def_spec.rb +0 -35
  476. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
  477. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
  478. data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
  479. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
  480. data/spec/extensions/query_literals_spec.rb +0 -185
  481. data/spec/extensions/schema_spec.rb +0 -123
  482. data/spec/extensions/scissors_spec.rb +0 -27
  483. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
  484. data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -1,62 +1,33 @@
1
1
  SEQUEL_ADAPTER_TEST = :mysql
2
2
 
3
- require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
4
-
5
- unless defined?(MYSQL_SOCKET_FILE)
6
- MYSQL_SOCKET_FILE = '/tmp/mysql.sock'
7
- end
8
- MYSQL_URI = URI.parse(DB.uri)
9
-
10
- def DB.sqls
11
- (@sqls ||= [])
12
- end
13
- logger = Object.new
14
- def logger.method_missing(m, msg)
15
- DB.sqls << msg
16
- end
17
- DB.loggers = [logger]
18
- DB.drop_table?(:items, :dolls, :booltest)
19
-
20
- SQL_BEGIN = 'BEGIN'
21
- SQL_ROLLBACK = 'ROLLBACK'
22
- SQL_COMMIT = 'COMMIT'
3
+ require_relative 'spec_helper'
23
4
 
24
5
  describe "MySQL", '#create_table' do
25
6
  before do
26
7
  @db = DB
27
8
  @db.test_connection
28
- DB.sqls.clear
29
9
  end
30
10
  after do
31
11
  @db.drop_table?(:dolls)
32
12
  end
33
13
 
34
- it "should allow to specify options for MySQL" do
35
- @db.create_table(:dolls, :engine => 'MyISAM', :charset => 'latin2'){text :name}
36
- check_sqls do
37
- @db.sqls.must_equal ["CREATE TABLE `dolls` (`name` text) ENGINE=MyISAM DEFAULT CHARSET=latin2"]
38
- end
39
- end
40
-
41
14
  it "should create a temporary table" do
42
15
  @db.create_table(:tmp_dolls, :temp => true, :engine => 'MyISAM', :charset => 'latin2'){text :name}
43
- check_sqls do
44
- @db.sqls.must_equal ["CREATE TEMPORARY TABLE `tmp_dolls` (`name` text) ENGINE=MyISAM DEFAULT CHARSET=latin2"]
45
- end
16
+ @db.table_exists?(:tmp_dolls).must_equal true
17
+ @db.disconnect
18
+ @db.table_exists?(:tmp_dolls).must_equal false
46
19
  end
47
20
 
48
21
  it "should not use a default for a String :text=>true type" do
49
22
  @db.create_table(:dolls){String :name, :text=>true, :default=>'blah'}
50
- check_sqls do
51
- @db.sqls.must_equal ["CREATE TABLE `dolls` (`name` text)"]
52
- end
23
+ @db[:dolls].insert
24
+ @db[:dolls].all.must_equal [{:name=>nil}]
53
25
  end
54
26
 
55
27
  it "should not use a default for a File type" do
56
28
  @db.create_table(:dolls){File :name, :default=>'blah'}
57
- check_sqls do
58
- @db.sqls.must_equal ["CREATE TABLE `dolls` (`name` blob)"]
59
- end
29
+ @db[:dolls].insert
30
+ @db[:dolls].all.must_equal [{:name=>nil}]
60
31
  end
61
32
 
62
33
  it "should respect the size option for File type" do
@@ -166,36 +137,21 @@ describe "A MySQL dataset" do
166
137
  before do
167
138
  DB.create_table(:items){String :name; Integer :value}
168
139
  @d = DB[:items]
169
- DB.sqls.clear
170
140
  end
171
141
  after do
172
142
  DB.drop_table?(:items)
173
143
  end
174
144
 
175
- it "should quote columns and tables using back-ticks if quoting identifiers" do
176
- @d = @d.with_quote_identifiers(true)
177
- @d.select(:name).sql.must_equal 'SELECT `name` FROM `items`'
178
- @d.select(Sequel.lit('COUNT(*)')).sql.must_equal 'SELECT COUNT(*) FROM `items`'
179
- @d.select(Sequel.function(:max, :value)).sql.must_equal 'SELECT max(`value`) FROM `items`'
180
- @d.select(Sequel.function(:NOW)).sql.must_equal 'SELECT NOW() FROM `items`'
181
- @d.select(Sequel.function(:max, Sequel[:items][:value])).sql.must_equal 'SELECT max(`items`.`value`) FROM `items`'
182
- @d.order(Sequel.expr(:name).desc).sql.must_equal 'SELECT * FROM `items` ORDER BY `name` DESC'
183
- @d.select(Sequel.lit('items.name AS item_name')).sql.must_equal 'SELECT items.name AS item_name FROM `items`'
184
- @d.select(Sequel.lit('`name`')).sql.must_equal 'SELECT `name` FROM `items`'
185
- @d.select(Sequel.lit('max(items.`name`) AS `max_name`')).sql.must_equal 'SELECT max(items.`name`) AS `max_name` FROM `items`'
186
- @d.select(Sequel.function(:test, :abc, 'hello')).sql.must_equal "SELECT test(`abc`, 'hello') FROM `items`"
187
- @d.select(Sequel.function(:test, Sequel[:abc][:def], 'hello')).sql.must_equal "SELECT test(`abc`.`def`, 'hello') FROM `items`"
188
- @d.select(Sequel.function(:test, Sequel[:abc][:def], 'hello').as(:x2)).sql.must_equal "SELECT test(`abc`.`def`, 'hello') AS `x2` FROM `items`"
189
- @d.insert_sql(:value => 333).must_equal 'INSERT INTO `items` (`value`) VALUES (333)'
190
- @d.insert_sql(:x => :y).must_equal 'INSERT INTO `items` (`x`) VALUES (`y`)'
191
- end
192
-
193
- it "should quote fields correctly when reversing the order" do
194
- @d = @d.with_quote_identifiers(true)
195
- @d.reverse_order(:name).sql.must_equal 'SELECT * FROM `items` ORDER BY `name` DESC'
196
- @d.reverse_order(Sequel.desc(:name)).sql.must_equal 'SELECT * FROM `items` ORDER BY `name` ASC'
197
- @d.reverse_order(:name, Sequel.desc(:test)).sql.must_equal 'SELECT * FROM `items` ORDER BY `name` DESC, `test` ASC'
198
- @d.reverse_order(Sequel.desc(:name), :test).sql.must_equal 'SELECT * FROM `items` ORDER BY `name` ASC, `test` DESC'
145
+ it "should handle large unsigned smallint/integer values" do
146
+ DB.alter_table(:items){set_column_type :value, 'smallint unsigned'}
147
+ @d.insert(:value=>(1 << 15) + 1)
148
+ @d.get(:value).must_equal((1 << 15) + 1)
149
+ DB.alter_table(:items){set_column_type :value, 'integer unsigned'}
150
+ @d.update(:value=>(1 << 31) + 1)
151
+ @d.get(:value).must_equal((1 << 31) + 1)
152
+ DB.alter_table(:items){set_column_type :value, 'bigint unsigned'}
153
+ @d.update(:value=>(1 << 63) + 1)
154
+ @d.get(:value).must_equal((1 << 63) + 1)
199
155
  end
200
156
 
201
157
  it "should support ORDER clause in UPDATE statements" do
@@ -217,7 +173,7 @@ describe "A MySQL dataset" do
217
173
  it "should raise error for updating a dataset with an offset" do
218
174
  proc{@d.offset(1).update(:value => 4)}.must_raise Sequel::InvalidOperation
219
175
  proc{@d.order(:value).offset(1).update(:value => 4)}.must_raise Sequel::InvalidOperation
220
- end if false # SEQUEL5
176
+ end
221
177
 
222
178
  it "should support regexps" do
223
179
  @d.insert(:name => 'abc', :value => 1)
@@ -250,22 +206,6 @@ describe "A MySQL dataset" do
250
206
  end
251
207
  end
252
208
 
253
- describe "MySQL datasets" do
254
- before do
255
- @d = DB[:orders]
256
- end
257
-
258
- it "should correctly quote column references" do
259
- @d = @d.with_quote_identifiers(true)
260
- market = 'ICE'
261
- ack_stamp = Time.now - 15 * 60 # 15 minutes ago
262
- @d.select(:market, Sequel.function(:minute, Sequel.function(:from_unixtime, :ack)).as(:minute)).
263
- where{(ack > ack_stamp) & {:market => market}}.
264
- group_by(Sequel.function(:minute, Sequel.function(:from_unixtime, :ack))).sql.must_equal \
265
- "SELECT `market`, minute(from_unixtime(`ack`)) AS `minute` FROM `orders` WHERE ((`ack` > #{@d.literal(ack_stamp)}) AND (`market` = 'ICE')) GROUP BY minute(from_unixtime(`ack`))"
266
- end
267
- end
268
-
269
209
  describe "Dataset#distinct" do
270
210
  before do
271
211
  @db = DB
@@ -290,59 +230,27 @@ describe "Dataset#distinct" do
290
230
  end
291
231
 
292
232
  describe "MySQL join expressions" do
293
- before do
233
+ before(:all) do
294
234
  @ds = DB[:nodes]
235
+ DB.create_table!(:nodes){Integer :id; Integer :y}
236
+ DB.create_table!(:n1){Integer :id}
237
+ DB.create_table!(:n2){Integer :y}
238
+ @ds.insert(:id=>1, :y=>2)
239
+ DB[:n1].insert(1)
240
+ DB[:n2].insert(2)
295
241
  end
296
-
297
- it "should raise error for :full_outer join requests." do
298
- lambda{@ds.join_table(:full_outer, :nodes)}.must_raise(Sequel::Error)
299
- end
300
- it "should raise error for :natural_full join requests." do
301
- lambda{@ds.join_table(:natural_full, :nodes)}.must_raise(Sequel::Error)
302
- end
303
- it "should support natural left joins" do
304
- @ds.join_table(:natural_left, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL LEFT JOIN `nodes`'
305
- end
306
- it "should support natural right joins" do
307
- @ds.join_table(:natural_right, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL RIGHT JOIN `nodes`'
308
- end
309
- it "should support natural left outer joins" do
310
- @ds.join_table(:natural_left_outer, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL LEFT OUTER JOIN `nodes`'
311
- end
312
- it "should support natural right outer joins" do
313
- @ds.join_table(:natural_right_outer, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL RIGHT OUTER JOIN `nodes`'
314
- end
315
- deprecated "should support natural inner joins" do
316
- @ds.join_table(:natural_inner, :nodes).sql.must_equal 'SELECT * FROM `nodes` NATURAL LEFT JOIN `nodes`'
317
- end
318
- it "should support cross joins" do
319
- @ds.join_table(:cross, :nodes).sql.must_equal 'SELECT * FROM `nodes` CROSS JOIN `nodes`'
320
- end
321
- deprecated "should support cross joins as inner joins if conditions are used" do
322
- @ds.join_table(:cross, :nodes, :id=>:id).sql.must_equal 'SELECT * FROM `nodes` INNER JOIN `nodes` ON (`nodes`.`id` = `nodes`.`id`)'
242
+ after(:all) do
243
+ DB.drop_table?(:n2, :n1, :nodes)
323
244
  end
245
+
324
246
  it "should support straight joins (force left table to be read before right)" do
325
- @ds.join_table(:straight, :nodes).sql.must_equal 'SELECT * FROM `nodes` STRAIGHT_JOIN `nodes`'
247
+ @ds.join_table(:straight, :n1).all.must_equal [{:id=>1, :y=>2}]
326
248
  end
327
249
  it "should support natural joins on multiple tables." do
328
- @ds.join_table(:natural_left_outer, [:nodes, :branches]).sql.must_equal 'SELECT * FROM `nodes` NATURAL LEFT OUTER JOIN (`nodes`, `branches`)'
250
+ @ds.join_table(:natural_left_outer, [:n1, :n2]).all.must_equal [{:id=>1, :y=>2}]
329
251
  end
330
252
  it "should support straight joins on multiple tables." do
331
- @ds.join_table(:straight, [:nodes,:branches]).sql.must_equal 'SELECT * FROM `nodes` STRAIGHT_JOIN (`nodes`, `branches`)'
332
- end
333
- end
334
-
335
- describe "Joined MySQL dataset" do
336
- before do
337
- @ds = DB[:nodes]
338
- end
339
-
340
- it "should quote fields correctly" do
341
- @ds.with_quote_identifiers(true).join(:attributes, :node_id => :id).sql.must_equal "SELECT * FROM `nodes` INNER JOIN `attributes` ON (`attributes`.`node_id` = `nodes`.`id`)"
342
- end
343
-
344
- it "should put a having clause before an order by clause" do
345
- @ds.order(:aaa).having(:bbb => :ccc).sql.must_equal "SELECT * FROM `nodes` HAVING (`bbb` = `ccc`) ORDER BY `aaa`"
253
+ @ds.join_table(:straight, [:n1, :n2]).all.must_equal [{:id=>1, :y=>2}]
346
254
  end
347
255
  end
348
256
 
@@ -377,14 +285,6 @@ describe "A MySQL database" do
377
285
  @db.server_version.must_be :>=, 40000
378
286
  end
379
287
 
380
- it "should cache the server version" do
381
- # warm cache:
382
- @db.server_version
383
- @db.sqls.clear
384
- 3.times{@db.server_version}
385
- @db.sqls.must_be :empty?
386
- end
387
-
388
288
  it "should support for_share" do
389
289
  @db[:test2].delete
390
290
  @db.transaction{@db[:test2].for_share.all.must_equal []}
@@ -440,54 +340,6 @@ describe "A MySQL database" do
440
340
  end
441
341
  end
442
342
 
443
- # SEQUEL5: Remove
444
- describe "A MySQL database with table options" do
445
- before do
446
- @options = {:engine=>'MyISAM', :charset=>'latin1', :collate => 'latin1_swedish_ci'}
447
-
448
- deprecated do
449
- Sequel::MySQL.default_engine = 'InnoDB'
450
- Sequel::MySQL.default_charset = 'utf8'
451
- Sequel::MySQL.default_collate = 'utf8_general_ci'
452
- end
453
-
454
- @db = DB
455
- @db.drop_table?(:items)
456
-
457
- DB.sqls.clear
458
- end
459
- after do
460
- @db.drop_table?(:items)
461
-
462
- deprecated do
463
- Sequel::MySQL.default_engine = nil
464
- Sequel::MySQL.default_charset = nil
465
- Sequel::MySQL.default_collate = nil
466
- end
467
- end
468
-
469
- it "should allow to pass custom options (engine, charset, collate) for table creation" do
470
- @db.create_table(:items, @options){Integer :size; text :name}
471
- check_sqls do
472
- @db.sqls.must_equal ["CREATE TABLE `items` (`size` integer, `name` text) ENGINE=MyISAM DEFAULT CHARSET=latin1 DEFAULT COLLATE=latin1_swedish_ci"]
473
- end
474
- end
475
-
476
- it "should use default options if specified (engine, charset, collate) for table creation" do
477
- @db.create_table(:items){Integer :size; text :name}
478
- check_sqls do
479
- @db.sqls.must_equal ["CREATE TABLE `items` (`size` integer, `name` text) ENGINE=InnoDB DEFAULT CHARSET=utf8 DEFAULT COLLATE=utf8_general_ci"]
480
- end
481
- end
482
-
483
- it "should not use default if option has a nil value" do
484
- @db.create_table(:items, :engine=>nil, :charset=>nil, :collate=>nil){Integer :size; text :name}
485
- check_sqls do
486
- @db.sqls.must_equal ["CREATE TABLE `items` (`size` integer, `name` text)"]
487
- end
488
- end
489
- end
490
-
491
343
  describe "A MySQL database with table options" do
492
344
  before do
493
345
  @options = {:engine=>'MyISAM', :charset=>'latin1', :collate => 'latin1_swedish_ci'}
@@ -497,8 +349,6 @@ describe "A MySQL database with table options" do
497
349
  @db.default_charset = 'utf8'
498
350
  @db.default_collate = 'utf8_general_ci'
499
351
  @db.drop_table?(:items)
500
-
501
- DB.sqls.clear
502
352
  end
503
353
  after do
504
354
  @db.drop_table?(:items)
@@ -510,23 +360,23 @@ describe "A MySQL database with table options" do
510
360
 
511
361
  it "should allow to pass custom options (engine, charset, collate) for table creation" do
512
362
  @db.create_table(:items, @options){Integer :size; text :name}
513
- check_sqls do
514
- @db.sqls.must_equal ["CREATE TABLE `items` (`size` integer, `name` text) ENGINE=MyISAM DEFAULT CHARSET=latin1 DEFAULT COLLATE=latin1_swedish_ci"]
363
+ @db.transaction(:rollback=>:always) do
364
+ @db[:items].insert(:size=>1)
515
365
  end
366
+ @db[:items].all.must_equal [{:size=>1, :name=>nil}]
516
367
  end
517
368
 
518
369
  it "should use default options if specified (engine, charset, collate) for table creation" do
519
370
  @db.create_table(:items){Integer :size; text :name}
520
- check_sqls do
521
- @db.sqls.must_equal ["CREATE TABLE `items` (`size` integer, `name` text) ENGINE=InnoDB DEFAULT CHARSET=utf8 DEFAULT COLLATE=utf8_general_ci"]
371
+ @db.transaction(:rollback=>:always) do
372
+ @db[:items].insert(:size=>1)
522
373
  end
374
+ @db[:items].all.must_equal []
523
375
  end
524
376
 
525
377
  it "should not use default if option has a nil value" do
378
+ @db.default_engine = 'non_existent_engine'
526
379
  @db.create_table(:items, :engine=>nil, :charset=>nil, :collate=>nil){Integer :size; text :name}
527
- check_sqls do
528
- @db.sqls.must_equal ["CREATE TABLE `items` (`size` integer, `name` text)"]
529
- end
530
380
  end
531
381
  end
532
382
 
@@ -534,7 +384,6 @@ describe "A MySQL database" do
534
384
  before do
535
385
  @db = DB
536
386
  @db.drop_table?(:items)
537
- DB.sqls.clear
538
387
  end
539
388
  after do
540
389
  @db.drop_table?(:items, :users)
@@ -542,45 +391,45 @@ describe "A MySQL database" do
542
391
 
543
392
  it "should support defaults for boolean columns" do
544
393
  @db.create_table(:items){TrueClass :active1, :default=>true; FalseClass :active2, :default => false}
545
- check_sqls do
546
- @db.sqls.must_equal ["CREATE TABLE `items` (`active1` tinyint(1) DEFAULT 1, `active2` tinyint(1) DEFAULT 0)"]
547
- end
394
+ @db[:items].insert
395
+ @db[:items].get([:active1, :active2]).must_equal [true, false]
396
+ @db[:items].get([Sequel.cast(:active1, Integer).as(:v1), Sequel.cast(:active2, Integer).as(:v2)]).must_equal [1, 0]
548
397
  end
549
398
 
550
- it "should correctly format CREATE TABLE statements with foreign keys" do
399
+ it "should correctly handle CREATE TABLE statements with foreign keys" do
551
400
  @db.create_table(:items){primary_key :id; foreign_key :p_id, :items, :key => :id, :null => false, :on_delete => :cascade}
552
- check_sqls do
553
- @db.sqls.must_equal ["CREATE TABLE `items` (`id` integer PRIMARY KEY AUTO_INCREMENT, `p_id` integer NOT NULL, UNIQUE (`id`), FOREIGN KEY (`p_id`) REFERENCES `items`(`id`) ON DELETE CASCADE)"]
554
- end
401
+ @db[:items].insert(:id=>1, :p_id=>1)
402
+ @db[:items].insert(:id=>2, :p_id=>1)
403
+ @db[:items].where(:id=>1).delete
404
+ @db[:items].count.must_equal 0
555
405
  end
556
406
 
557
- it "should correctly format CREATE TABLE statements with foreign keys, when :key != the default (:id)" do
407
+ it "should correctly handle CREATE TABLE statements with foreign keys, when :key != the default (:id)" do
558
408
  @db.create_table(:items){primary_key :id; Integer :other_than_id; foreign_key :p_id, :items, :key => :other_than_id, :null => false, :on_delete => :cascade}
559
- check_sqls do
560
- @db.sqls.must_equal ["CREATE TABLE `items` (`id` integer PRIMARY KEY AUTO_INCREMENT, `other_than_id` integer, `p_id` integer NOT NULL, UNIQUE (`other_than_id`), FOREIGN KEY (`p_id`) REFERENCES `items`(`other_than_id`) ON DELETE CASCADE)"]
561
- end
409
+ @db[:items].insert(:id=>1, :other_than_id=>2, :p_id=>2)
410
+ @db[:items].insert(:id=>2, :other_than_id=>3, :p_id=>2)
411
+ @db[:items].where(:id=>1).delete
412
+ @db[:items].count.must_equal 0
562
413
  end
563
414
 
564
- it "should correctly format ALTER TABLE statements with foreign keys" do
415
+ it "should correctly handle ALTER TABLE statements with foreign keys" do
565
416
  @db.create_table(:items){Integer :id}
566
417
  @db.create_table(:users){primary_key :id}
567
418
  @db.alter_table(:items){add_foreign_key :p_id, :users, :key => :id, :null => false, :on_delete => :cascade}
568
- check_sqls do
569
- @db.sqls.must_equal ["CREATE TABLE `items` (`id` integer)",
570
- "CREATE TABLE `users` (`id` integer PRIMARY KEY AUTO_INCREMENT)",
571
- "ALTER TABLE `items` ADD COLUMN `p_id` integer NOT NULL, ADD FOREIGN KEY (`p_id`) REFERENCES `users`(`id`) ON DELETE CASCADE"]
572
- end
419
+ @db[:users].insert(:id=>1)
420
+ @db[:items].insert(:id=>2, :p_id=>1)
421
+ @db[:users].where(:id=>1).delete
422
+ @db[:items].count.must_equal 0
573
423
  end
574
424
 
575
425
  it "should correctly format ALTER TABLE statements with named foreign keys" do
576
426
  @db.create_table(:items){Integer :id}
577
427
  @db.create_table(:users){primary_key :id}
578
428
  @db.alter_table(:items){add_foreign_key :p_id, :users, :key => :id, :null => false, :on_delete => :cascade, :foreign_key_constraint_name => :pk_items__users }
579
- check_sqls do
580
- @db.sqls.must_equal ["CREATE TABLE `items` (`id` integer)",
581
- "CREATE TABLE `users` (`id` integer PRIMARY KEY AUTO_INCREMENT)",
582
- "ALTER TABLE `items` ADD COLUMN `p_id` integer NOT NULL, ADD CONSTRAINT `pk_items__users` FOREIGN KEY (`p_id`) REFERENCES `users`(`id`) ON DELETE CASCADE"]
583
- end
429
+ @db[:users].insert(:id=>1)
430
+ @db[:items].insert(:id=>2, :p_id=>1)
431
+ @db[:users].where(:id=>1).delete
432
+ @db[:items].count.must_equal 0
584
433
  end
585
434
 
586
435
  it "should correctly handle add_column :after option" do
@@ -604,9 +453,6 @@ describe "A MySQL database" do
604
453
  it "should have rename_column support keep existing options" do
605
454
  @db.create_table(:items){String :id, :null=>false, :default=>'blah'}
606
455
  @db.alter_table(:items){rename_column :id, :nid}
607
- check_sqls do
608
- @db.sqls.must_equal ["CREATE TABLE `items` (`id` varchar(255) NOT NULL DEFAULT 'blah')", "DESCRIBE `items`", "ALTER TABLE `items` CHANGE COLUMN `id` `nid` varchar(255) NOT NULL DEFAULT 'blah'"]
609
- end
610
456
  @db[:items].insert
611
457
  @db[:items].all.must_equal [{:nid=>'blah'}]
612
458
  proc{@db[:items].insert(:nid=>nil)}.must_raise(Sequel::NotNullConstraintViolation)
@@ -615,9 +461,6 @@ describe "A MySQL database" do
615
461
  it "should have set_column_type support keep existing options" do
616
462
  @db.create_table(:items){Integer :id, :null=>false, :default=>5}
617
463
  @db.alter_table(:items){set_column_type :id, :Bignum}
618
- check_sqls do
619
- @db.sqls.must_equal ["CREATE TABLE `items` (`id` integer NOT NULL DEFAULT 5)", "DESCRIBE `items`", "ALTER TABLE `items` CHANGE COLUMN `id` `id` bigint NOT NULL DEFAULT 5"]
620
- end
621
464
  @db[:items].insert
622
465
  @db[:items].all.must_equal [{:id=>5}]
623
466
  proc{@db[:items].insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation)
@@ -629,17 +472,12 @@ describe "A MySQL database" do
629
472
  it "should have set_column_type pass through options" do
630
473
  @db.create_table(:items){integer :id; enum :list, :elements=>%w[one]}
631
474
  @db.alter_table(:items){set_column_type :id, :int, :unsigned=>true, :size=>8; set_column_type :list, :enum, :elements=>%w[two]}
632
- check_sqls do
633
- @db.sqls.must_equal ["CREATE TABLE `items` (`id` integer, `list` enum('one'))", "DESCRIBE `items`", "ALTER TABLE `items` CHANGE COLUMN `id` `id` int(8) UNSIGNED NULL, CHANGE COLUMN `list` `list` enum('two') NULL"]
634
- end
475
+ @db.schema(:items)[1][1][:db_type].must_equal "enum('two')"
635
476
  end
636
477
 
637
478
  it "should have set_column_default support keep existing options" do
638
479
  @db.create_table(:items){Integer :id, :null=>false, :default=>5}
639
480
  @db.alter_table(:items){set_column_default :id, 6}
640
- check_sqls do
641
- @db.sqls.must_equal ["CREATE TABLE `items` (`id` integer NOT NULL DEFAULT 5)", "DESCRIBE `items`", "ALTER TABLE `items` CHANGE COLUMN `id` `id` int(11) NOT NULL DEFAULT 6"]
642
- end
643
481
  @db[:items].insert
644
482
  @db[:items].all.must_equal [{:id=>6}]
645
483
  proc{@db[:items].insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation)
@@ -648,9 +486,6 @@ describe "A MySQL database" do
648
486
  it "should have set_column_allow_null support keep existing options" do
649
487
  @db.create_table(:items){Integer :id, :null=>false, :default=>5}
650
488
  @db.alter_table(:items){set_column_allow_null :id, true}
651
- check_sqls do
652
- @db.sqls.must_equal ["CREATE TABLE `items` (`id` integer NOT NULL DEFAULT 5)", "DESCRIBE `items`", "ALTER TABLE `items` CHANGE COLUMN `id` `id` int(11) NULL DEFAULT 5"]
653
- end
654
489
  @db[:items].insert
655
490
  @db[:items].all.must_equal [{:id=>5}]
656
491
  @db[:items].insert(:id=>nil)
@@ -670,21 +505,20 @@ describe "A MySQL database" do
670
505
  end
671
506
 
672
507
  # Socket tests should only be run if the MySQL server is on localhost
673
- if %w'localhost 127.0.0.1 ::1'.include?(MYSQL_URI.host) and DB.adapter_scheme == :mysql
508
+ if DB.adapter_scheme == :mysql && %w'localhost 127.0.0.1 ::1'.include?(URI.parse(DB.uri).host)
674
509
  describe "A MySQL database" do
510
+ socket_file = defined?(MYSQL_SOCKET_FILE) ? MYSQL_SOCKET_FILE : '/tmp/mysql.sock'
511
+
675
512
  it "should accept a socket option" do
676
- db = Sequel.mysql(DB.opts[:database], :host => 'localhost', :user => DB.opts[:user], :password => DB.opts[:password], :socket => MYSQL_SOCKET_FILE)
677
- db.test_connection
513
+ Sequel.mysql(DB.opts[:database], :host => 'localhost', :user => DB.opts[:user], :password => DB.opts[:password], :socket => socket_file, :keep_reference=>false)
678
514
  end
679
515
 
680
516
  it "should accept a socket option without host option" do
681
- db = Sequel.mysql(DB.opts[:database], :user => DB.opts[:user], :password => DB.opts[:password], :socket => MYSQL_SOCKET_FILE)
682
- db.test_connection
517
+ Sequel.mysql(DB.opts[:database], :user => DB.opts[:user], :password => DB.opts[:password], :socket => socket_file, :keep_reference=>false)
683
518
  end
684
519
 
685
520
  it "should fail to connect with invalid socket" do
686
- db = Sequel.mysql(DB.opts[:database], :user => DB.opts[:user], :password => DB.opts[:password], :socket =>'blah')
687
- proc{db.test_connection}.must_raise Sequel::DatabaseConnectionError
521
+ proc{Sequel.mysql(DB.opts[:database], :user => DB.opts[:user], :password => DB.opts[:password], :socket =>'blah', :keep_reference=>false)}.must_raise Sequel::DatabaseConnectionError
688
522
  end
689
523
  end
690
524
  end
@@ -783,7 +617,6 @@ describe "A MySQL database" do
783
617
  before do
784
618
  @db = DB
785
619
  @db.drop_table?(:posts)
786
- @db.sqls.clear
787
620
  end
788
621
  after do
789
622
  @db.drop_table?(:posts)
@@ -791,28 +624,14 @@ describe "A MySQL database" do
791
624
 
792
625
  it "should support fulltext indexes and full_text_search" do
793
626
  @db.create_table(:posts, :engine=>:MyISAM){text :title; text :body; full_text_index :title; full_text_index [:title, :body]}
794
- check_sqls do
795
- @db.sqls.must_equal [
796
- "CREATE TABLE `posts` (`title` text, `body` text) ENGINE=MyISAM",
797
- "CREATE FULLTEXT INDEX `posts_title_index` ON `posts` (`title`)",
798
- "CREATE FULLTEXT INDEX `posts_title_body_index` ON `posts` (`title`, `body`)"
799
- ]
800
- end
801
627
 
802
628
  @db[:posts].insert(:title=>'ruby rails', :body=>'y')
803
629
  @db[:posts].insert(:title=>'sequel', :body=>'ruby')
804
630
  @db[:posts].insert(:title=>'ruby scooby', :body=>'x')
805
- @db.sqls.clear
806
631
 
807
632
  @db[:posts].full_text_search(:title, 'rails').all.must_equal [{:title=>'ruby rails', :body=>'y'}]
808
633
  @db[:posts].full_text_search([:title, :body], ['sequel', 'ruby']).all.must_equal [{:title=>'sequel', :body=>'ruby'}]
809
634
  @db[:posts].full_text_search(:title, '+ruby -rails', :boolean => true).all.must_equal [{:title=>'ruby scooby', :body=>'x'}]
810
- check_sqls do
811
- @db.sqls.must_equal [
812
- "SELECT * FROM `posts` WHERE (MATCH (`title`) AGAINST ('rails'))",
813
- "SELECT * FROM `posts` WHERE (MATCH (`title`, `body`) AGAINST ('sequel ruby'))",
814
- "SELECT * FROM `posts` WHERE (MATCH (`title`) AGAINST ('+ruby -rails' IN BOOLEAN MODE))"]
815
- end
816
635
 
817
636
  @db[:posts].full_text_search(:title, :$n).call(:select, :n=>'rails').must_equal [{:title=>'ruby rails', :body=>'y'}]
818
637
  @db[:posts].full_text_search(:title, :$n).prepare(:select, :fts_select).call(:n=>'rails').must_equal [{:title=>'ruby rails', :body=>'y'}]
@@ -820,32 +639,18 @@ describe "A MySQL database" do
820
639
 
821
640
  it "should support spatial indexes" do
822
641
  @db.create_table(:posts, :engine=>:MyISAM){point :geom, :null=>false; spatial_index [:geom]}
823
- check_sqls do
824
- @db.sqls.must_equal [
825
- "CREATE TABLE `posts` (`geom` point NOT NULL) ENGINE=MyISAM",
826
- "CREATE SPATIAL INDEX `posts_geom_index` ON `posts` (`geom`)"
827
- ]
828
- end
829
642
  end
830
643
 
831
644
  it "should support indexes with index type" do
832
645
  @db.create_table(:posts){Integer :id; index :id, :type => :btree}
833
- check_sqls do
834
- @db.sqls.must_equal [
835
- "CREATE TABLE `posts` (`id` integer)",
836
- "CREATE INDEX `posts_id_index` USING btree ON `posts` (`id`)"
837
- ]
838
- end
646
+ @db[:posts].insert(1)
647
+ @db[:posts].where(:id=>1).count.must_equal 1
839
648
  end
840
649
 
841
650
  it "should support unique indexes with index type" do
842
651
  @db.create_table(:posts){Integer :id; index :id, :type => :btree, :unique => true}
843
- check_sqls do
844
- @db.sqls.must_equal [
845
- "CREATE TABLE `posts` (`id` integer)",
846
- "CREATE UNIQUE INDEX `posts_id_index` USING btree ON `posts` (`id`)"
847
- ]
848
- end
652
+ @db[:posts].insert(1)
653
+ proc{@db[:posts].insert(1)}.must_raise Sequel::UniqueConstraintViolation
849
654
  end
850
655
 
851
656
  it "should not dump partial indexes" do
@@ -863,9 +668,8 @@ end
863
668
 
864
669
  describe "MySQL::Dataset#insert and related methods" do
865
670
  before do
866
- DB.create_table(:items){String :name; Integer :value}
867
- @d = DB[:items]
868
- DB.sqls.clear
671
+ DB.create_table(:items){String :name, :unique=>true; Integer :value}
672
+ @d = DB[:items].order(:name)
869
673
  end
870
674
  after do
871
675
  DB.drop_table?(:items)
@@ -873,245 +677,93 @@ describe "MySQL::Dataset#insert and related methods" do
873
677
 
874
678
  it "#insert should insert record with default values when no arguments given" do
875
679
  @d.insert
876
- check_sqls do
877
- DB.sqls.must_equal ["INSERT INTO `items` () VALUES ()"]
878
- end
879
680
  @d.all.must_equal [{:name => nil, :value => nil}]
880
681
  end
881
682
 
882
683
  it "#insert should insert record with default values when empty hash given" do
883
684
  @d.insert({})
884
- check_sqls do
885
- DB.sqls.must_equal ["INSERT INTO `items` () VALUES ()"]
886
- end
887
685
  @d.all.must_equal [{:name => nil, :value => nil}]
888
686
  end
889
687
 
890
688
  it "#insert should insert record with default values when empty array given" do
891
689
  @d.insert []
892
- check_sqls do
893
- DB.sqls.must_equal ["INSERT INTO `items` () VALUES ()"]
894
- end
895
690
  @d.all.must_equal [{:name => nil, :value => nil}]
896
691
  end
897
692
 
898
693
  it "#on_duplicate_key_update should work with regular inserts" do
899
694
  DB.add_index :items, :name, :unique=>true
900
- DB.sqls.clear
901
695
  @d.insert(:name => 'abc', :value => 1)
902
696
  @d.on_duplicate_key_update(:name, :value => 6).insert(:name => 'abc', :value => 1)
903
697
  @d.on_duplicate_key_update(:name, :value => 6).insert(:name => 'def', :value => 2)
904
-
905
- check_sqls do
906
- DB.sqls.length.must_equal 3
907
- DB.sqls[0].must_match(/\AINSERT INTO `items` \(`(name|value)`, `(name|value)`\) VALUES \(('abc'|1), (1|'abc')\)\z/)
908
- DB.sqls[1].must_match(/\AINSERT INTO `items` \(`(name|value)`, `(name|value)`\) VALUES \(('abc'|1), (1|'abc')\) ON DUPLICATE KEY UPDATE `name`=VALUES\(`name`\), `value`=6\z/)
909
- DB.sqls[2].must_match(/\AINSERT INTO `items` \(`(name|value)`, `(name|value)`\) VALUES \(('def'|2), (2|'def')\) ON DUPLICATE KEY UPDATE `name`=VALUES\(`name`\), `value`=6\z/)
910
- end
911
-
912
698
  @d.all.must_equal [{:name => 'abc', :value => 6}, {:name => 'def', :value => 2}]
913
699
  end
914
700
 
915
- it "#multi_replace should insert multiple records in a single statement" do
701
+ it "#multi_replace should replace multiple records in a single statement" do
916
702
  @d.multi_replace([{:name => 'abc'}, {:name => 'def'}])
917
-
918
- check_sqls do
919
- DB.sqls.must_equal [
920
- SQL_BEGIN,
921
- "REPLACE INTO `items` (`name`) VALUES ('abc'), ('def')",
922
- SQL_COMMIT
923
- ]
924
- end
925
-
926
- @d.all.must_equal [
927
- {:name => 'abc', :value => nil}, {:name => 'def', :value => nil}
928
- ]
703
+ @d.all.must_equal [ {:name => 'abc', :value => nil}, {:name => 'def', :value => nil} ]
704
+ @d.multi_replace([{:name => 'abc', :value=>1}, {:name => 'ghi', :value=>3}])
705
+ @d.all.must_equal [ {:name => 'abc', :value => 1}, {:name => 'def', :value => nil}, {:name => 'ghi', :value=>3} ]
929
706
  end
930
707
 
931
- it "#multi_replace should split the list of records into batches if :commit_every option is given" do
932
- @d.multi_replace([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}],
933
- :commit_every => 2)
934
-
935
- check_sqls do
936
- DB.sqls.must_equal [
937
- SQL_BEGIN,
938
- "REPLACE INTO `items` (`value`) VALUES (1), (2)",
939
- SQL_COMMIT,
940
- SQL_BEGIN,
941
- "REPLACE INTO `items` (`value`) VALUES (3), (4)",
942
- SQL_COMMIT
943
- ]
944
- end
945
-
946
- @d.all.must_equal [
947
- {:name => nil, :value => 1},
948
- {:name => nil, :value => 2},
949
- {:name => nil, :value => 3},
950
- {:name => nil, :value => 4}
951
- ]
952
- end
953
-
954
- it "#multi_replace should split the list of records into batches if :slice option is given" do
955
- @d.multi_replace([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}],
956
- :slice => 2)
957
-
958
- check_sqls do
959
- DB.sqls.must_equal [
960
- SQL_BEGIN,
961
- "REPLACE INTO `items` (`value`) VALUES (1), (2)",
962
- SQL_COMMIT,
963
- SQL_BEGIN,
964
- "REPLACE INTO `items` (`value`) VALUES (3), (4)",
965
- SQL_COMMIT
966
- ]
967
- end
708
+ it "#multi_replace should support :commit_every option" do
709
+ @d.multi_replace([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}], :commit_every => 2)
710
+ @d.all.must_equal [ {:name => nil, :value => 1}, {:name => nil, :value => 2}, {:name => nil, :value => 3}, {:name => nil, :value => 4} ]
711
+ end
968
712
 
969
- @d.all.must_equal [
970
- {:name => nil, :value => 1},
971
- {:name => nil, :value => 2},
972
- {:name => nil, :value => 3},
973
- {:name => nil, :value => 4}
974
- ]
713
+ it "#multi_replace should support :slice option" do
714
+ @d.multi_replace([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}], :slice => 2)
715
+ @d.all.must_equal [ {:name => nil, :value => 1}, {:name => nil, :value => 2}, {:name => nil, :value => 3}, {:name => nil, :value => 4} ]
975
716
  end
976
717
 
977
718
  it "#multi_insert should insert multiple records in a single statement" do
978
719
  @d.multi_insert([{:name => 'abc'}, {:name => 'def'}])
979
-
980
- check_sqls do
981
- DB.sqls.must_equal [
982
- SQL_BEGIN,
983
- "INSERT INTO `items` (`name`) VALUES ('abc'), ('def')",
984
- SQL_COMMIT
985
- ]
986
- end
987
-
988
- @d.all.must_equal [
989
- {:name => 'abc', :value => nil}, {:name => 'def', :value => nil}
990
- ]
720
+ @d.all.must_equal [ {:name => 'abc', :value => nil}, {:name => 'def', :value => nil} ]
991
721
  end
992
722
 
993
- it "#multi_insert should split the list of records into batches if :commit_every option is given" do
994
- @d.multi_insert([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}],
995
- :commit_every => 2)
996
-
997
- check_sqls do
998
- DB.sqls.must_equal [
999
- SQL_BEGIN,
1000
- "INSERT INTO `items` (`value`) VALUES (1), (2)",
1001
- SQL_COMMIT,
1002
- SQL_BEGIN,
1003
- "INSERT INTO `items` (`value`) VALUES (3), (4)",
1004
- SQL_COMMIT
1005
- ]
1006
- end
1007
-
1008
- @d.all.must_equal [
1009
- {:name => nil, :value => 1},
1010
- {:name => nil, :value => 2},
1011
- {:name => nil, :value => 3},
1012
- {:name => nil, :value => 4}
1013
- ]
1014
- end
1015
-
1016
- it "#multi_insert should split the list of records into batches if :slice option is given" do
1017
- @d.multi_insert([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}],
1018
- :slice => 2)
1019
-
1020
- check_sqls do
1021
- DB.sqls.must_equal [
1022
- SQL_BEGIN,
1023
- "INSERT INTO `items` (`value`) VALUES (1), (2)",
1024
- SQL_COMMIT,
1025
- SQL_BEGIN,
1026
- "INSERT INTO `items` (`value`) VALUES (3), (4)",
1027
- SQL_COMMIT
1028
- ]
1029
- end
723
+ it "#multi_insert should support :commit_every option" do
724
+ @d.multi_insert([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}], :commit_every => 2)
725
+ @d.all.must_equal [ {:name => nil, :value => 1}, {:name => nil, :value => 2}, {:name => nil, :value => 3}, {:name => nil, :value => 4} ]
726
+ end
1030
727
 
1031
- @d.all.must_equal [
1032
- {:name => nil, :value => 1},
1033
- {:name => nil, :value => 2},
1034
- {:name => nil, :value => 3},
1035
- {:name => nil, :value => 4}
1036
- ]
728
+ it "#multi_insert should support :slice option" do
729
+ @d.multi_insert([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}], :slice => 2)
730
+ @d.all.must_equal [ {:name => nil, :value => 1}, {:name => nil, :value => 2}, {:name => nil, :value => 3}, {:name => nil, :value => 4} ]
1037
731
  end
1038
732
 
1039
733
  it "#import should support inserting using columns and values arrays" do
1040
734
  @d.import([:name, :value], [['abc', 1], ['def', 2]])
1041
-
1042
- check_sqls do
1043
- DB.sqls.must_equal [
1044
- SQL_BEGIN,
1045
- "INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2)",
1046
- SQL_COMMIT
1047
- ]
1048
- end
1049
-
1050
- @d.all.must_equal [
1051
- {:name => 'abc', :value => 1},
1052
- {:name => 'def', :value => 2}
1053
- ]
735
+ @d.all.must_equal [ {:name => 'abc', :value => 1}, {:name => 'def', :value => 2} ]
1054
736
  end
1055
737
 
1056
- it "#insert_ignore should add the IGNORE keyword when inserting" do
738
+ it "#insert_ignore should ignore existing records when used with multi_insert" do
1057
739
  @d.insert_ignore.multi_insert([{:name => 'abc'}, {:name => 'def'}])
1058
-
1059
- check_sqls do
1060
- DB.sqls.must_equal [
1061
- SQL_BEGIN,
1062
- "INSERT IGNORE INTO `items` (`name`) VALUES ('abc'), ('def')",
1063
- SQL_COMMIT
1064
- ]
1065
- end
1066
-
1067
- @d.all.must_equal [
1068
- {:name => 'abc', :value => nil}, {:name => 'def', :value => nil}
1069
- ]
740
+ @d.all.must_equal [ {:name => 'abc', :value => nil}, {:name => 'def', :value => nil} ]
741
+ @d.insert_ignore.multi_insert([{:name => 'abc', :value=>1}, {:name => 'ghi', :value=>3}])
742
+ @d.all.must_equal [ {:name => 'abc', :value => nil}, {:name => 'def', :value => nil}, {:name => 'ghi', :value=>3} ]
1070
743
  end
1071
744
 
1072
- it "#insert_ignore should add the IGNORE keyword for single inserts" do
745
+ it "#insert_ignore should ignore single records when used with insert" do
1073
746
  @d.insert_ignore.insert(:name => 'ghi')
1074
- check_sqls do
1075
- DB.sqls.must_equal ["INSERT IGNORE INTO `items` (`name`) VALUES ('ghi')"]
1076
- end
747
+ @d.all.must_equal [{:name => 'ghi', :value => nil}]
748
+ @d.insert_ignore.insert(:name => 'ghi', :value=>2)
1077
749
  @d.all.must_equal [{:name => 'ghi', :value => nil}]
1078
750
  end
1079
751
 
1080
- it "#on_duplicate_key_update should add the ON DUPLICATE KEY UPDATE and ALL columns when no args given" do
752
+ it "#on_duplicate_key_update should handle inserts with duplicate keys" do
1081
753
  @d.on_duplicate_key_update.import([:name,:value], [['abc', 1], ['def',2]])
1082
-
1083
- check_sqls do
1084
- DB.sqls.must_equal [
1085
- "SELECT * FROM `items` LIMIT 1",
1086
- SQL_BEGIN,
1087
- "INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2) ON DUPLICATE KEY UPDATE `name`=VALUES(`name`), `value`=VALUES(`value`)",
1088
- SQL_COMMIT
1089
- ]
1090
- end
1091
-
1092
- @d.all.must_equal [
1093
- {:name => 'abc', :value => 1}, {:name => 'def', :value => 2}
1094
- ]
754
+ @d.all.must_equal [ {:name => 'abc', :value => 1}, {:name => 'def', :value => 2} ]
755
+ @d.on_duplicate_key_update.import([:name,:value], [['abc', 2], ['ghi',3]])
756
+ @d.all.must_equal [ {:name => 'abc', :value => 2}, {:name => 'def', :value => 2}, {:name => 'ghi', :value=>3} ]
1095
757
  end
1096
758
 
1097
759
  it "#on_duplicate_key_update should add the ON DUPLICATE KEY UPDATE and columns specified when args are given" do
1098
- @d.on_duplicate_key_update(:value).import([:name,:value],
1099
- [['abc', 1], ['def',2]]
1100
- )
1101
-
1102
- check_sqls do
1103
- DB.sqls.must_equal [
1104
- SQL_BEGIN,
1105
- "INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2) ON DUPLICATE KEY UPDATE `value`=VALUES(`value`)",
1106
- SQL_COMMIT
1107
- ]
1108
- end
1109
-
1110
- @d.all.must_equal [
1111
- {:name => 'abc', :value => 1}, {:name => 'def', :value => 2}
1112
- ]
760
+ @d.on_duplicate_key_update(:value).import([:name,:value], [['abc', 1], ['def',2]])
761
+ @d.all.must_equal [ {:name => 'abc', :value => 1}, {:name => 'def', :value => 2} ]
762
+ @d.on_duplicate_key_update(:value).import([:name,:value], [['abc', 2], ['ghi',3]])
763
+ @d.all.must_equal [ {:name => 'abc', :value => 2}, {:name => 'def', :value => 2}, {:name => 'ghi', :value=>3} ]
764
+ @d.on_duplicate_key_update(:name).import([:name,:value], [['abc', 5], ['ghi',6]])
765
+ @d.all.must_equal [ {:name => 'abc', :value => 2}, {:name => 'def', :value => 2}, {:name => 'ghi', :value=>3} ]
1113
766
  end
1114
-
1115
767
  end
1116
768
 
1117
769
  describe "MySQL::Dataset#update and related methods" do
@@ -1127,11 +779,7 @@ describe "MySQL::Dataset#update and related methods" do
1127
779
  @d.insert(:name => 'cow', :value => 0)
1128
780
  @d.insert(:name => 'cat', :value => 1)
1129
781
  proc{@d.where(:value => 1).update(:name => 'cow')}.must_raise(Sequel::UniqueConstraintViolation)
1130
- DB.sqls.clear
1131
782
  @d.update_ignore.where(:value => 1).update(:name => 'cow')
1132
- check_sqls do
1133
- DB.sqls.must_equal ["UPDATE IGNORE `items` SET `name` = 'cow' WHERE (`value` = 1)"]
1134
- end
1135
783
  @d.order(:name).all.must_equal [{:name => 'cat', :value => 1}, {:name => 'cow', :value => 0}]
1136
784
  end
1137
785
  end
@@ -1140,7 +788,6 @@ describe "MySQL::Dataset#replace" do
1140
788
  before do
1141
789
  DB.create_table(:items){Integer :id, :unique=>true; Integer :value}
1142
790
  @d = DB[:items]
1143
- DB.sqls.clear
1144
791
  end
1145
792
  after do
1146
793
  DB.drop_table?(:items)
@@ -1182,26 +829,13 @@ describe "MySQL::Dataset#calc_found_rows" do
1182
829
  DB.drop_table?(:items)
1183
830
  end
1184
831
 
1185
- it "should add the SQL_CALC_FOUND_ROWS keyword when selecting" do
1186
- DB[:items].select(:a).calc_found_rows.limit(1).sql.must_equal \
1187
- 'SELECT SQL_CALC_FOUND_ROWS `a` FROM `items` LIMIT 1'
1188
- end
1189
-
1190
832
  it "should count matching rows disregarding LIMIT clause" do
1191
833
  DB[:items].multi_insert([{:a => 1}, {:a => 1}, {:a => 2}])
1192
- DB.sqls.clear
1193
834
 
1194
835
  DB.synchronize do
1195
836
  DB[:items].calc_found_rows.filter(:a => 1).limit(1).all.must_equal [{:a => 1}]
1196
837
  DB.dataset.select(Sequel.function(:FOUND_ROWS).as(:rows)).all.must_equal [{:rows => 2 }]
1197
838
  end
1198
-
1199
- check_sqls do
1200
- DB.sqls.must_equal [
1201
- 'SELECT SQL_CALC_FOUND_ROWS * FROM `items` WHERE (`a` = 1) LIMIT 1',
1202
- 'SELECT FOUND_ROWS() AS `rows`',
1203
- ]
1204
- end
1205
839
  end
1206
840
  end
1207
841
 
@@ -1210,7 +844,6 @@ if DB.adapter_scheme == :mysql or DB.adapter_scheme == :jdbc or DB.adapter_schem
1210
844
  before do
1211
845
  DB.create_table(:items){Integer :id; Integer :value}
1212
846
  @d = DB[:items]
1213
- DB.sqls.clear
1214
847
  end
1215
848
  after do
1216
849
  DB.drop_table?(:items)