sequel 4.49.0 → 5.0.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 (477) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +70 -0
  3. data/README.rdoc +195 -136
  4. data/Rakefile +26 -42
  5. data/bin/sequel +3 -5
  6. data/doc/advanced_associations.rdoc +86 -163
  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/schema_modification.rdoc +63 -60
  29. data/doc/security.rdoc +97 -88
  30. data/doc/sharding.rdoc +43 -30
  31. data/doc/sql.rdoc +53 -65
  32. data/doc/testing.rdoc +3 -5
  33. data/doc/thread_safety.rdoc +2 -4
  34. data/doc/transactions.rdoc +18 -17
  35. data/doc/validations.rdoc +48 -45
  36. data/doc/virtual_rows.rdoc +87 -115
  37. data/lib/sequel.rb +1 -1
  38. data/lib/sequel/adapters/ado.rb +9 -25
  39. data/lib/sequel/adapters/ado/access.rb +7 -13
  40. data/lib/sequel/adapters/ado/mssql.rb +2 -9
  41. data/lib/sequel/adapters/amalgalite.rb +3 -18
  42. data/lib/sequel/adapters/ibmdb.rb +9 -45
  43. data/lib/sequel/adapters/jdbc.rb +13 -73
  44. data/lib/sequel/adapters/jdbc/db2.rb +8 -37
  45. data/lib/sequel/adapters/jdbc/derby.rb +4 -50
  46. data/lib/sequel/adapters/jdbc/h2.rb +4 -25
  47. data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -26
  48. data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
  49. data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
  50. data/lib/sequel/adapters/jdbc/mysql.rb +1 -15
  51. data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
  52. data/lib/sequel/adapters/jdbc/postgresql.rb +2 -31
  53. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
  54. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
  55. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
  56. data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
  57. data/lib/sequel/adapters/mock.rb +4 -30
  58. data/lib/sequel/adapters/mysql.rb +7 -44
  59. data/lib/sequel/adapters/mysql2.rb +5 -23
  60. data/lib/sequel/adapters/odbc.rb +0 -19
  61. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  62. data/lib/sequel/adapters/odbc/mssql.rb +4 -12
  63. data/lib/sequel/adapters/odbc/oracle.rb +1 -1
  64. data/lib/sequel/adapters/oracle.rb +7 -13
  65. data/lib/sequel/adapters/postgres.rb +13 -57
  66. data/lib/sequel/adapters/postgresql.rb +1 -1
  67. data/lib/sequel/adapters/shared/access.rb +11 -51
  68. data/lib/sequel/adapters/shared/db2.rb +3 -61
  69. data/lib/sequel/adapters/shared/mssql.rb +21 -157
  70. data/lib/sequel/adapters/shared/mysql.rb +23 -224
  71. data/lib/sequel/adapters/shared/oracle.rb +13 -41
  72. data/lib/sequel/adapters/shared/postgres.rb +44 -259
  73. data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
  74. data/lib/sequel/adapters/shared/sqlite.rb +12 -101
  75. data/lib/sequel/adapters/sqlanywhere.rb +4 -23
  76. data/lib/sequel/adapters/sqlite.rb +2 -19
  77. data/lib/sequel/adapters/tinytds.rb +5 -15
  78. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  79. data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -4
  80. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
  81. data/lib/sequel/adapters/utils/replace.rb +0 -5
  82. data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
  83. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
  84. data/lib/sequel/ast_transformer.rb +3 -94
  85. data/lib/sequel/connection_pool.rb +26 -28
  86. data/lib/sequel/connection_pool/sharded_single.rb +1 -4
  87. data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
  88. data/lib/sequel/connection_pool/single.rb +0 -2
  89. data/lib/sequel/connection_pool/threaded.rb +94 -110
  90. data/lib/sequel/core.rb +42 -101
  91. data/lib/sequel/database.rb +12 -2
  92. data/lib/sequel/database/connecting.rb +23 -60
  93. data/lib/sequel/database/dataset.rb +6 -9
  94. data/lib/sequel/database/dataset_defaults.rb +4 -48
  95. data/lib/sequel/database/features.rb +5 -4
  96. data/lib/sequel/database/logging.rb +2 -9
  97. data/lib/sequel/database/misc.rb +23 -55
  98. data/lib/sequel/database/query.rb +8 -13
  99. data/lib/sequel/database/schema_generator.rb +89 -64
  100. data/lib/sequel/database/schema_methods.rb +61 -79
  101. data/lib/sequel/database/transactions.rb +4 -24
  102. data/lib/sequel/dataset.rb +18 -10
  103. data/lib/sequel/dataset/actions.rb +53 -107
  104. data/lib/sequel/dataset/dataset_module.rb +3 -15
  105. data/lib/sequel/dataset/features.rb +30 -30
  106. data/lib/sequel/dataset/graph.rb +40 -49
  107. data/lib/sequel/dataset/misc.rb +12 -37
  108. data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
  109. data/lib/sequel/dataset/prepared_statements.rb +23 -51
  110. data/lib/sequel/dataset/query.rb +71 -155
  111. data/lib/sequel/dataset/sql.rb +30 -225
  112. data/lib/sequel/deprecated.rb +18 -27
  113. data/lib/sequel/exceptions.rb +1 -17
  114. data/lib/sequel/extensions/_model_pg_row.rb +0 -7
  115. data/lib/sequel/extensions/_pretty_table.rb +1 -3
  116. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  117. data/lib/sequel/extensions/connection_expiration.rb +1 -1
  118. data/lib/sequel/extensions/connection_validator.rb +1 -1
  119. data/lib/sequel/extensions/constraint_validations.rb +11 -11
  120. data/lib/sequel/extensions/core_extensions.rb +39 -49
  121. data/lib/sequel/extensions/core_refinements.rb +39 -45
  122. data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
  123. data/lib/sequel/extensions/date_arithmetic.rb +7 -7
  124. data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
  125. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  126. data/lib/sequel/extensions/eval_inspect.rb +4 -11
  127. data/lib/sequel/extensions/freeze_datasets.rb +1 -69
  128. data/lib/sequel/extensions/from_block.rb +1 -35
  129. data/lib/sequel/extensions/graph_each.rb +2 -2
  130. data/lib/sequel/extensions/identifier_mangling.rb +9 -19
  131. data/lib/sequel/extensions/implicit_subquery.rb +2 -2
  132. data/lib/sequel/extensions/inflector.rb +4 -4
  133. data/lib/sequel/extensions/migration.rb +23 -40
  134. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
  135. data/lib/sequel/extensions/null_dataset.rb +2 -8
  136. data/lib/sequel/extensions/pagination.rb +1 -17
  137. data/lib/sequel/extensions/pg_array.rb +20 -189
  138. data/lib/sequel/extensions/pg_hstore.rb +11 -50
  139. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
  140. data/lib/sequel/extensions/pg_inet.rb +2 -15
  141. data/lib/sequel/extensions/pg_interval.rb +1 -20
  142. data/lib/sequel/extensions/pg_json.rb +7 -27
  143. data/lib/sequel/extensions/pg_loose_count.rb +1 -1
  144. data/lib/sequel/extensions/pg_range.rb +6 -121
  145. data/lib/sequel/extensions/pg_range_ops.rb +1 -3
  146. data/lib/sequel/extensions/pg_row.rb +5 -77
  147. data/lib/sequel/extensions/pg_row_ops.rb +2 -13
  148. data/lib/sequel/extensions/query.rb +3 -4
  149. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  150. data/lib/sequel/extensions/schema_dumper.rb +13 -13
  151. data/lib/sequel/extensions/select_remove.rb +3 -3
  152. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  153. data/lib/sequel/extensions/sql_comments.rb +2 -2
  154. data/lib/sequel/extensions/string_agg.rb +11 -8
  155. data/lib/sequel/extensions/symbol_aref.rb +6 -20
  156. data/lib/sequel/model.rb +27 -62
  157. data/lib/sequel/model/associations.rb +128 -131
  158. data/lib/sequel/model/base.rb +171 -711
  159. data/lib/sequel/model/default_inflections.rb +1 -1
  160. data/lib/sequel/model/errors.rb +0 -3
  161. data/lib/sequel/model/exceptions.rb +2 -6
  162. data/lib/sequel/model/inflections.rb +1 -26
  163. data/lib/sequel/model/plugins.rb +1 -0
  164. data/lib/sequel/plugins/active_model.rb +2 -5
  165. data/lib/sequel/plugins/association_dependencies.rb +15 -15
  166. data/lib/sequel/plugins/association_pks.rb +14 -28
  167. data/lib/sequel/plugins/association_proxies.rb +6 -7
  168. data/lib/sequel/plugins/auto_validations.rb +4 -4
  169. data/lib/sequel/plugins/before_after_save.rb +0 -43
  170. data/lib/sequel/plugins/blacklist_security.rb +9 -8
  171. data/lib/sequel/plugins/boolean_readers.rb +3 -3
  172. data/lib/sequel/plugins/boolean_subsets.rb +2 -2
  173. data/lib/sequel/plugins/caching.rb +5 -5
  174. data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
  175. data/lib/sequel/plugins/column_conflicts.rb +2 -2
  176. data/lib/sequel/plugins/column_select.rb +2 -2
  177. data/lib/sequel/plugins/composition.rb +15 -24
  178. data/lib/sequel/plugins/constraint_validations.rb +4 -3
  179. data/lib/sequel/plugins/csv_serializer.rb +13 -20
  180. data/lib/sequel/plugins/dataset_associations.rb +2 -2
  181. data/lib/sequel/plugins/def_dataset_method.rb +5 -5
  182. data/lib/sequel/plugins/defaults_setter.rb +1 -1
  183. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  184. data/lib/sequel/plugins/finder.rb +16 -10
  185. data/lib/sequel/plugins/force_encoding.rb +1 -7
  186. data/lib/sequel/plugins/hook_class_methods.rb +4 -106
  187. data/lib/sequel/plugins/input_transformer.rb +10 -11
  188. data/lib/sequel/plugins/insert_returning_select.rb +1 -9
  189. data/lib/sequel/plugins/instance_filters.rb +5 -5
  190. data/lib/sequel/plugins/instance_hooks.rb +7 -52
  191. data/lib/sequel/plugins/inverted_subsets.rb +3 -1
  192. data/lib/sequel/plugins/json_serializer.rb +19 -19
  193. data/lib/sequel/plugins/lazy_attributes.rb +1 -10
  194. data/lib/sequel/plugins/list.rb +6 -6
  195. data/lib/sequel/plugins/many_through_many.rb +11 -8
  196. data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
  197. data/lib/sequel/plugins/nested_attributes.rb +18 -31
  198. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  199. data/lib/sequel/plugins/pg_array_associations.rb +8 -2
  200. data/lib/sequel/plugins/pg_row.rb +2 -11
  201. data/lib/sequel/plugins/prepared_statements.rb +13 -66
  202. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
  203. data/lib/sequel/plugins/rcte_tree.rb +7 -7
  204. data/lib/sequel/plugins/serialization.rb +15 -33
  205. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  206. data/lib/sequel/plugins/sharding.rb +2 -8
  207. data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
  208. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  209. data/lib/sequel/plugins/static_cache.rb +8 -9
  210. data/lib/sequel/plugins/string_stripper.rb +3 -3
  211. data/lib/sequel/plugins/subclasses.rb +1 -1
  212. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  213. data/lib/sequel/plugins/table_select.rb +2 -2
  214. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  215. data/lib/sequel/plugins/timestamps.rb +6 -7
  216. data/lib/sequel/plugins/touch.rb +4 -8
  217. data/lib/sequel/plugins/tree.rb +3 -3
  218. data/lib/sequel/plugins/typecast_on_load.rb +2 -2
  219. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  220. data/lib/sequel/plugins/update_or_create.rb +3 -3
  221. data/lib/sequel/plugins/update_refresh.rb +3 -3
  222. data/lib/sequel/plugins/uuid.rb +7 -11
  223. data/lib/sequel/plugins/validation_class_methods.rb +10 -9
  224. data/lib/sequel/plugins/validation_contexts.rb +4 -4
  225. data/lib/sequel/plugins/validation_helpers.rb +26 -25
  226. data/lib/sequel/plugins/whitelist_security.rb +13 -9
  227. data/lib/sequel/plugins/xml_serializer.rb +24 -25
  228. data/lib/sequel/sql.rb +145 -276
  229. data/lib/sequel/timezones.rb +8 -22
  230. data/lib/sequel/version.rb +2 -2
  231. data/spec/adapter_spec.rb +1 -1
  232. data/spec/adapters/db2_spec.rb +2 -103
  233. data/spec/adapters/mssql_spec.rb +89 -68
  234. data/spec/adapters/mysql_spec.rb +101 -480
  235. data/spec/adapters/oracle_spec.rb +1 -9
  236. data/spec/adapters/postgres_spec.rb +312 -565
  237. data/spec/adapters/spec_helper.rb +12 -31
  238. data/spec/adapters/sqlanywhere_spec.rb +2 -77
  239. data/spec/adapters/sqlite_spec.rb +8 -146
  240. data/spec/bin_spec.rb +11 -16
  241. data/spec/core/connection_pool_spec.rb +173 -74
  242. data/spec/core/database_spec.rb +64 -244
  243. data/spec/core/dataset_spec.rb +81 -415
  244. data/spec/core/deprecated_spec.rb +3 -3
  245. data/spec/core/expression_filters_spec.rb +37 -144
  246. data/spec/core/mock_adapter_spec.rb +176 -4
  247. data/spec/core/object_graph_spec.rb +11 -60
  248. data/spec/core/placeholder_literalizer_spec.rb +1 -14
  249. data/spec/core/schema_generator_spec.rb +51 -40
  250. data/spec/core/schema_spec.rb +74 -77
  251. data/spec/core/spec_helper.rb +6 -24
  252. data/spec/core/version_spec.rb +1 -1
  253. data/spec/core_extensions_spec.rb +7 -83
  254. data/spec/core_model_spec.rb +2 -2
  255. data/spec/deprecation_helper.rb +2 -14
  256. data/spec/extensions/accessed_columns_spec.rb +1 -1
  257. data/spec/extensions/active_model_spec.rb +3 -3
  258. data/spec/extensions/after_initialize_spec.rb +1 -1
  259. data/spec/extensions/arbitrary_servers_spec.rb +2 -2
  260. data/spec/extensions/association_dependencies_spec.rb +1 -1
  261. data/spec/extensions/association_pks_spec.rb +4 -59
  262. data/spec/extensions/association_proxies_spec.rb +1 -1
  263. data/spec/extensions/auto_literal_strings_spec.rb +1 -12
  264. data/spec/extensions/auto_validations_spec.rb +1 -1
  265. data/spec/extensions/blacklist_security_spec.rb +1 -1
  266. data/spec/extensions/blank_spec.rb +1 -1
  267. data/spec/extensions/boolean_readers_spec.rb +1 -1
  268. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  269. data/spec/extensions/caching_spec.rb +1 -1
  270. data/spec/extensions/class_table_inheritance_spec.rb +35 -1086
  271. data/spec/extensions/column_conflicts_spec.rb +1 -1
  272. data/spec/extensions/column_select_spec.rb +4 -4
  273. data/spec/extensions/columns_introspection_spec.rb +1 -1
  274. data/spec/extensions/columns_updated_spec.rb +1 -1
  275. data/spec/extensions/composition_spec.rb +1 -7
  276. data/spec/extensions/connection_expiration_spec.rb +3 -3
  277. data/spec/extensions/connection_validator_spec.rb +3 -3
  278. data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
  279. data/spec/extensions/constraint_validations_spec.rb +1 -1
  280. data/spec/extensions/core_refinements_spec.rb +1 -3
  281. data/spec/extensions/csv_serializer_spec.rb +4 -9
  282. data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
  283. data/spec/extensions/dataset_associations_spec.rb +2 -1
  284. data/spec/extensions/dataset_source_alias_spec.rb +1 -1
  285. data/spec/extensions/date_arithmetic_spec.rb +3 -3
  286. data/spec/extensions/def_dataset_method_spec.rb +1 -1
  287. data/spec/extensions/defaults_setter_spec.rb +2 -2
  288. data/spec/extensions/delay_add_association_spec.rb +8 -9
  289. data/spec/extensions/dirty_spec.rb +1 -1
  290. data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
  291. data/spec/extensions/eager_each_spec.rb +2 -2
  292. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  293. data/spec/extensions/error_splitter_spec.rb +1 -1
  294. data/spec/extensions/error_sql_spec.rb +1 -1
  295. data/spec/extensions/eval_inspect_spec.rb +1 -1
  296. data/spec/extensions/finder_spec.rb +1 -1
  297. data/spec/extensions/force_encoding_spec.rb +2 -5
  298. data/spec/extensions/freeze_datasets_spec.rb +1 -1
  299. data/spec/extensions/graph_each_spec.rb +5 -5
  300. data/spec/extensions/hook_class_methods_spec.rb +1 -194
  301. data/spec/extensions/identifier_mangling_spec.rb +17 -170
  302. data/spec/extensions/implicit_subquery_spec.rb +1 -5
  303. data/spec/extensions/inflector_spec.rb +1 -1
  304. data/spec/extensions/input_transformer_spec.rb +7 -2
  305. data/spec/extensions/insert_returning_select_spec.rb +1 -1
  306. data/spec/extensions/instance_filters_spec.rb +1 -1
  307. data/spec/extensions/instance_hooks_spec.rb +1 -95
  308. data/spec/extensions/inverted_subsets_spec.rb +1 -1
  309. data/spec/extensions/json_serializer_spec.rb +1 -1
  310. data/spec/extensions/lazy_attributes_spec.rb +1 -7
  311. data/spec/extensions/list_spec.rb +1 -1
  312. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  313. data/spec/extensions/many_through_many_spec.rb +1 -1
  314. data/spec/extensions/migration_spec.rb +2 -2
  315. data/spec/extensions/modification_detection_spec.rb +1 -1
  316. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  317. data/spec/extensions/named_timezones_spec.rb +3 -3
  318. data/spec/extensions/nested_attributes_spec.rb +1 -29
  319. data/spec/extensions/null_dataset_spec.rb +1 -11
  320. data/spec/extensions/optimistic_locking_spec.rb +1 -1
  321. data/spec/extensions/pagination_spec.rb +1 -1
  322. data/spec/extensions/pg_array_associations_spec.rb +4 -1
  323. data/spec/extensions/pg_array_ops_spec.rb +1 -1
  324. data/spec/extensions/pg_array_spec.rb +3 -48
  325. data/spec/extensions/pg_enum_spec.rb +1 -1
  326. data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
  327. data/spec/extensions/pg_hstore_spec.rb +23 -32
  328. data/spec/extensions/pg_inet_ops_spec.rb +1 -1
  329. data/spec/extensions/pg_inet_spec.rb +1 -14
  330. data/spec/extensions/pg_interval_spec.rb +3 -13
  331. data/spec/extensions/pg_json_ops_spec.rb +1 -1
  332. data/spec/extensions/pg_json_spec.rb +1 -13
  333. data/spec/extensions/pg_loose_count_spec.rb +1 -1
  334. data/spec/extensions/pg_range_ops_spec.rb +1 -1
  335. data/spec/extensions/pg_range_spec.rb +3 -88
  336. data/spec/extensions/pg_row_ops_spec.rb +1 -1
  337. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  338. data/spec/extensions/pg_row_spec.rb +1 -44
  339. data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
  340. data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
  341. data/spec/extensions/prepared_statements_spec.rb +13 -48
  342. data/spec/extensions/pretty_table_spec.rb +1 -1
  343. data/spec/extensions/query_spec.rb +1 -12
  344. data/spec/extensions/rcte_tree_spec.rb +1 -1
  345. data/spec/extensions/round_timestamps_spec.rb +1 -5
  346. data/spec/extensions/s_spec.rb +1 -1
  347. data/spec/extensions/schema_caching_spec.rb +1 -1
  348. data/spec/extensions/schema_dumper_spec.rb +1 -1
  349. data/spec/extensions/select_remove_spec.rb +1 -1
  350. data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
  351. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  352. data/spec/extensions/serialization_spec.rb +2 -14
  353. data/spec/extensions/server_block_spec.rb +1 -1
  354. data/spec/extensions/server_logging_spec.rb +2 -2
  355. data/spec/extensions/sharding_spec.rb +1 -1
  356. data/spec/extensions/shared_caching_spec.rb +1 -28
  357. data/spec/extensions/single_table_inheritance_spec.rb +2 -5
  358. data/spec/extensions/singular_table_names_spec.rb +1 -1
  359. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  360. data/spec/extensions/spec_helper.rb +5 -27
  361. data/spec/extensions/split_array_nil_spec.rb +1 -1
  362. data/spec/extensions/split_values_spec.rb +1 -1
  363. data/spec/extensions/sql_comments_spec.rb +1 -1
  364. data/spec/extensions/sql_expr_spec.rb +1 -1
  365. data/spec/extensions/static_cache_spec.rb +1 -1
  366. data/spec/extensions/string_agg_spec.rb +2 -2
  367. data/spec/extensions/string_date_time_spec.rb +1 -1
  368. data/spec/extensions/string_stripper_spec.rb +1 -1
  369. data/spec/extensions/subclasses_spec.rb +1 -1
  370. data/spec/extensions/subset_conditions_spec.rb +1 -1
  371. data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
  372. data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
  373. data/spec/extensions/table_select_spec.rb +4 -4
  374. data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
  375. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  376. data/spec/extensions/timestamps_spec.rb +3 -3
  377. data/spec/extensions/to_dot_spec.rb +1 -1
  378. data/spec/extensions/touch_spec.rb +1 -1
  379. data/spec/extensions/tree_spec.rb +1 -1
  380. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  381. data/spec/extensions/unlimited_update_spec.rb +1 -1
  382. data/spec/extensions/update_or_create_spec.rb +1 -1
  383. data/spec/extensions/update_primary_key_spec.rb +4 -3
  384. data/spec/extensions/update_refresh_spec.rb +1 -1
  385. data/spec/extensions/uuid_spec.rb +10 -12
  386. data/spec/extensions/validate_associated_spec.rb +1 -1
  387. data/spec/extensions/validation_class_methods_spec.rb +3 -3
  388. data/spec/extensions/validation_contexts_spec.rb +1 -1
  389. data/spec/extensions/validation_helpers_spec.rb +10 -44
  390. data/spec/extensions/whitelist_security_spec.rb +5 -5
  391. data/spec/extensions/xml_serializer_spec.rb +3 -3
  392. data/spec/guards_helper.rb +2 -1
  393. data/spec/integration/associations_test.rb +1 -23
  394. data/spec/integration/database_test.rb +7 -7
  395. data/spec/integration/dataset_test.rb +5 -47
  396. data/spec/integration/eager_loader_test.rb +1 -1
  397. data/spec/integration/migrator_test.rb +1 -1
  398. data/spec/integration/model_test.rb +4 -82
  399. data/spec/integration/plugin_test.rb +6 -22
  400. data/spec/integration/prepared_statement_test.rb +8 -88
  401. data/spec/integration/schema_test.rb +6 -6
  402. data/spec/integration/spec_helper.rb +13 -21
  403. data/spec/integration/timezone_test.rb +5 -5
  404. data/spec/integration/transaction_test.rb +3 -55
  405. data/spec/integration/type_test.rb +9 -9
  406. data/spec/model/association_reflection_spec.rb +24 -9
  407. data/spec/model/associations_spec.rb +124 -303
  408. data/spec/model/base_spec.rb +18 -137
  409. data/spec/model/class_dataset_methods_spec.rb +2 -20
  410. data/spec/model/dataset_methods_spec.rb +1 -20
  411. data/spec/model/eager_loading_spec.rb +17 -11
  412. data/spec/model/hooks_spec.rb +5 -300
  413. data/spec/model/inflector_spec.rb +1 -1
  414. data/spec/model/model_spec.rb +15 -320
  415. data/spec/model/plugins_spec.rb +2 -16
  416. data/spec/model/record_spec.rb +29 -121
  417. data/spec/model/spec_helper.rb +5 -15
  418. data/spec/model/validations_spec.rb +1 -1
  419. data/spec/sequel_warning.rb +1 -12
  420. metadata +8 -64
  421. data/doc/active_record.rdoc +0 -927
  422. data/lib/sequel/adapters/cubrid.rb +0 -160
  423. data/lib/sequel/adapters/do.rb +0 -166
  424. data/lib/sequel/adapters/do/mysql.rb +0 -69
  425. data/lib/sequel/adapters/do/postgres.rb +0 -46
  426. data/lib/sequel/adapters/do/sqlite3.rb +0 -41
  427. data/lib/sequel/adapters/jdbc/as400.rb +0 -92
  428. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
  429. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
  430. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
  431. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
  432. data/lib/sequel/adapters/odbc/progress.rb +0 -12
  433. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  434. data/lib/sequel/adapters/shared/firebird.rb +0 -261
  435. data/lib/sequel/adapters/shared/informix.rb +0 -63
  436. data/lib/sequel/adapters/shared/progress.rb +0 -40
  437. data/lib/sequel/adapters/swift.rb +0 -169
  438. data/lib/sequel/adapters/swift/mysql.rb +0 -50
  439. data/lib/sequel/adapters/swift/postgres.rb +0 -49
  440. data/lib/sequel/adapters/swift/sqlite.rb +0 -48
  441. data/lib/sequel/adapters/utils/pg_types.rb +0 -4
  442. data/lib/sequel/dataset/mutation.rb +0 -98
  443. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
  444. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
  445. data/lib/sequel/extensions/filter_having.rb +0 -65
  446. data/lib/sequel/extensions/hash_aliases.rb +0 -51
  447. data/lib/sequel/extensions/meta_def.rb +0 -37
  448. data/lib/sequel/extensions/query_literals.rb +0 -86
  449. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
  450. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
  451. data/lib/sequel/extensions/set_overrides.rb +0 -82
  452. data/lib/sequel/no_core_ext.rb +0 -4
  453. data/lib/sequel/plugins/association_autoreloading.rb +0 -11
  454. data/lib/sequel/plugins/identifier_columns.rb +0 -49
  455. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
  456. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
  457. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
  458. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
  459. data/lib/sequel/plugins/schema.rb +0 -84
  460. data/lib/sequel/plugins/scissors.rb +0 -37
  461. data/spec/core/dataset_mutation_spec.rb +0 -253
  462. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
  463. data/spec/extensions/before_after_save_spec.rb +0 -40
  464. data/spec/extensions/filter_having_spec.rb +0 -42
  465. data/spec/extensions/from_block_spec.rb +0 -21
  466. data/spec/extensions/hash_aliases_spec.rb +0 -26
  467. data/spec/extensions/identifier_columns_spec.rb +0 -19
  468. data/spec/extensions/meta_def_spec.rb +0 -35
  469. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
  470. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
  471. data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
  472. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
  473. data/spec/extensions/query_literals_spec.rb +0 -185
  474. data/spec/extensions/schema_spec.rb +0 -123
  475. data/spec/extensions/scissors_spec.rb +0 -27
  476. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
  477. 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,38 +137,11 @@ 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'
199
- end
200
-
201
145
  it "should support ORDER clause in UPDATE statements" do
202
146
  @d.order(:name).update_sql(:value => 1).must_equal 'UPDATE `items` SET `value` = 1 ORDER BY `name`'
203
147
  end
@@ -217,7 +161,7 @@ describe "A MySQL dataset" do
217
161
  it "should raise error for updating a dataset with an offset" do
218
162
  proc{@d.offset(1).update(:value => 4)}.must_raise Sequel::InvalidOperation
219
163
  proc{@d.order(:value).offset(1).update(:value => 4)}.must_raise Sequel::InvalidOperation
220
- end if false # SEQUEL5
164
+ end
221
165
 
222
166
  it "should support regexps" do
223
167
  @d.insert(:name => 'abc', :value => 1)
@@ -250,22 +194,6 @@ describe "A MySQL dataset" do
250
194
  end
251
195
  end
252
196
 
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
197
  describe "Dataset#distinct" do
270
198
  before do
271
199
  @db = DB
@@ -290,59 +218,27 @@ describe "Dataset#distinct" do
290
218
  end
291
219
 
292
220
  describe "MySQL join expressions" do
293
- before do
221
+ before(:all) do
294
222
  @ds = DB[:nodes]
223
+ DB.create_table!(:nodes){Integer :id; Integer :y}
224
+ DB.create_table!(:n1){Integer :id}
225
+ DB.create_table!(:n2){Integer :y}
226
+ @ds.insert(:id=>1, :y=>2)
227
+ DB[:n1].insert(1)
228
+ DB[:n2].insert(2)
295
229
  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`)'
230
+ after(:all) do
231
+ DB.drop_table?(:n2, :n1, :nodes)
323
232
  end
233
+
324
234
  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`'
235
+ @ds.join_table(:straight, :n1).all.must_equal [{:id=>1, :y=>2}]
326
236
  end
327
237
  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`)'
238
+ @ds.join_table(:natural_left_outer, [:n1, :n2]).all.must_equal [{:id=>1, :y=>2}]
329
239
  end
330
240
  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`"
241
+ @ds.join_table(:straight, [:n1, :n2]).all.must_equal [{:id=>1, :y=>2}]
346
242
  end
347
243
  end
348
244
 
@@ -377,14 +273,6 @@ describe "A MySQL database" do
377
273
  @db.server_version.must_be :>=, 40000
378
274
  end
379
275
 
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
276
  it "should support for_share" do
389
277
  @db[:test2].delete
390
278
  @db.transaction{@db[:test2].for_share.all.must_equal []}
@@ -440,54 +328,6 @@ describe "A MySQL database" do
440
328
  end
441
329
  end
442
330
 
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
331
  describe "A MySQL database with table options" do
492
332
  before do
493
333
  @options = {:engine=>'MyISAM', :charset=>'latin1', :collate => 'latin1_swedish_ci'}
@@ -497,8 +337,6 @@ describe "A MySQL database with table options" do
497
337
  @db.default_charset = 'utf8'
498
338
  @db.default_collate = 'utf8_general_ci'
499
339
  @db.drop_table?(:items)
500
-
501
- DB.sqls.clear
502
340
  end
503
341
  after do
504
342
  @db.drop_table?(:items)
@@ -510,23 +348,23 @@ describe "A MySQL database with table options" do
510
348
 
511
349
  it "should allow to pass custom options (engine, charset, collate) for table creation" do
512
350
  @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"]
351
+ @db.transaction(:rollback=>:always) do
352
+ @db[:items].insert(:size=>1)
515
353
  end
354
+ @db[:items].all.must_equal [{:size=>1, :name=>nil}]
516
355
  end
517
356
 
518
357
  it "should use default options if specified (engine, charset, collate) for table creation" do
519
358
  @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"]
359
+ @db.transaction(:rollback=>:always) do
360
+ @db[:items].insert(:size=>1)
522
361
  end
362
+ @db[:items].all.must_equal []
523
363
  end
524
364
 
525
365
  it "should not use default if option has a nil value" do
366
+ @db.default_engine = 'non_existent_engine'
526
367
  @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
368
  end
531
369
  end
532
370
 
@@ -534,7 +372,6 @@ describe "A MySQL database" do
534
372
  before do
535
373
  @db = DB
536
374
  @db.drop_table?(:items)
537
- DB.sqls.clear
538
375
  end
539
376
  after do
540
377
  @db.drop_table?(:items, :users)
@@ -542,45 +379,45 @@ describe "A MySQL database" do
542
379
 
543
380
  it "should support defaults for boolean columns" do
544
381
  @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
382
+ @db[:items].insert
383
+ @db[:items].get([:active1, :active2]).must_equal [true, false]
384
+ @db[:items].get([Sequel.cast(:active1, Integer).as(:v1), Sequel.cast(:active2, Integer).as(:v2)]).must_equal [1, 0]
548
385
  end
549
386
 
550
- it "should correctly format CREATE TABLE statements with foreign keys" do
387
+ it "should correctly handle CREATE TABLE statements with foreign keys" do
551
388
  @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
389
+ @db[:items].insert(:id=>1, :p_id=>1)
390
+ @db[:items].insert(:id=>2, :p_id=>1)
391
+ @db[:items].where(:id=>1).delete
392
+ @db[:items].count.must_equal 0
555
393
  end
556
394
 
557
- it "should correctly format CREATE TABLE statements with foreign keys, when :key != the default (:id)" do
395
+ it "should correctly handle CREATE TABLE statements with foreign keys, when :key != the default (:id)" do
558
396
  @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
397
+ @db[:items].insert(:id=>1, :other_than_id=>2, :p_id=>2)
398
+ @db[:items].insert(:id=>2, :other_than_id=>3, :p_id=>2)
399
+ @db[:items].where(:id=>1).delete
400
+ @db[:items].count.must_equal 0
562
401
  end
563
402
 
564
- it "should correctly format ALTER TABLE statements with foreign keys" do
403
+ it "should correctly handle ALTER TABLE statements with foreign keys" do
565
404
  @db.create_table(:items){Integer :id}
566
405
  @db.create_table(:users){primary_key :id}
567
406
  @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
407
+ @db[:users].insert(:id=>1)
408
+ @db[:items].insert(:id=>2, :p_id=>1)
409
+ @db[:users].where(:id=>1).delete
410
+ @db[:items].count.must_equal 0
573
411
  end
574
412
 
575
413
  it "should correctly format ALTER TABLE statements with named foreign keys" do
576
414
  @db.create_table(:items){Integer :id}
577
415
  @db.create_table(:users){primary_key :id}
578
416
  @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
417
+ @db[:users].insert(:id=>1)
418
+ @db[:items].insert(:id=>2, :p_id=>1)
419
+ @db[:users].where(:id=>1).delete
420
+ @db[:items].count.must_equal 0
584
421
  end
585
422
 
586
423
  it "should correctly handle add_column :after option" do
@@ -604,9 +441,6 @@ describe "A MySQL database" do
604
441
  it "should have rename_column support keep existing options" do
605
442
  @db.create_table(:items){String :id, :null=>false, :default=>'blah'}
606
443
  @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
444
  @db[:items].insert
611
445
  @db[:items].all.must_equal [{:nid=>'blah'}]
612
446
  proc{@db[:items].insert(:nid=>nil)}.must_raise(Sequel::NotNullConstraintViolation)
@@ -615,9 +449,6 @@ describe "A MySQL database" do
615
449
  it "should have set_column_type support keep existing options" do
616
450
  @db.create_table(:items){Integer :id, :null=>false, :default=>5}
617
451
  @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
452
  @db[:items].insert
622
453
  @db[:items].all.must_equal [{:id=>5}]
623
454
  proc{@db[:items].insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation)
@@ -629,17 +460,12 @@ describe "A MySQL database" do
629
460
  it "should have set_column_type pass through options" do
630
461
  @db.create_table(:items){integer :id; enum :list, :elements=>%w[one]}
631
462
  @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
463
+ @db.schema(:items)[1][1][:db_type].must_equal "enum('two')"
635
464
  end
636
465
 
637
466
  it "should have set_column_default support keep existing options" do
638
467
  @db.create_table(:items){Integer :id, :null=>false, :default=>5}
639
468
  @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
469
  @db[:items].insert
644
470
  @db[:items].all.must_equal [{:id=>6}]
645
471
  proc{@db[:items].insert(:id=>nil)}.must_raise(Sequel::NotNullConstraintViolation)
@@ -648,9 +474,6 @@ describe "A MySQL database" do
648
474
  it "should have set_column_allow_null support keep existing options" do
649
475
  @db.create_table(:items){Integer :id, :null=>false, :default=>5}
650
476
  @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
477
  @db[:items].insert
655
478
  @db[:items].all.must_equal [{:id=>5}]
656
479
  @db[:items].insert(:id=>nil)
@@ -670,21 +493,20 @@ describe "A MySQL database" do
670
493
  end
671
494
 
672
495
  # 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
496
+ if DB.adapter_scheme == :mysql && %w'localhost 127.0.0.1 ::1'.include?(URI.parse(DB.uri).host)
674
497
  describe "A MySQL database" do
498
+ socket_file = defined?(MYSQL_SOCKET_FILE) ? MYSQL_SOCKET_FILE : '/tmp/mysql.sock'
499
+
675
500
  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
501
+ Sequel.mysql(DB.opts[:database], :host => 'localhost', :user => DB.opts[:user], :password => DB.opts[:password], :socket => socket_file, :keep_reference=>false)
678
502
  end
679
503
 
680
504
  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
505
+ Sequel.mysql(DB.opts[:database], :user => DB.opts[:user], :password => DB.opts[:password], :socket => socket_file, :keep_reference=>false)
683
506
  end
684
507
 
685
508
  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
509
+ proc{Sequel.mysql(DB.opts[:database], :user => DB.opts[:user], :password => DB.opts[:password], :socket =>'blah', :keep_reference=>false)}.must_raise Sequel::DatabaseConnectionError
688
510
  end
689
511
  end
690
512
  end
@@ -783,7 +605,6 @@ describe "A MySQL database" do
783
605
  before do
784
606
  @db = DB
785
607
  @db.drop_table?(:posts)
786
- @db.sqls.clear
787
608
  end
788
609
  after do
789
610
  @db.drop_table?(:posts)
@@ -791,28 +612,14 @@ describe "A MySQL database" do
791
612
 
792
613
  it "should support fulltext indexes and full_text_search" do
793
614
  @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
615
 
802
616
  @db[:posts].insert(:title=>'ruby rails', :body=>'y')
803
617
  @db[:posts].insert(:title=>'sequel', :body=>'ruby')
804
618
  @db[:posts].insert(:title=>'ruby scooby', :body=>'x')
805
- @db.sqls.clear
806
619
 
807
620
  @db[:posts].full_text_search(:title, 'rails').all.must_equal [{:title=>'ruby rails', :body=>'y'}]
808
621
  @db[:posts].full_text_search([:title, :body], ['sequel', 'ruby']).all.must_equal [{:title=>'sequel', :body=>'ruby'}]
809
622
  @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
623
 
817
624
  @db[:posts].full_text_search(:title, :$n).call(:select, :n=>'rails').must_equal [{:title=>'ruby rails', :body=>'y'}]
818
625
  @db[:posts].full_text_search(:title, :$n).prepare(:select, :fts_select).call(:n=>'rails').must_equal [{:title=>'ruby rails', :body=>'y'}]
@@ -820,32 +627,18 @@ describe "A MySQL database" do
820
627
 
821
628
  it "should support spatial indexes" do
822
629
  @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
630
  end
830
631
 
831
632
  it "should support indexes with index type" do
832
633
  @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
634
+ @db[:posts].insert(1)
635
+ @db[:posts].where(:id=>1).count.must_equal 1
839
636
  end
840
637
 
841
638
  it "should support unique indexes with index type" do
842
639
  @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
640
+ @db[:posts].insert(1)
641
+ proc{@db[:posts].insert(1)}.must_raise Sequel::UniqueConstraintViolation
849
642
  end
850
643
 
851
644
  it "should not dump partial indexes" do
@@ -863,9 +656,8 @@ end
863
656
 
864
657
  describe "MySQL::Dataset#insert and related methods" do
865
658
  before do
866
- DB.create_table(:items){String :name; Integer :value}
867
- @d = DB[:items]
868
- DB.sqls.clear
659
+ DB.create_table(:items){String :name, :unique=>true; Integer :value}
660
+ @d = DB[:items].order(:name)
869
661
  end
870
662
  after do
871
663
  DB.drop_table?(:items)
@@ -873,245 +665,93 @@ describe "MySQL::Dataset#insert and related methods" do
873
665
 
874
666
  it "#insert should insert record with default values when no arguments given" do
875
667
  @d.insert
876
- check_sqls do
877
- DB.sqls.must_equal ["INSERT INTO `items` () VALUES ()"]
878
- end
879
668
  @d.all.must_equal [{:name => nil, :value => nil}]
880
669
  end
881
670
 
882
671
  it "#insert should insert record with default values when empty hash given" do
883
672
  @d.insert({})
884
- check_sqls do
885
- DB.sqls.must_equal ["INSERT INTO `items` () VALUES ()"]
886
- end
887
673
  @d.all.must_equal [{:name => nil, :value => nil}]
888
674
  end
889
675
 
890
676
  it "#insert should insert record with default values when empty array given" do
891
677
  @d.insert []
892
- check_sqls do
893
- DB.sqls.must_equal ["INSERT INTO `items` () VALUES ()"]
894
- end
895
678
  @d.all.must_equal [{:name => nil, :value => nil}]
896
679
  end
897
680
 
898
681
  it "#on_duplicate_key_update should work with regular inserts" do
899
682
  DB.add_index :items, :name, :unique=>true
900
- DB.sqls.clear
901
683
  @d.insert(:name => 'abc', :value => 1)
902
684
  @d.on_duplicate_key_update(:name, :value => 6).insert(:name => 'abc', :value => 1)
903
685
  @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
686
  @d.all.must_equal [{:name => 'abc', :value => 6}, {:name => 'def', :value => 2}]
913
687
  end
914
688
 
915
- it "#multi_replace should insert multiple records in a single statement" do
689
+ it "#multi_replace should replace multiple records in a single statement" do
916
690
  @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
- ]
691
+ @d.all.must_equal [ {:name => 'abc', :value => nil}, {:name => 'def', :value => nil} ]
692
+ @d.multi_replace([{:name => 'abc', :value=>1}, {:name => 'ghi', :value=>3}])
693
+ @d.all.must_equal [ {:name => 'abc', :value => 1}, {:name => 'def', :value => nil}, {:name => 'ghi', :value=>3} ]
929
694
  end
930
695
 
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
696
+ it "#multi_replace should support :commit_every option" do
697
+ @d.multi_replace([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}], :commit_every => 2)
698
+ @d.all.must_equal [ {:name => nil, :value => 1}, {:name => nil, :value => 2}, {:name => nil, :value => 3}, {:name => nil, :value => 4} ]
699
+ end
968
700
 
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
- ]
701
+ it "#multi_replace should support :slice option" do
702
+ @d.multi_replace([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}], :slice => 2)
703
+ @d.all.must_equal [ {:name => nil, :value => 1}, {:name => nil, :value => 2}, {:name => nil, :value => 3}, {:name => nil, :value => 4} ]
975
704
  end
976
705
 
977
706
  it "#multi_insert should insert multiple records in a single statement" do
978
707
  @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
- ]
708
+ @d.all.must_equal [ {:name => 'abc', :value => nil}, {:name => 'def', :value => nil} ]
991
709
  end
992
710
 
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
711
+ it "#multi_insert should support :commit_every option" do
712
+ @d.multi_insert([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}], :commit_every => 2)
713
+ @d.all.must_equal [ {:name => nil, :value => 1}, {:name => nil, :value => 2}, {:name => nil, :value => 3}, {:name => nil, :value => 4} ]
714
+ end
1030
715
 
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
- ]
716
+ it "#multi_insert should support :slice option" do
717
+ @d.multi_insert([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}], :slice => 2)
718
+ @d.all.must_equal [ {:name => nil, :value => 1}, {:name => nil, :value => 2}, {:name => nil, :value => 3}, {:name => nil, :value => 4} ]
1037
719
  end
1038
720
 
1039
721
  it "#import should support inserting using columns and values arrays" do
1040
722
  @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
- ]
723
+ @d.all.must_equal [ {:name => 'abc', :value => 1}, {:name => 'def', :value => 2} ]
1054
724
  end
1055
725
 
1056
- it "#insert_ignore should add the IGNORE keyword when inserting" do
726
+ it "#insert_ignore should ignore existing records when used with multi_insert" do
1057
727
  @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
- ]
728
+ @d.all.must_equal [ {:name => 'abc', :value => nil}, {:name => 'def', :value => nil} ]
729
+ @d.insert_ignore.multi_insert([{:name => 'abc', :value=>1}, {:name => 'ghi', :value=>3}])
730
+ @d.all.must_equal [ {:name => 'abc', :value => nil}, {:name => 'def', :value => nil}, {:name => 'ghi', :value=>3} ]
1070
731
  end
1071
732
 
1072
- it "#insert_ignore should add the IGNORE keyword for single inserts" do
733
+ it "#insert_ignore should ignore single records when used with insert" do
1073
734
  @d.insert_ignore.insert(:name => 'ghi')
1074
- check_sqls do
1075
- DB.sqls.must_equal ["INSERT IGNORE INTO `items` (`name`) VALUES ('ghi')"]
1076
- end
735
+ @d.all.must_equal [{:name => 'ghi', :value => nil}]
736
+ @d.insert_ignore.insert(:name => 'ghi', :value=>2)
1077
737
  @d.all.must_equal [{:name => 'ghi', :value => nil}]
1078
738
  end
1079
739
 
1080
- it "#on_duplicate_key_update should add the ON DUPLICATE KEY UPDATE and ALL columns when no args given" do
740
+ it "#on_duplicate_key_update should handle inserts with duplicate keys" do
1081
741
  @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
- ]
742
+ @d.all.must_equal [ {:name => 'abc', :value => 1}, {:name => 'def', :value => 2} ]
743
+ @d.on_duplicate_key_update.import([:name,:value], [['abc', 2], ['ghi',3]])
744
+ @d.all.must_equal [ {:name => 'abc', :value => 2}, {:name => 'def', :value => 2}, {:name => 'ghi', :value=>3} ]
1095
745
  end
1096
746
 
1097
747
  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
- ]
748
+ @d.on_duplicate_key_update(:value).import([:name,:value], [['abc', 1], ['def',2]])
749
+ @d.all.must_equal [ {:name => 'abc', :value => 1}, {:name => 'def', :value => 2} ]
750
+ @d.on_duplicate_key_update(:value).import([:name,:value], [['abc', 2], ['ghi',3]])
751
+ @d.all.must_equal [ {:name => 'abc', :value => 2}, {:name => 'def', :value => 2}, {:name => 'ghi', :value=>3} ]
752
+ @d.on_duplicate_key_update(:name).import([:name,:value], [['abc', 5], ['ghi',6]])
753
+ @d.all.must_equal [ {:name => 'abc', :value => 2}, {:name => 'def', :value => 2}, {:name => 'ghi', :value=>3} ]
1113
754
  end
1114
-
1115
755
  end
1116
756
 
1117
757
  describe "MySQL::Dataset#update and related methods" do
@@ -1127,11 +767,7 @@ describe "MySQL::Dataset#update and related methods" do
1127
767
  @d.insert(:name => 'cow', :value => 0)
1128
768
  @d.insert(:name => 'cat', :value => 1)
1129
769
  proc{@d.where(:value => 1).update(:name => 'cow')}.must_raise(Sequel::UniqueConstraintViolation)
1130
- DB.sqls.clear
1131
770
  @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
771
  @d.order(:name).all.must_equal [{:name => 'cat', :value => 1}, {:name => 'cow', :value => 0}]
1136
772
  end
1137
773
  end
@@ -1140,7 +776,6 @@ describe "MySQL::Dataset#replace" do
1140
776
  before do
1141
777
  DB.create_table(:items){Integer :id, :unique=>true; Integer :value}
1142
778
  @d = DB[:items]
1143
- DB.sqls.clear
1144
779
  end
1145
780
  after do
1146
781
  DB.drop_table?(:items)
@@ -1182,26 +817,13 @@ describe "MySQL::Dataset#calc_found_rows" do
1182
817
  DB.drop_table?(:items)
1183
818
  end
1184
819
 
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
820
  it "should count matching rows disregarding LIMIT clause" do
1191
821
  DB[:items].multi_insert([{:a => 1}, {:a => 1}, {:a => 2}])
1192
- DB.sqls.clear
1193
822
 
1194
823
  DB.synchronize do
1195
824
  DB[:items].calc_found_rows.filter(:a => 1).limit(1).all.must_equal [{:a => 1}]
1196
825
  DB.dataset.select(Sequel.function(:FOUND_ROWS).as(:rows)).all.must_equal [{:rows => 2 }]
1197
826
  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
827
  end
1206
828
  end
1207
829
 
@@ -1210,7 +832,6 @@ if DB.adapter_scheme == :mysql or DB.adapter_scheme == :jdbc or DB.adapter_schem
1210
832
  before do
1211
833
  DB.create_table(:items){Integer :id; Integer :value}
1212
834
  @d = DB[:items]
1213
- DB.sqls.clear
1214
835
  end
1215
836
  after do
1216
837
  DB.drop_table?(:items)