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,4 +1,4 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
1
+ require_relative "spec_helper"
2
2
 
3
3
  describe "Dataset" do
4
4
  before do
@@ -50,6 +50,21 @@ describe "Dataset#clone" do
50
50
  it "should create an exact copy of the dataset" do
51
51
  @dataset = @dataset.with_row_proc(Proc.new{|r| r})
52
52
  clone = @dataset.clone
53
+ @dataset.dup.must_be_same_as @dataset
54
+
55
+ if RUBY_VERSION >= '2.4'
56
+ clone.must_be_same_as @dataset
57
+ else
58
+ clone.object_id.wont_equal @dataset.object_id
59
+ clone.class.must_equal @dataset.class
60
+ clone.db.must_equal @dataset.db
61
+ clone.opts.must_equal @dataset.opts
62
+ end
63
+ end
64
+
65
+ it "should create an exact copy of the dataset when given an empty hash" do
66
+ @dataset = @dataset.with_row_proc(Proc.new{|r| r})
67
+ clone = @dataset.clone({})
53
68
 
54
69
  clone.object_id.wont_equal @dataset.object_id
55
70
  clone.class.must_equal @dataset.class
@@ -164,15 +179,12 @@ describe "A simple dataset" do
164
179
  end
165
180
 
166
181
  it "should format an insert statement with hash" do
167
- @dataset.insert_sql(:name => 'wxyz', :price => 342).
168
- must_match(/INSERT INTO test \(name, price\) VALUES \('wxyz', 342\)|INSERT INTO test \(price, name\) VALUES \(342, 'wxyz'\)/)
169
-
170
- @dataset.insert_sql({}).must_equal "INSERT INTO test DEFAULT VALUES"
182
+ @dataset.insert_sql(:name => 'wxyz', :price => 342).must_equal 'INSERT INTO test (name, price) VALUES (\'wxyz\', 342)'
183
+ @dataset.insert_sql({}).must_equal "INSERT INTO test DEFAULT VALUES"
171
184
  end
172
185
 
173
186
  it "should format an insert statement with string keys" do
174
- @dataset.insert_sql('name' => 'wxyz', 'price' => 342).
175
- must_match(/INSERT INTO test \(name, price\) VALUES \('wxyz', 342\)|INSERT INTO test \(price, name\) VALUES \(342, 'wxyz'\)/)
187
+ @dataset.insert_sql('name' => 'wxyz', 'price' => 342).must_equal 'INSERT INTO test (name, price) VALUES (\'wxyz\', 342)'
176
188
  end
177
189
 
178
190
  it "should format an insert statement with an arbitrary value" do
@@ -248,19 +260,17 @@ describe "A dataset with a limit" do
248
260
  @dataset.db.sqls.must_equal ['DELETE FROM a']
249
261
  end
250
262
 
251
- if false #SEQUEL5
252
- it "should raise on #update" do
253
- proc{@dataset.update(:a=>1)}.must_raise(Sequel::InvalidOperation)
254
- end
263
+ it "should raise on #update" do
264
+ proc{@dataset.update(:a=>1)}.must_raise(Sequel::InvalidOperation)
265
+ end
255
266
 
256
- it "should raise on #delete" do
257
- proc{@dataset.delete}.must_raise(Sequel::InvalidOperation)
258
- end
259
-
260
- it "should raise on #truncate" do
261
- proc{@dataset.truncate}.must_raise(Sequel::InvalidOperation)
262
- proc{@dataset.skip_limit_check.truncate}.must_raise(Sequel::InvalidOperation)
263
- end
267
+ it "should raise on #delete" do
268
+ proc{@dataset.delete}.must_raise(Sequel::InvalidOperation)
269
+ end
270
+
271
+ it "should raise on #truncate" do
272
+ proc{@dataset.truncate}.must_raise(Sequel::InvalidOperation)
273
+ proc{@dataset.skip_limit_check.truncate}.must_raise(Sequel::InvalidOperation)
264
274
  end
265
275
  end
266
276
 
@@ -279,19 +289,17 @@ describe "A dataset with an offset" do
279
289
  @dataset.db.sqls.must_equal ['DELETE FROM a']
280
290
  end
281
291
 
282
- if false #SEQUEL5
283
- it "should raise on #update" do
284
- proc{@dataset.update(:a=>1)}.must_raise(Sequel::InvalidOperation)
285
- end
292
+ it "should raise on #update" do
293
+ proc{@dataset.update(:a=>1)}.must_raise(Sequel::InvalidOperation)
294
+ end
286
295
 
287
- it "should raise on #delete" do
288
- proc{@dataset.delete}.must_raise(Sequel::InvalidOperation)
289
- end
290
-
291
- it "should raise on #truncate" do
292
- proc{@dataset.truncate}.must_raise(Sequel::InvalidOperation)
293
- proc{@dataset.skip_limit_check.truncate}.must_raise(Sequel::InvalidOperation)
294
- end
296
+ it "should raise on #delete" do
297
+ proc{@dataset.delete}.must_raise(Sequel::InvalidOperation)
298
+ end
299
+
300
+ it "should raise on #truncate" do
301
+ proc{@dataset.truncate}.must_raise(Sequel::InvalidOperation)
302
+ proc{@dataset.skip_limit_check.truncate}.must_raise(Sequel::InvalidOperation)
295
303
  end
296
304
  end
297
305
 
@@ -351,11 +359,17 @@ describe "Dataset#where" do
351
359
  @d1 = @dataset.where(:region => 'Asia')
352
360
  end
353
361
 
354
- if false # SEQUEL5: remove if
355
- it "should just clone if given no arguments or block" do
362
+ it "should raise Error if given no arguments or block" do
356
363
  proc{@dataset.where}.must_raise Sequel::Error
357
364
  end
358
365
 
366
+ it "should raise Error for arrays/multiple arguments that are not condition specifiers" do
367
+ proc{@dataset.where('a = ?', 1)}.must_raise Sequel::Error
368
+ proc{@dataset.where(['a = ?', 1])}.must_raise Sequel::Error
369
+ proc{@dataset.where({:a=>1}, {:b=>2})}.must_raise Sequel::Error
370
+ proc{@dataset.where([{:a=>1}, {:b=>2}])}.must_raise Sequel::Error
371
+ end
372
+
359
373
  it "should handle nil argument if block is given" do
360
374
  @d1.where(nil){a}.sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND NULL AND a)"
361
375
  end
@@ -363,7 +377,6 @@ describe "Dataset#where" do
363
377
  it "should handle nil argument if block has no existing filter" do
364
378
  @dataset.where(nil).sql.must_equal "SELECT * FROM test WHERE NULL"
365
379
  end
366
- end
367
380
 
368
381
  it "should just clone if given an empty array or hash argument" do
369
382
  @dataset.where({}).sql.must_equal @dataset.sql
@@ -373,84 +386,36 @@ describe "Dataset#where" do
373
386
  @dataset.filter([]).sql.must_equal @dataset.sql
374
387
  end
375
388
 
376
- deprecated "should just clone if given an empty string argument" do
377
- @dataset.where('').sql.must_equal @dataset.sql
378
- @dataset.filter('').sql.must_equal @dataset.sql
379
- end
380
-
381
- deprecated "should just clone if given no arguments or block" do
382
- @dataset.where.sql.must_equal @dataset.sql
383
- @dataset.filter.sql.must_equal @dataset.sql
384
- end
385
-
386
- deprecated "should ignore nil argument if block is given" do
387
- @d1.where(nil){a}.sql.must_equal @d1.where(:a).sql
389
+ it "should raise if no arguments or block" do
390
+ proc{@dataset.where}.must_raise Sequel::Error
391
+ proc{@dataset.filter}.must_raise Sequel::Error
388
392
  end
389
393
 
390
- deprecated "should ignore nil argument if block has no existing filter" do
391
- @dataset.where(nil).sql.must_equal @dataset.sql
394
+ it "should treat nil as NULL argument if block has no existing filter" do
395
+ @dataset.where(nil).sql.must_equal "SELECT * FROM test WHERE NULL"
396
+ @d1.where(nil).sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND NULL)"
392
397
  end
393
398
 
394
399
  it "should work with hashes" do
395
- @dataset.where(:name => 'xyz', :price => 342).select_sql.
396
- must_match(/WHERE \(\(name = 'xyz'\) AND \(price = 342\)\)|WHERE \(\(price = 342\) AND \(name = 'xyz'\)\)/)
397
- end
398
-
399
- deprecated "should handle literal strings in arrays in filter methods" do
400
- @dataset.where([Sequel.lit("a")]).sql.must_equal 'SELECT * FROM test WHERE (a)'
401
- end
402
-
403
- deprecated "should work with a string with placeholders and arguments for those placeholders" do
404
- @dataset.where('price < ? AND id in ?', 100, [1, 2, 3]).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in (1, 2, 3))"
400
+ @dataset.where(:name => 'xyz', :price => 342).select_sql.must_equal 'SELECT * FROM test WHERE ((name = \'xyz\') AND (price = 342))'
405
401
  end
406
402
 
407
403
  it "should work with a placeholder literal string" do
408
404
  @dataset.where(Sequel.lit('price < ? AND id in ?', 100, [1, 2, 3])).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in (1, 2, 3))"
409
405
  end
410
406
 
411
- deprecated "should not modify passed array with placeholders" do
412
- a = ['price < ? AND id in ?', 100, 1, 2, 3]
413
- b = a.dup
414
- @dataset.where(a)
415
- b.must_equal a
416
- end
417
-
418
- deprecated "should work with strings (custom SQL expressions)" do
419
- @dataset.where('(a = 1 AND b = 2)').select_sql.must_equal "SELECT * FROM test WHERE ((a = 1 AND b = 2))"
420
- end
421
-
422
407
  it "should work with literal strings" do
423
408
  @dataset.where(Sequel.lit('(a = 1 AND b = 2)')).select_sql.must_equal "SELECT * FROM test WHERE ((a = 1 AND b = 2))"
424
409
  end
425
410
 
426
- deprecated "should work with a string with named placeholders and a hash of placeholder value arguments" do
427
- @dataset.where('price < :price AND id in :ids', :price=>100, :ids=>[1, 2, 3]).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in (1, 2, 3))"
428
- end
429
-
430
411
  it "should work with named placeholder strings" do
431
412
  @dataset.where(Sequel.lit('price < :price AND id in :ids', :price=>100, :ids=>[1, 2, 3])).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in (1, 2, 3))"
432
413
  end
433
414
 
434
- deprecated "should not modify passed array with named placeholders" do
435
- a = ['price < :price AND id in :ids', {:price=>100}]
436
- b = a.dup
437
- @dataset.where(a)
438
- b.must_equal a
439
- end
440
-
441
- deprecated "should not replace named placeholders that don't exist in the hash" do
442
- @dataset.where('price < :price AND id in :ids', :price=>100).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in :ids)"
443
- end
444
-
445
415
  it "should not replace named placeholders that don't exist in the hash when using placeholder strings" do
446
416
  @dataset.where(Sequel.lit('price < :price AND id in :ids', :price=>100)).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in :ids)"
447
417
  end
448
418
 
449
- deprecated "should raise an error for a mismatched number of placeholders" do
450
- proc{@dataset.where('price < ? AND id in ?', 100).select_sql}.must_raise(Sequel::Error)
451
- proc{@dataset.where('price < ? AND id in ?', 100, [1, 2, 3], 4).select_sql}.must_raise(Sequel::Error)
452
- end
453
-
454
419
  it "should raise an error for a mismatched number of placeholders in placeholder literal strings" do
455
420
  proc{@dataset.where(Sequel.lit('price < ? AND id in ?', 100)).select_sql}.must_raise(Sequel::Error)
456
421
  proc{@dataset.where(Sequel.lit('price < ? AND id in ?', 100, [1, 2, 3], 4)).select_sql}.must_raise(Sequel::Error)
@@ -466,19 +431,10 @@ describe "Dataset#where" do
466
431
  proc{@dataset.where(Sequel.lit(['price < ', ' AND id in '], 100, [1, 2, 3], 4)).select_sql}.must_raise(Sequel::Error)
467
432
  end
468
433
 
469
- deprecated "should handle partial names" do
470
- @dataset.where('price < :price AND id = :p', :p=>2, :price=>100).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id = 2)"
471
- end
472
-
473
434
  it "should handle partial names when using placeholder literal strings" do
474
435
  @dataset.where(Sequel.lit('price < :price AND id = :p', :p=>2, :price=>100)).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id = 2)"
475
436
  end
476
437
 
477
- deprecated "should handle ::cast syntax when no parameters are supplied" do
478
- @dataset.where('price::float = 10', {}).select_sql.must_equal "SELECT * FROM test WHERE (price::float = 10)"
479
- @dataset.where('price::float ? 10', {}).select_sql.must_equal "SELECT * FROM test WHERE (price::float ? 10)"
480
- end
481
-
482
438
  it "should handle ::cast syntax when no parameters are supplied when using placeholder strings" do
483
439
  @dataset.where(Sequel.lit('price::float = 10', {})).select_sql.must_equal "SELECT * FROM test WHERE (price::float = 10)"
484
440
  @dataset.where(Sequel.lit('price::float ? 10', {})).select_sql.must_equal "SELECT * FROM test WHERE (price::float ? 10)"
@@ -490,18 +446,6 @@ describe "Dataset#where" do
490
446
  @d1.update_sql(:GDP => 0).must_equal "UPDATE test SET GDP = 0 WHERE (region = 'Asia')"
491
447
  end
492
448
 
493
- deprecated "should affect select, delete and update statements when using strings" do
494
- @d2 = @dataset.where('region = ?', 'Asia')
495
- @d2.select_sql.must_equal "SELECT * FROM test WHERE (region = 'Asia')"
496
- @d2.delete_sql.must_equal "DELETE FROM test WHERE (region = 'Asia')"
497
- @d2.update_sql(:GDP => 0).must_equal "UPDATE test SET GDP = 0 WHERE (region = 'Asia')"
498
-
499
- @d3 = @dataset.where("a = 1")
500
- @d3.select_sql.must_equal "SELECT * FROM test WHERE (a = 1)"
501
- @d3.delete_sql.must_equal "DELETE FROM test WHERE (a = 1)"
502
- @d3.update_sql(:GDP => 0).must_equal "UPDATE test SET GDP = 0 WHERE (a = 1)"
503
- end
504
-
505
449
  it "should affect select, delete and update statements when using literal strings" do
506
450
  @d2 = @dataset.where(Sequel.lit('region = ?', 'Asia'))
507
451
  @d2.select_sql.must_equal "SELECT * FROM test WHERE (region = 'Asia')"
@@ -521,18 +465,6 @@ describe "Dataset#where" do
521
465
  @d1.where{GDP() > 1000}.select_sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > 1000))"
522
466
  end
523
467
 
524
- deprecated "should be composable using AND operator (for scoping) when using strings" do
525
- @d2 = @dataset.where('region = ?', 'Asia')
526
- @d2.where('GDP > ?', 1000).select_sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > 1000))"
527
- @d2.where(:name => ['Japan', 'China']).select_sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND (name IN ('Japan', 'China')))"
528
- @d2.where('GDP > ?').select_sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > ?))"
529
-
530
- @d3 = @dataset.where("a = 1")
531
- @d3.where('b = 2').select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (b = 2))"
532
- @d3.where(:c => 3).select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (c = 3))"
533
- @d3.where('d = ?', 4).select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (d = 4))"
534
- end
535
-
536
468
  it "should be composable using AND operator (for scoping) when using literal strings" do
537
469
  @d2 = @dataset.where(Sequel.lit('region = ?', 'Asia'))
538
470
  @d2.where(Sequel.lit('GDP > ?', 1000)).select_sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > 1000))"
@@ -545,10 +477,6 @@ describe "Dataset#where" do
545
477
  @d3.where(Sequel.lit('d = ?', 4)).select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (d = 4))"
546
478
  end
547
479
 
548
- deprecated "should be composable using AND operator (for scoping) with block and string" do
549
- @dataset.where("a = 1").where{e < 5}.select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (e < 5))"
550
- end
551
-
552
480
  it "should be composable using AND operator (for scoping) with block and literal string" do
553
481
  @dataset.where(Sequel.lit("a = 1")).where{e < 5}.select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (e < 5))"
554
482
  end
@@ -660,20 +588,10 @@ describe "Dataset#where" do
660
588
  @dataset.filter(Sequel::SQLFALSE).sql.must_equal "SELECT * FROM test WHERE (1 = 0)"
661
589
  end
662
590
 
663
- deprecated "should allow the use of multiple arguments" do
664
- @dataset.filter(:a, :b).sql.must_equal 'SELECT * FROM test WHERE (a AND b)'
665
- @dataset.filter(:a, :b=>1).sql.must_equal 'SELECT * FROM test WHERE (a AND (b = 1))'
666
- @dataset.filter(:a, Sequel.expr(:c) > 3, :b=>1).sql.must_equal 'SELECT * FROM test WHERE (a AND (c > 3) AND (b = 1))'
667
- end
668
-
669
591
  it "should allow the use of blocks and arguments simultaneously" do
670
592
  @dataset.filter(Sequel.expr(:zz) < 3){yy > 3}.sql.must_equal 'SELECT * FROM test WHERE ((zz < 3) AND (yy > 3))'
671
593
  end
672
594
 
673
- deprecated "should allow the use of procs" do
674
- @dataset.filter(proc{yy > 3}).sql.must_equal 'SELECT * FROM test WHERE (yy > 3)'
675
- end
676
-
677
595
  it "should yield a VirtualRow to the block" do
678
596
  x = nil
679
597
  @dataset.filter{|r| x = r; false}
@@ -725,18 +643,10 @@ describe "Dataset#or" do
725
643
  @d1.or([]).sql.must_equal @d1.sql
726
644
  end
727
645
 
728
- deprecated "should just clone if given an empty string argument" do
729
- @d1.or('').sql.must_equal @d1.sql
730
- end
731
-
732
646
  it "should add an alternative expression to the where clause" do
733
647
  @d1.or(:y => 2).sql.must_equal 'SELECT * FROM test WHERE ((x = 1) OR (y = 2))'
734
648
  end
735
649
 
736
- deprecated "should accept string filters" do
737
- @d1.or('y > ?', 2).sql.must_equal 'SELECT * FROM test WHERE ((x = 1) OR (y > 2))'
738
- end
739
-
740
650
  it "should accept literal string filters" do
741
651
  @d1.or(Sequel.lit('y > ?', 2)).sql.must_equal 'SELECT * FROM test WHERE ((x = 1) OR (y > 2))'
742
652
  end
@@ -759,42 +669,6 @@ describe "Dataset#or" do
759
669
  end
760
670
  end
761
671
 
762
- describe "Dataset#and" do
763
- before do
764
- @dataset = Sequel.mock.dataset.from(:test)
765
- @d1 = @dataset.where(:x => 1)
766
- end
767
-
768
- deprecated "should add a WHERE filter if none exists" do
769
- @dataset.and(:a => 1).sql.must_equal 'SELECT * FROM test WHERE (a = 1)'
770
- end
771
-
772
- deprecated "should add an expression to the where clause" do
773
- @d1.and(:y => 2).sql.must_equal 'SELECT * FROM test WHERE ((x = 1) AND (y = 2))'
774
- end
775
-
776
- deprecated "should accept string filters with placeholders" do
777
- @d1.and('y > ?', 2).sql.must_equal 'SELECT * FROM test WHERE ((x = 1) AND (y > 2))'
778
- end
779
-
780
- deprecated "should accept placeholder literal string filters" do
781
- @d1.and(Sequel.lit('y > ?', 2)).sql.must_equal 'SELECT * FROM test WHERE ((x = 1) AND (y > 2))'
782
- end
783
-
784
- deprecated "should accept expression filters" do
785
- @d1.and(Sequel.expr(:yy) > 3).sql.must_equal 'SELECT * FROM test WHERE ((x = 1) AND (yy > 3))'
786
- end
787
-
788
- deprecated "should accept blocks passed to filter" do
789
- @d1.and{yy > 3}.sql.must_equal 'SELECT * FROM test WHERE ((x = 1) AND (yy > 3))'
790
- end
791
-
792
- deprecated "should correctly add parens to give predictable results" do
793
- @d1.or(:y => 2).and(:z => 3).sql.must_equal 'SELECT * FROM test WHERE (((x = 1) OR (y = 2)) AND (z = 3))'
794
- @d1.and(:y => 2).or(:z => 3).sql.must_equal 'SELECT * FROM test WHERE (((x = 1) AND (y = 2)) OR (z = 3))'
795
- end
796
- end
797
-
798
672
  describe "Dataset#exclude" do
799
673
  before do
800
674
  @dataset = Sequel.mock.dataset.from(:test)
@@ -805,17 +679,7 @@ describe "Dataset#exclude" do
805
679
  end
806
680
 
807
681
  it "should take multiple conditions as a hash and express the logic correctly in SQL" do
808
- @dataset.exclude(:region => 'Asia', :name => 'Japan').select_sql.
809
- must_match(Regexp.union(/WHERE \(\(region != 'Asia'\) OR \(name != 'Japan'\)\)/,
810
- /WHERE \(\(name != 'Japan'\) OR \(region != 'Asia'\)\)/))
811
- end
812
-
813
- deprecated "should parenthesize a single string condition correctly" do
814
- @dataset.exclude("region = 'Asia' AND name = 'Japan'").select_sql.must_equal "SELECT * FROM test WHERE NOT (region = 'Asia' AND name = 'Japan')"
815
- end
816
-
817
- deprecated "should parenthesize an array condition correctly" do
818
- @dataset.exclude('region = ? AND name = ?', 'Asia', 'Japan').select_sql.must_equal "SELECT * FROM test WHERE NOT (region = 'Asia' AND name = 'Japan')"
682
+ @dataset.exclude(:region => 'Asia', :name => 'Japan').select_sql.must_equal 'SELECT * FROM test WHERE ((region != \'Asia\') OR (name != \'Japan\'))'
819
683
  end
820
684
 
821
685
  it "should parenthesize a single literal string condition correctly" do
@@ -840,24 +704,8 @@ describe "Dataset#exclude" do
840
704
  end
841
705
  end
842
706
 
843
- describe "Dataset#exclude_where" do
844
- before do
845
- @dataset = Sequel.mock.dataset.from(:test)
846
- end
847
-
848
- deprecated "should correctly negate the expression and add it to the where clause" do
849
- @dataset.exclude_where(:region=>'Asia').sql.must_equal "SELECT * FROM test WHERE (region != 'Asia')"
850
- @dataset.exclude_where(:region=>'Asia').exclude_where(:region=>'NA').sql.must_equal "SELECT * FROM test WHERE ((region != 'Asia') AND (region != 'NA'))"
851
- end
852
-
853
- deprecated "should affect the where clause even if having clause is already used" do
854
- @dataset.group_and_count(:name).having{count > 2}.exclude_where(:region=>'Asia').sql.
855
- must_equal "SELECT name, count(*) AS count FROM test WHERE (region != 'Asia') GROUP BY name HAVING (count > 2)"
856
- end
857
- end
858
-
859
707
  describe "Dataset#exclude_having" do
860
- deprecated "should correctly negate the expression and add it to the having clause" do
708
+ it "should correctly negate the expression and add it to the having clause" do
861
709
  Sequel.mock.dataset.from(:test).exclude_having{count > 2}.exclude_having{count < 0}.sql.must_equal "SELECT * FROM test HAVING ((count <= 2) AND (count >= 0))"
862
710
  end
863
711
  end
@@ -893,14 +741,6 @@ describe "Dataset#having" do
893
741
  @dataset.having([]).sql.must_equal @dataset.sql
894
742
  end
895
743
 
896
- deprecated "should just clone if given an empty string argument" do
897
- @dataset.having('').sql.must_equal @dataset.sql
898
- end
899
-
900
- deprecated "should handle string arguments" do
901
- @grouped.having('sum(population) > 10').select_sql.must_equal "SELECT region, sum(population), avg(gdp) FROM test GROUP BY region HAVING (sum(population) > 10)"
902
- end
903
-
904
744
  it "should handle literal string arguments" do
905
745
  @grouped.having(Sequel.lit('sum(population) > 10')).select_sql.must_equal "SELECT region, sum(population), avg(gdp) FROM test GROUP BY region HAVING (sum(population) > 10)"
906
746
  end
@@ -2316,8 +2156,9 @@ describe "Dataset#count" do
2316
2156
 
2317
2157
  it "should work on a graphed_dataset" do
2318
2158
  ds = @dataset.with_extend{ def columns; [:a] end}
2319
- @dataset.graph(@dataset, [:a], :table_alias=>:test2).count.must_equal 1
2320
- @db.sqls.must_equal ['SELECT count(*) AS count FROM test LEFT OUTER JOIN test AS test2 USING (a) LIMIT 1']
2159
+ ds.graph(@dataset, [:a], :table_alias=>:test2).count.must_equal 1
2160
+ @dataset.graph(ds, [:a], :table_alias=>:test2).count.must_equal 1
2161
+ @db.sqls.must_equal(['SELECT count(*) AS count FROM test LEFT OUTER JOIN test AS test2 USING (a) LIMIT 1'] * 2)
2321
2162
  end
2322
2163
 
2323
2164
  it "should not cache the columns value" do
@@ -2397,10 +2238,7 @@ describe "Dataset#first_source_alias" do
2397
2238
  end
2398
2239
 
2399
2240
  it "should be the entire first source if not aliased" do
2400
- deprecated do
2401
- # SEQUEL5: Remove deprecation block, but keep code
2402
- @ds.from(:s__t).first_source_alias.must_equal :s__t
2403
- end
2241
+ @ds.from(:s__t).first_source_alias.must_equal :s__t
2404
2242
  end
2405
2243
 
2406
2244
  with_symbol_splitting "should be the alias if aliased when using symbol splitting" do
@@ -2440,10 +2278,7 @@ describe "Dataset#first_source_table" do
2440
2278
 
2441
2279
  it "should be the entire first source if not aliased" do
2442
2280
  @ds.from(:t).first_source_table.must_equal :t
2443
- deprecated do
2444
- # SEQUEL5: Remove deprecation block, but keep code
2445
- @ds.from(:s__t).first_source_table.must_equal :s__t
2446
- end
2281
+ @ds.from(:s__t).first_source_table.must_equal :s__t
2447
2282
  end
2448
2283
 
2449
2284
  it "should be the entire first source if not aliased" do
@@ -2693,10 +2528,6 @@ describe "Dataset#join_table" do
2693
2528
  'RIGHT OUTER JOIN (SELECT * FROM attributes WHERE (name = \'blah\')) AS "t3" ON ("t3"."attribute_id" = "t2"."id")'
2694
2529
  end
2695
2530
 
2696
- deprecated "should support using a string as the join condition" do
2697
- @d.join(:categories, "c.item_id = items.id", :table_alias=>:c).sql.must_equal 'SELECT * FROM "items" INNER JOIN "categories" AS "c" ON (c.item_id = items.id)'
2698
- end
2699
-
2700
2531
  it "should support using a literal string as the join condition" do
2701
2532
  @d.join(:categories, Sequel.lit("c.item_id = items.id"), :table_alias=>:c).sql.must_equal 'SELECT * FROM "items" INNER JOIN "categories" AS "c" ON (c.item_id = items.id)'
2702
2533
  end
@@ -2874,73 +2705,6 @@ describe "Dataset aggregate methods" do
2874
2705
  end
2875
2706
  end
2876
2707
 
2877
- describe "Dataset#range" do
2878
- before do
2879
- @db = Sequel.mock(:fetch=>{:v1 => 1, :v2 => 10})
2880
- @ds = @db[:test].freeze
2881
- end
2882
-
2883
- deprecated "should generate a correct SQL statement" do
2884
- 5.times do
2885
- @ds.range(:stamp)
2886
- @db.sqls.must_equal ["SELECT min(stamp) AS v1, max(stamp) AS v2 FROM test LIMIT 1"]
2887
- end
2888
-
2889
- @ds.filter(Sequel.expr(:price) > 100).range(:stamp)
2890
- @db.sqls.must_equal ["SELECT min(stamp) AS v1, max(stamp) AS v2 FROM test WHERE (price > 100) LIMIT 1"]
2891
- end
2892
-
2893
- deprecated "should return a range object" do
2894
- 5.times do
2895
- @ds.range(:tryme).must_equal(1..10)
2896
- end
2897
- end
2898
-
2899
- deprecated "should use a subselect for the same conditions as count" do
2900
- @ds.order(:stamp).limit(5).range(:stamp).must_equal(1..10)
2901
- @db.sqls.must_equal ['SELECT min(stamp) AS v1, max(stamp) AS v2 FROM (SELECT * FROM test ORDER BY stamp LIMIT 5) AS t1 LIMIT 1']
2902
- end
2903
-
2904
- deprecated "should accept virtual row blocks" do
2905
- 5.times do
2906
- @ds.range{a(b)}
2907
- @db.sqls.must_equal ["SELECT min(a(b)) AS v1, max(a(b)) AS v2 FROM test LIMIT 1"]
2908
- end
2909
- end
2910
- end
2911
-
2912
- describe "Dataset#interval" do
2913
- before do
2914
- @db = Sequel.mock(:fetch=>{:v => 1234})
2915
- @ds = @db[:test].freeze
2916
- end
2917
-
2918
- deprecated "should generate the correct SQL statement" do
2919
- 5.times do
2920
- @ds.interval(:stamp)
2921
- @db.sqls.must_equal ["SELECT (max(stamp) - min(stamp)) AS interval FROM test LIMIT 1"]
2922
- end
2923
-
2924
- @ds.filter(Sequel.expr(:price) > 100).interval(:stamp)
2925
- @db.sqls.must_equal ["SELECT (max(stamp) - min(stamp)) AS interval FROM test WHERE (price > 100) LIMIT 1"]
2926
- end
2927
-
2928
- deprecated "should use a subselect for the same conditions as count" do
2929
- ds = @ds.order(:stamp).limit(5)
2930
- 5.times do
2931
- ds.interval(:stamp).must_equal 1234
2932
- @db.sqls.must_equal ['SELECT (max(stamp) - min(stamp)) AS interval FROM (SELECT * FROM test ORDER BY stamp LIMIT 5) AS t1 LIMIT 1']
2933
- end
2934
- end
2935
-
2936
- deprecated "should accept virtual row blocks" do
2937
- 5.times do
2938
- @ds.interval{a(b)}
2939
- @db.sqls.must_equal ["SELECT (max(a(b)) - min(a(b))) AS interval FROM test LIMIT 1"]
2940
- end
2941
- end
2942
- end
2943
-
2944
2708
  describe "Dataset #first and #last" do
2945
2709
  before do
2946
2710
  @d = Sequel.mock(:fetch=>proc{|s| {:s=>s}})[:test]
@@ -2999,16 +2763,6 @@ describe "Dataset #first and #last" do
2999
2763
  end
3000
2764
  end
3001
2765
 
3002
- deprecated "should combine block and standard argument filters if argument is a string" do
3003
- ds = @d.order(:name).freeze
3004
- 5.times do
3005
- @d.first('y = 25'){z > 26}.must_equal(:s=>'SELECT * FROM test WHERE ((y = 25) AND (z > 26)) LIMIT 1')
3006
- ds.last('y = 16'){z > 26}.must_equal(:s=>'SELECT * FROM test WHERE ((y = 16) AND (z > 26)) ORDER BY name DESC LIMIT 1')
3007
- @d.first('y = ?', 25){z > 26}.must_equal(:s=>'SELECT * FROM test WHERE ((y = 25) AND (z > 26)) LIMIT 1')
3008
- ds.last('y = ?', 16){z > 26}.must_equal(:s=>'SELECT * FROM test WHERE ((y = 16) AND (z > 26)) ORDER BY name DESC LIMIT 1')
3009
- end
3010
- end
3011
-
3012
2766
  it "should filter and return an array of records if an Integer argument is provided and a block is given" do
3013
2767
  ds = @d.order(:a).freeze
3014
2768
  5.times do
@@ -3264,7 +3018,7 @@ describe "Dataset#single_value!" do
3264
3018
 
3265
3019
  it "should call each and return the first value of the first record" do
3266
3020
  @db.fetch = [{:a=>1, :b=>2}, {:a=>3, :b=>4}]
3267
- @db[:test].single_value!.to_s.must_match(/\A(1|2)\z/)
3021
+ @db[:test].single_value!.must_equal 1
3268
3022
  @db.sqls.must_equal ['SELECT * FROM test']
3269
3023
  end
3270
3024
 
@@ -3705,10 +3459,7 @@ describe "Dataset#multi_insert" do
3705
3459
 
3706
3460
  it "should accept string keys as column names" do
3707
3461
  @ds.multi_insert([{'x'=>1, 'y'=>2}, {'x'=>3, 'y'=>4}])
3708
- sqls = @db.sqls
3709
- ["INSERT INTO items (x, y) VALUES (1, 2)", "INSERT INTO items (y, x) VALUES (2, 1)"].must_include(sqls.slice!(1))
3710
- ["INSERT INTO items (x, y) VALUES (3, 4)", "INSERT INTO items (y, x) VALUES (4, 3)"].must_include(sqls.slice!(1))
3711
- sqls.must_equal ['BEGIN', 'COMMIT']
3462
+ @db.sqls.must_equal ['BEGIN', "INSERT INTO items (x, y) VALUES (1, 2)", "INSERT INTO items (x, y) VALUES (3, 4)", 'COMMIT']
3712
3463
  end
3713
3464
 
3714
3465
  it "should not do anything if no hashes are provided" do
@@ -3722,8 +3473,8 @@ describe "Dataset#update_sql" do
3722
3473
  @ds = Sequel.mock.dataset.from(:items)
3723
3474
  end
3724
3475
 
3725
- deprecated "should accept strings" do
3726
- @ds.update_sql("a = b").must_equal "UPDATE items SET a = b"
3476
+ it "should raise Error for plain strings" do
3477
+ proc{@ds.update_sql("a = b")}.must_raise Sequel::Error
3727
3478
  end
3728
3479
 
3729
3480
  it "should accept literal strings" do
@@ -4121,6 +3872,15 @@ describe "Dataset prepared statements and bound variables " do
4121
3872
  ]*2)
4122
3873
  end
4123
3874
 
3875
+ it "Dataset#prepare with a delayed evaluation should raise an error" do
3876
+ proc{@ds.where(Sequel.delay{{:n=>1}}).prepare(:select, :select_n)}.must_raise Sequel::Error
3877
+ end
3878
+
3879
+ it "Dataset#call with a delayed evaluation should work" do
3880
+ @ds.where(Sequel.delay{{:n=>1}}).call(:select).must_equal []
3881
+ @db.sqls.must_equal ["SELECT * FROM items WHERE (n = 1)"]
3882
+ end
3883
+
4124
3884
  it "PreparedStatement#prepare should raise an error" do
4125
3885
  ps = @ds.prepare(:select, :select_n)
4126
3886
  proc{ps.prepare(:select, :select_n2)}.must_raise Sequel::Error
@@ -4132,9 +3892,8 @@ describe "Dataset prepared statements and bound variables " do
4132
3892
  @db.sqls.must_equal ["SELECT * FROM items"]
4133
3893
  end
4134
3894
 
4135
- deprecated "#call should default to using :all if an invalid type is given" do
4136
- @ds.filter(:num=>:$n).call(:select_all, :n=>1)
4137
- @db.sqls.must_equal ['SELECT * FROM items WHERE (num = 1)']
3895
+ it "#call should raise Error if an invalid type is given" do
3896
+ proc{@ds.filter(:num=>:$n).call(:select_all, :n=>1)}.must_raise Sequel::Error
4138
3897
  end
4139
3898
 
4140
3899
  it "#inspect should indicate it is a prepared statement with the prepared SQL" do
@@ -4142,11 +3901,6 @@ describe "Dataset prepared statements and bound variables " do
4142
3901
  '<Sequel::Mock::Dataset/PreparedStatement "SELECT * FROM items WHERE (num = $n)">'
4143
3902
  end
4144
3903
 
4145
- deprecated "should handle literal strings" do
4146
- @ds.filter("num = ?", :$n).call(:select, :n=>1)
4147
- @db.sqls.must_equal ['SELECT * FROM items WHERE (num = 1)']
4148
- end
4149
-
4150
3904
  it "should handle literal strings" do
4151
3905
  @ds.filter(Sequel.lit("num = ?", :$n)).call(:select, :n=>1)
4152
3906
  @db.sqls.must_equal ['SELECT * FROM items WHERE (num = 1)']
@@ -4174,11 +3928,6 @@ describe "Dataset prepared statements and bound variables " do
4174
3928
  @db.sqls.must_equal ['SELECT * FROM items WHERE (0 AND (num IN (SELECT num FROM items WHERE (num IN (SELECT num FROM items WHERE (num = 1))))))']
4175
3929
  end
4176
3930
 
4177
- deprecated "should handle subselects with strings" do
4178
- @ds.filter(:$b).filter(:num=>@ds.select(:num).filter("num = ?", :$n)).call(:select, :n=>1, :b=>0)
4179
- @db.sqls.must_equal ['SELECT * FROM items WHERE (0 AND (num IN (SELECT num FROM items WHERE (num = 1))))']
4180
- end
4181
-
4182
3931
  it "should handle subselects with literal strings" do
4183
3932
  @ds.filter(:$b).filter(:num=>@ds.select(:num).filter(Sequel.lit("num = ?", :$n))).call(:select, :n=>1, :b=>0)
4184
3933
  @db.sqls.must_equal ['SELECT * FROM items WHERE (0 AND (num IN (SELECT num FROM items WHERE (num = 1))))']
@@ -4243,13 +3992,12 @@ describe Sequel::Dataset::UnnumberedArgumentMapper do
4243
3992
  "UPDATE items SET num = ? WHERE (num = ?) -- args: [1, 1]"]
4244
3993
  end
4245
3994
 
4246
- deprecated "should handle unrecognized statement types as :all" do
3995
+ it "should raise Error for unrecognized statement types" do
4247
3996
  ps = @ds.prepare(:select_all, :s)
4248
3997
  ps = ps.with_extend(Sequel::Dataset::UnnumberedArgumentMapper)
4249
3998
  sql = ps.prepared_sql
4250
3999
  ps.prepared_sql.must_be_same_as(sql)
4251
- ps.call(:n=>1)
4252
- @db.sqls.must_equal ["SELECT * FROM items WHERE (num = ?) -- args: [1]"]
4000
+ proc{ps.call(:n=>1)}.must_raise Sequel::Error
4253
4001
  end
4254
4002
  end
4255
4003
 
@@ -4396,87 +4144,6 @@ describe "Sequel::Dataset#qualify" do
4396
4144
  end
4397
4145
  end
4398
4146
 
4399
- describe "Sequel::Dataset#unbind" do
4400
- before do
4401
- deprecated do
4402
- @ds = Sequel.mock[:t]
4403
- @u = proc{|ds| ds, bv = ds.unbind; [ds.sql, bv]}
4404
- end
4405
- end
4406
-
4407
- deprecated "should unbind values assigned to equality and inequality statements" do
4408
- @ds.filter(:foo=>1).unbind.first.sql.must_equal "SELECT * FROM t WHERE (foo = $foo)"
4409
- @ds.exclude(:foo=>1).unbind.first.sql.must_equal "SELECT * FROM t WHERE (foo != $foo)"
4410
- @ds.filter{foo > 1}.unbind.first.sql.must_equal "SELECT * FROM t WHERE (foo > $foo)"
4411
- @ds.filter{foo >= 1}.unbind.first.sql.must_equal "SELECT * FROM t WHERE (foo >= $foo)"
4412
- @ds.filter{foo < 1}.unbind.first.sql.must_equal "SELECT * FROM t WHERE (foo < $foo)"
4413
- @ds.filter{foo <= 1}.unbind.first.sql.must_equal "SELECT * FROM t WHERE (foo <= $foo)"
4414
- end
4415
-
4416
- deprecated "should return variables that could be used bound to recreate the previous query" do
4417
- @ds.filter(:foo=>1).unbind.last.must_equal(:foo=>1)
4418
- @ds.exclude(:foo=>1).unbind.last.must_equal(:foo=>1)
4419
- end
4420
-
4421
- deprecated "should return variables as symbols" do
4422
- @ds.filter(Sequel.expr(:foo)=>1).unbind.last.must_equal(:foo=>1)
4423
- @ds.exclude(Sequel.expr(:foo__bar)=>1).unbind.last.must_equal(:"foo.bar"=>1)
4424
- end
4425
-
4426
- deprecated "should handle numerics, strings, dates, times, and datetimes" do
4427
- @u[@ds.filter(:foo=>1)].must_equal ["SELECT * FROM t WHERE (foo = $foo)", {:foo=>1}]
4428
- @u[@ds.filter(:foo=>1.0)].must_equal ["SELECT * FROM t WHERE (foo = $foo)", {:foo=>1.0}]
4429
- @u[@ds.filter(:foo=>BigDecimal.new('1.0'))].must_equal ["SELECT * FROM t WHERE (foo = $foo)", {:foo=>BigDecimal.new('1.0')}]
4430
- @u[@ds.filter(:foo=>'a')].must_equal ["SELECT * FROM t WHERE (foo = $foo)", {:foo=>'a'}]
4431
- @u[@ds.filter(:foo=>Date.today)].must_equal ["SELECT * FROM t WHERE (foo = $foo)", {:foo=>Date.today}]
4432
- t = Time.now
4433
- @u[@ds.filter(:foo=>t)].must_equal ["SELECT * FROM t WHERE (foo = $foo)", {:foo=>t}]
4434
- dt = DateTime.now
4435
- @u[@ds.filter(:foo=>dt)].must_equal ["SELECT * FROM t WHERE (foo = $foo)", {:foo=>dt}]
4436
- end
4437
-
4438
- deprecated "should not unbind literal strings" do
4439
- @u[@ds.filter(:foo=>Sequel.lit('a'))].must_equal ["SELECT * FROM t WHERE (foo = a)", {}]
4440
- end
4441
-
4442
- deprecated "should not unbind Identifiers, QualifiedIdentifiers, or Symbols used as booleans" do
4443
- @u[@ds.filter(:foo).filter{bar}.filter{foo__bar}].must_equal ["SELECT * FROM t WHERE (foo AND bar AND foo.bar)", {}]
4444
- end
4445
-
4446
- deprecated "should not unbind for values it doesn't understand" do
4447
- @u[@ds.filter(:foo=>Class.new{def sql_literal(ds) 'bar' end}.new)].must_equal ["SELECT * FROM t WHERE (foo = bar)", {}]
4448
- end
4449
-
4450
- deprecated "should handle QualifiedIdentifiers" do
4451
- @u[@ds.filter{foo__bar > 1}].must_equal ["SELECT * FROM t WHERE (foo.bar > $foo.bar)", {:"foo.bar"=>1}]
4452
- end
4453
-
4454
- deprecated "should handle wrapped objects" do
4455
- @u[@ds.filter{Sequel::SQL::Wrapper.new(foo__bar) > Sequel::SQL::Wrapper.new(1)}].must_equal ["SELECT * FROM t WHERE (foo.bar > $foo.bar)", {:"foo.bar"=>1}]
4456
- end
4457
-
4458
- deprecated "should handle deep nesting" do
4459
- @u[@ds.filter{foo > 1}.and{bar < 2}.or(:baz=>3).and(Sequel.case({~Sequel.expr(:x=>4)=>true}, false))].must_equal ["SELECT * FROM t WHERE ((((foo > $foo) AND (bar < $bar)) OR (baz = $baz)) AND (CASE WHEN (x != $x) THEN 't' ELSE 'f' END))", {:foo=>1, :bar=>2, :baz=>3, :x=>4}]
4460
- end
4461
-
4462
- deprecated "should handle JOIN ON" do
4463
- @u[@ds.cross_join(:x).join(:a, [:u]).join(:b, [[:c, :d], [:e,1]])].must_equal ["SELECT * FROM t CROSS JOIN x INNER JOIN a USING (u) INNER JOIN b ON ((b.c = a.d) AND (b.e = $b.e))", {:"b.e"=>1}]
4464
- end
4465
-
4466
- deprecated "should raise an UnbindDuplicate exception if same variable is used with multiple different values" do
4467
- proc{@ds.filter(:foo=>1).or(:foo=>2).unbind}.must_raise(Sequel::UnbindDuplicate)
4468
- end
4469
-
4470
- deprecated "should handle case where the same variable has the same value in multiple places " do
4471
- @u[@ds.filter(:foo=>1).or(:foo=>1)].must_equal ["SELECT * FROM t WHERE ((foo = $foo) OR (foo = $foo))", {:foo=>1}]
4472
- end
4473
-
4474
- deprecated "should raise Error for unhandled objects inside Identifiers and QualifiedIndentifiers" do
4475
- proc{@ds.filter(Sequel::SQL::Identifier.new([]) > 1).unbind}.must_raise(Sequel::Error)
4476
- proc{@ds.filter{foo.qualify({}) > 1}.unbind}.must_raise(Sequel::Error)
4477
- end
4478
- end
4479
-
4480
4147
  describe "Sequel::Dataset #with and #with_recursive" do
4481
4148
  before do
4482
4149
  @db = Sequel.mock
@@ -5230,7 +4897,7 @@ describe "Dataset extensions" do
5230
4897
  end
5231
4898
  end
5232
4899
  before do
5233
- @ds = Sequel.mock(:identifier_mangling=>false).dataset
4900
+ @ds = Sequel.mock.dataset
5234
4901
  end
5235
4902
 
5236
4903
  it "should be able to register an extension with a module Database#extension extend the module" do
@@ -5271,7 +4938,7 @@ describe "Dataset extensions" do
5271
4938
 
5272
4939
  it "should register a Database extension for modifying all datasets when registering with a module" do
5273
4940
  Sequel::Dataset.register_extension(:foo, Module.new{def a; 1; end})
5274
- Sequel.mock(:identifier_mangling=>false).extension(:foo).dataset.a.must_equal 1
4941
+ Sequel.mock.extension(:foo).dataset.a.must_equal 1
5275
4942
  end
5276
4943
 
5277
4944
  it "should raise an Error if registering with both a module and a block" do
@@ -5648,7 +5315,7 @@ end
5648
5315
 
5649
5316
  describe "Dataset#output_identifier" do
5650
5317
  it "should handle empty identifiers and uppercase identifiers" do
5651
- meth = Sequel::Database.new(:identifier_mangling=>false).dataset.method(:output_identifier)
5318
+ meth = Sequel::Database.new.dataset.method(:output_identifier)
5652
5319
  meth.call('').must_equal :untitled
5653
5320
  meth.call('A').must_equal :a
5654
5321
  end
@@ -5700,7 +5367,6 @@ describe "Dataset#where_single_value" do
5700
5367
 
5701
5368
  it "should return single value" do
5702
5369
  5.times do
5703
- a = []
5704
5370
  @ds.only_id.where_single_value(:id=>1).must_equal 1
5705
5371
  @ds.db.sqls.must_equal ['SELECT id FROM items WHERE (id = 1) LIMIT 1']
5706
5372
  end