sequel 4.49.0 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +130 -0
  3. data/README.rdoc +195 -136
  4. data/Rakefile +26 -42
  5. data/bin/sequel +6 -9
  6. data/doc/advanced_associations.rdoc +91 -168
  7. data/doc/association_basics.rdoc +197 -274
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +66 -43
  10. data/doc/code_order.rdoc +1 -8
  11. data/doc/core_extensions.rdoc +81 -56
  12. data/doc/dataset_basics.rdoc +8 -17
  13. data/doc/dataset_filtering.rdoc +81 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +73 -30
  16. data/doc/migration.rdoc +19 -36
  17. data/doc/model_dataset_method_design.rdoc +14 -17
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +10 -10
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +52 -70
  22. data/doc/opening_databases.rdoc +39 -32
  23. data/doc/postgresql.rdoc +48 -38
  24. data/doc/prepared_statements.rdoc +27 -22
  25. data/doc/querying.rdoc +173 -150
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/release_notes/5.1.0.txt +31 -0
  29. data/doc/release_notes/5.2.0.txt +33 -0
  30. data/doc/release_notes/5.3.0.txt +121 -0
  31. data/doc/schema_modification.rdoc +78 -64
  32. data/doc/security.rdoc +97 -88
  33. data/doc/sharding.rdoc +43 -30
  34. data/doc/sql.rdoc +53 -65
  35. data/doc/testing.rdoc +4 -5
  36. data/doc/thread_safety.rdoc +2 -4
  37. data/doc/transactions.rdoc +18 -17
  38. data/doc/validations.rdoc +48 -45
  39. data/doc/virtual_rows.rdoc +87 -115
  40. data/lib/sequel/adapters/ado/access.rb +7 -13
  41. data/lib/sequel/adapters/ado/mssql.rb +2 -9
  42. data/lib/sequel/adapters/ado.rb +9 -25
  43. data/lib/sequel/adapters/amalgalite.rb +3 -18
  44. data/lib/sequel/adapters/ibmdb.rb +9 -45
  45. data/lib/sequel/adapters/jdbc/db2.rb +8 -37
  46. data/lib/sequel/adapters/jdbc/derby.rb +4 -50
  47. data/lib/sequel/adapters/jdbc/h2.rb +6 -26
  48. data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
  49. data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
  50. data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
  51. data/lib/sequel/adapters/jdbc/mysql.rb +11 -15
  52. data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
  53. data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
  54. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
  55. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
  56. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
  57. data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
  58. data/lib/sequel/adapters/jdbc.rb +18 -74
  59. data/lib/sequel/adapters/mock.rb +4 -30
  60. data/lib/sequel/adapters/mysql.rb +7 -44
  61. data/lib/sequel/adapters/mysql2.rb +5 -23
  62. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  63. data/lib/sequel/adapters/odbc/mssql.rb +4 -12
  64. data/lib/sequel/adapters/odbc/oracle.rb +1 -1
  65. data/lib/sequel/adapters/odbc.rb +0 -19
  66. data/lib/sequel/adapters/oracle.rb +8 -13
  67. data/lib/sequel/adapters/postgres.rb +28 -150
  68. data/lib/sequel/adapters/postgresql.rb +1 -1
  69. data/lib/sequel/adapters/shared/access.rb +11 -51
  70. data/lib/sequel/adapters/shared/db2.rb +3 -61
  71. data/lib/sequel/adapters/shared/mssql.rb +21 -157
  72. data/lib/sequel/adapters/shared/mysql.rb +61 -227
  73. data/lib/sequel/adapters/shared/oracle.rb +13 -41
  74. data/lib/sequel/adapters/shared/postgres.rb +58 -264
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
  76. data/lib/sequel/adapters/shared/sqlite.rb +22 -101
  77. data/lib/sequel/adapters/sqlanywhere.rb +4 -23
  78. data/lib/sequel/adapters/sqlite.rb +2 -19
  79. data/lib/sequel/adapters/tinytds.rb +5 -15
  80. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -4
  82. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
  83. data/lib/sequel/adapters/utils/replace.rb +0 -5
  84. data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
  85. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
  86. data/lib/sequel/ast_transformer.rb +3 -94
  87. data/lib/sequel/connection_pool/sharded_single.rb +1 -4
  88. data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
  89. data/lib/sequel/connection_pool/single.rb +0 -2
  90. data/lib/sequel/connection_pool/threaded.rb +94 -110
  91. data/lib/sequel/connection_pool.rb +38 -28
  92. data/lib/sequel/core.rb +42 -101
  93. data/lib/sequel/database/connecting.rb +23 -60
  94. data/lib/sequel/database/dataset.rb +6 -9
  95. data/lib/sequel/database/dataset_defaults.rb +4 -48
  96. data/lib/sequel/database/features.rb +5 -4
  97. data/lib/sequel/database/logging.rb +2 -9
  98. data/lib/sequel/database/misc.rb +36 -55
  99. data/lib/sequel/database/query.rb +8 -13
  100. data/lib/sequel/database/schema_generator.rb +93 -64
  101. data/lib/sequel/database/schema_methods.rb +61 -79
  102. data/lib/sequel/database/transactions.rb +4 -24
  103. data/lib/sequel/database.rb +12 -2
  104. data/lib/sequel/dataset/actions.rb +57 -107
  105. data/lib/sequel/dataset/dataset_module.rb +4 -16
  106. data/lib/sequel/dataset/features.rb +35 -30
  107. data/lib/sequel/dataset/graph.rb +40 -49
  108. data/lib/sequel/dataset/misc.rb +12 -37
  109. data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
  110. data/lib/sequel/dataset/prepared_statements.rb +23 -51
  111. data/lib/sequel/dataset/query.rb +91 -161
  112. data/lib/sequel/dataset/sql.rb +33 -225
  113. data/lib/sequel/dataset.rb +18 -10
  114. data/lib/sequel/deprecated.rb +18 -27
  115. data/lib/sequel/exceptions.rb +1 -17
  116. data/lib/sequel/extensions/_model_pg_row.rb +0 -7
  117. data/lib/sequel/extensions/_pretty_table.rb +1 -3
  118. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  119. data/lib/sequel/extensions/connection_expiration.rb +1 -1
  120. data/lib/sequel/extensions/connection_validator.rb +1 -1
  121. data/lib/sequel/extensions/constraint_validations.rb +11 -11
  122. data/lib/sequel/extensions/core_extensions.rb +39 -49
  123. data/lib/sequel/extensions/core_refinements.rb +39 -45
  124. data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
  125. data/lib/sequel/extensions/date_arithmetic.rb +7 -7
  126. data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
  127. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  128. data/lib/sequel/extensions/eval_inspect.rb +4 -11
  129. data/lib/sequel/extensions/freeze_datasets.rb +1 -69
  130. data/lib/sequel/extensions/from_block.rb +1 -35
  131. data/lib/sequel/extensions/graph_each.rb +2 -2
  132. data/lib/sequel/extensions/identifier_mangling.rb +9 -19
  133. data/lib/sequel/extensions/implicit_subquery.rb +2 -2
  134. data/lib/sequel/extensions/inflector.rb +4 -4
  135. data/lib/sequel/extensions/migration.rb +27 -43
  136. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
  137. data/lib/sequel/extensions/null_dataset.rb +2 -8
  138. data/lib/sequel/extensions/pagination.rb +1 -17
  139. data/lib/sequel/extensions/pg_array.rb +20 -189
  140. data/lib/sequel/extensions/pg_extended_date_support.rb +230 -0
  141. data/lib/sequel/extensions/pg_hstore.rb +11 -50
  142. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
  143. data/lib/sequel/extensions/pg_inet.rb +3 -16
  144. data/lib/sequel/extensions/pg_interval.rb +1 -20
  145. data/lib/sequel/extensions/pg_json.rb +7 -27
  146. data/lib/sequel/extensions/pg_loose_count.rb +1 -1
  147. data/lib/sequel/extensions/pg_range.rb +6 -121
  148. data/lib/sequel/extensions/pg_range_ops.rb +1 -3
  149. data/lib/sequel/extensions/pg_row.rb +5 -77
  150. data/lib/sequel/extensions/pg_row_ops.rb +2 -13
  151. data/lib/sequel/extensions/query.rb +3 -4
  152. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  153. data/lib/sequel/extensions/schema_dumper.rb +13 -13
  154. data/lib/sequel/extensions/select_remove.rb +3 -3
  155. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  156. data/lib/sequel/extensions/sql_comments.rb +2 -2
  157. data/lib/sequel/extensions/string_agg.rb +11 -8
  158. data/lib/sequel/extensions/symbol_aref.rb +6 -20
  159. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  160. data/lib/sequel/model/associations.rb +129 -131
  161. data/lib/sequel/model/base.rb +133 -731
  162. data/lib/sequel/model/default_inflections.rb +1 -1
  163. data/lib/sequel/model/errors.rb +0 -3
  164. data/lib/sequel/model/exceptions.rb +2 -6
  165. data/lib/sequel/model/inflections.rb +1 -26
  166. data/lib/sequel/model/plugins.rb +1 -0
  167. data/lib/sequel/model.rb +27 -62
  168. data/lib/sequel/plugins/active_model.rb +2 -5
  169. data/lib/sequel/plugins/association_dependencies.rb +15 -15
  170. data/lib/sequel/plugins/association_pks.rb +14 -28
  171. data/lib/sequel/plugins/association_proxies.rb +6 -7
  172. data/lib/sequel/plugins/auto_validations.rb +4 -4
  173. data/lib/sequel/plugins/before_after_save.rb +0 -43
  174. data/lib/sequel/plugins/blacklist_security.rb +9 -8
  175. data/lib/sequel/plugins/boolean_readers.rb +3 -3
  176. data/lib/sequel/plugins/boolean_subsets.rb +2 -2
  177. data/lib/sequel/plugins/caching.rb +5 -5
  178. data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
  179. data/lib/sequel/plugins/column_conflicts.rb +2 -2
  180. data/lib/sequel/plugins/column_select.rb +2 -2
  181. data/lib/sequel/plugins/composition.rb +15 -24
  182. data/lib/sequel/plugins/constraint_validations.rb +4 -3
  183. data/lib/sequel/plugins/csv_serializer.rb +13 -20
  184. data/lib/sequel/plugins/dataset_associations.rb +2 -2
  185. data/lib/sequel/plugins/def_dataset_method.rb +5 -5
  186. data/lib/sequel/plugins/defaults_setter.rb +1 -1
  187. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  188. data/lib/sequel/plugins/finder.rb +16 -10
  189. data/lib/sequel/plugins/force_encoding.rb +1 -7
  190. data/lib/sequel/plugins/hook_class_methods.rb +4 -106
  191. data/lib/sequel/plugins/input_transformer.rb +10 -11
  192. data/lib/sequel/plugins/insert_returning_select.rb +1 -9
  193. data/lib/sequel/plugins/instance_filters.rb +5 -5
  194. data/lib/sequel/plugins/instance_hooks.rb +7 -52
  195. data/lib/sequel/plugins/inverted_subsets.rb +3 -1
  196. data/lib/sequel/plugins/json_serializer.rb +19 -19
  197. data/lib/sequel/plugins/lazy_attributes.rb +1 -10
  198. data/lib/sequel/plugins/list.rb +6 -6
  199. data/lib/sequel/plugins/many_through_many.rb +11 -8
  200. data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
  201. data/lib/sequel/plugins/nested_attributes.rb +18 -31
  202. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  203. data/lib/sequel/plugins/pg_array_associations.rb +8 -2
  204. data/lib/sequel/plugins/pg_row.rb +2 -11
  205. data/lib/sequel/plugins/prepared_statements.rb +13 -66
  206. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
  207. data/lib/sequel/plugins/rcte_tree.rb +7 -7
  208. data/lib/sequel/plugins/serialization.rb +15 -33
  209. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  210. data/lib/sequel/plugins/sharding.rb +2 -8
  211. data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
  212. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  213. data/lib/sequel/plugins/static_cache.rb +8 -9
  214. data/lib/sequel/plugins/string_stripper.rb +3 -3
  215. data/lib/sequel/plugins/subclasses.rb +1 -1
  216. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  217. data/lib/sequel/plugins/table_select.rb +2 -2
  218. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  219. data/lib/sequel/plugins/timestamps.rb +6 -7
  220. data/lib/sequel/plugins/touch.rb +4 -8
  221. data/lib/sequel/plugins/tree.rb +3 -3
  222. data/lib/sequel/plugins/typecast_on_load.rb +2 -2
  223. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  224. data/lib/sequel/plugins/update_or_create.rb +3 -3
  225. data/lib/sequel/plugins/update_refresh.rb +3 -3
  226. data/lib/sequel/plugins/uuid.rb +7 -11
  227. data/lib/sequel/plugins/validation_class_methods.rb +10 -9
  228. data/lib/sequel/plugins/validation_contexts.rb +4 -4
  229. data/lib/sequel/plugins/validation_helpers.rb +26 -25
  230. data/lib/sequel/plugins/whitelist_security.rb +13 -9
  231. data/lib/sequel/plugins/xml_serializer.rb +24 -25
  232. data/lib/sequel/sql.rb +145 -276
  233. data/lib/sequel/timezones.rb +8 -23
  234. data/lib/sequel/version.rb +2 -2
  235. data/lib/sequel.rb +1 -1
  236. data/spec/adapter_spec.rb +1 -1
  237. data/spec/adapters/db2_spec.rb +2 -103
  238. data/spec/adapters/mssql_spec.rb +89 -68
  239. data/spec/adapters/mysql_spec.rb +111 -478
  240. data/spec/adapters/oracle_spec.rb +1 -9
  241. data/spec/adapters/postgres_spec.rb +459 -664
  242. data/spec/adapters/spec_helper.rb +12 -31
  243. data/spec/adapters/sqlanywhere_spec.rb +2 -77
  244. data/spec/adapters/sqlite_spec.rb +8 -146
  245. data/spec/bin_spec.rb +11 -16
  246. data/spec/core/connection_pool_spec.rb +173 -74
  247. data/spec/core/database_spec.rb +96 -244
  248. data/spec/core/dataset_spec.rb +99 -414
  249. data/spec/core/deprecated_spec.rb +3 -3
  250. data/spec/core/expression_filters_spec.rb +37 -144
  251. data/spec/core/mock_adapter_spec.rb +241 -4
  252. data/spec/core/object_graph_spec.rb +11 -60
  253. data/spec/core/placeholder_literalizer_spec.rb +1 -14
  254. data/spec/core/schema_generator_spec.rb +51 -40
  255. data/spec/core/schema_spec.rb +88 -77
  256. data/spec/core/spec_helper.rb +6 -24
  257. data/spec/core/version_spec.rb +1 -1
  258. data/spec/core_extensions_spec.rb +7 -83
  259. data/spec/core_model_spec.rb +2 -2
  260. data/spec/deprecation_helper.rb +2 -14
  261. data/spec/extensions/accessed_columns_spec.rb +1 -1
  262. data/spec/extensions/active_model_spec.rb +3 -3
  263. data/spec/extensions/after_initialize_spec.rb +1 -1
  264. data/spec/extensions/arbitrary_servers_spec.rb +2 -2
  265. data/spec/extensions/association_dependencies_spec.rb +1 -1
  266. data/spec/extensions/association_pks_spec.rb +30 -92
  267. data/spec/extensions/association_proxies_spec.rb +1 -1
  268. data/spec/extensions/auto_literal_strings_spec.rb +1 -12
  269. data/spec/extensions/auto_validations_spec.rb +1 -1
  270. data/spec/extensions/blacklist_security_spec.rb +1 -1
  271. data/spec/extensions/blank_spec.rb +1 -1
  272. data/spec/extensions/boolean_readers_spec.rb +1 -1
  273. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  274. data/spec/extensions/caching_spec.rb +1 -1
  275. data/spec/extensions/class_table_inheritance_spec.rb +53 -1118
  276. data/spec/extensions/column_conflicts_spec.rb +1 -1
  277. data/spec/extensions/column_select_spec.rb +4 -4
  278. data/spec/extensions/columns_introspection_spec.rb +1 -1
  279. data/spec/extensions/columns_updated_spec.rb +1 -1
  280. data/spec/extensions/composition_spec.rb +8 -30
  281. data/spec/extensions/connection_expiration_spec.rb +3 -3
  282. data/spec/extensions/connection_validator_spec.rb +3 -3
  283. data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
  284. data/spec/extensions/constraint_validations_spec.rb +1 -1
  285. data/spec/extensions/core_refinements_spec.rb +1 -3
  286. data/spec/extensions/csv_serializer_spec.rb +4 -9
  287. data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
  288. data/spec/extensions/dataset_associations_spec.rb +2 -1
  289. data/spec/extensions/dataset_source_alias_spec.rb +1 -1
  290. data/spec/extensions/date_arithmetic_spec.rb +3 -3
  291. data/spec/extensions/def_dataset_method_spec.rb +1 -1
  292. data/spec/extensions/defaults_setter_spec.rb +2 -2
  293. data/spec/extensions/delay_add_association_spec.rb +8 -9
  294. data/spec/extensions/dirty_spec.rb +1 -1
  295. data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
  296. data/spec/extensions/eager_each_spec.rb +2 -2
  297. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  298. data/spec/extensions/error_splitter_spec.rb +1 -1
  299. data/spec/extensions/error_sql_spec.rb +1 -1
  300. data/spec/extensions/eval_inspect_spec.rb +1 -1
  301. data/spec/extensions/finder_spec.rb +1 -1
  302. data/spec/extensions/force_encoding_spec.rb +2 -5
  303. data/spec/extensions/freeze_datasets_spec.rb +1 -1
  304. data/spec/extensions/graph_each_spec.rb +5 -5
  305. data/spec/extensions/hook_class_methods_spec.rb +1 -194
  306. data/spec/extensions/identifier_mangling_spec.rb +17 -170
  307. data/spec/extensions/implicit_subquery_spec.rb +1 -5
  308. data/spec/extensions/inflector_spec.rb +1 -1
  309. data/spec/extensions/input_transformer_spec.rb +7 -2
  310. data/spec/extensions/insert_returning_select_spec.rb +1 -1
  311. data/spec/extensions/instance_filters_spec.rb +1 -1
  312. data/spec/extensions/instance_hooks_spec.rb +1 -95
  313. data/spec/extensions/inverted_subsets_spec.rb +1 -1
  314. data/spec/extensions/json_serializer_spec.rb +1 -1
  315. data/spec/extensions/lazy_attributes_spec.rb +1 -7
  316. data/spec/extensions/list_spec.rb +5 -6
  317. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  318. data/spec/extensions/many_through_many_spec.rb +25 -33
  319. data/spec/extensions/migration_spec.rb +12 -2
  320. data/spec/extensions/modification_detection_spec.rb +1 -1
  321. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  322. data/spec/extensions/named_timezones_spec.rb +3 -3
  323. data/spec/extensions/nested_attributes_spec.rb +1 -29
  324. data/spec/extensions/null_dataset_spec.rb +1 -11
  325. data/spec/extensions/optimistic_locking_spec.rb +2 -2
  326. data/spec/extensions/pagination_spec.rb +1 -1
  327. data/spec/extensions/pg_array_associations_spec.rb +22 -26
  328. data/spec/extensions/pg_array_ops_spec.rb +1 -1
  329. data/spec/extensions/pg_array_spec.rb +3 -48
  330. data/spec/extensions/pg_enum_spec.rb +1 -1
  331. data/spec/extensions/pg_extended_date_support_spec.rb +122 -0
  332. data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
  333. data/spec/extensions/pg_hstore_spec.rb +22 -31
  334. data/spec/extensions/pg_inet_ops_spec.rb +1 -1
  335. data/spec/extensions/pg_inet_spec.rb +1 -14
  336. data/spec/extensions/pg_interval_spec.rb +3 -13
  337. data/spec/extensions/pg_json_ops_spec.rb +1 -1
  338. data/spec/extensions/pg_json_spec.rb +1 -13
  339. data/spec/extensions/pg_loose_count_spec.rb +1 -1
  340. data/spec/extensions/pg_range_ops_spec.rb +1 -1
  341. data/spec/extensions/pg_range_spec.rb +3 -88
  342. data/spec/extensions/pg_row_ops_spec.rb +1 -1
  343. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  344. data/spec/extensions/pg_row_spec.rb +1 -44
  345. data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
  346. data/spec/extensions/prepared_statements_safe_spec.rb +7 -7
  347. data/spec/extensions/prepared_statements_spec.rb +13 -48
  348. data/spec/extensions/pretty_table_spec.rb +40 -9
  349. data/spec/extensions/query_spec.rb +1 -12
  350. data/spec/extensions/rcte_tree_spec.rb +23 -34
  351. data/spec/extensions/round_timestamps_spec.rb +1 -5
  352. data/spec/extensions/s_spec.rb +1 -1
  353. data/spec/extensions/schema_caching_spec.rb +1 -1
  354. data/spec/extensions/schema_dumper_spec.rb +43 -32
  355. data/spec/extensions/select_remove_spec.rb +1 -1
  356. data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
  357. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  358. data/spec/extensions/serialization_spec.rb +5 -17
  359. data/spec/extensions/server_block_spec.rb +1 -1
  360. data/spec/extensions/server_logging_spec.rb +2 -2
  361. data/spec/extensions/sharding_spec.rb +1 -1
  362. data/spec/extensions/shared_caching_spec.rb +1 -28
  363. data/spec/extensions/single_table_inheritance_spec.rb +2 -5
  364. data/spec/extensions/singular_table_names_spec.rb +1 -1
  365. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  366. data/spec/extensions/spec_helper.rb +5 -27
  367. data/spec/extensions/split_array_nil_spec.rb +1 -1
  368. data/spec/extensions/split_values_spec.rb +1 -1
  369. data/spec/extensions/sql_comments_spec.rb +1 -1
  370. data/spec/extensions/sql_expr_spec.rb +1 -1
  371. data/spec/extensions/static_cache_spec.rb +1 -1
  372. data/spec/extensions/string_agg_spec.rb +2 -2
  373. data/spec/extensions/string_date_time_spec.rb +1 -1
  374. data/spec/extensions/string_stripper_spec.rb +1 -1
  375. data/spec/extensions/subclasses_spec.rb +1 -1
  376. data/spec/extensions/subset_conditions_spec.rb +1 -1
  377. data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
  378. data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
  379. data/spec/extensions/synchronize_sql_spec.rb +124 -0
  380. data/spec/extensions/table_select_spec.rb +4 -4
  381. data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
  382. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  383. data/spec/extensions/timestamps_spec.rb +5 -7
  384. data/spec/extensions/to_dot_spec.rb +1 -1
  385. data/spec/extensions/touch_spec.rb +1 -1
  386. data/spec/extensions/tree_spec.rb +1 -1
  387. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  388. data/spec/extensions/unlimited_update_spec.rb +1 -1
  389. data/spec/extensions/update_or_create_spec.rb +12 -16
  390. data/spec/extensions/update_primary_key_spec.rb +4 -3
  391. data/spec/extensions/update_refresh_spec.rb +1 -1
  392. data/spec/extensions/uuid_spec.rb +10 -13
  393. data/spec/extensions/validate_associated_spec.rb +1 -1
  394. data/spec/extensions/validation_class_methods_spec.rb +3 -3
  395. data/spec/extensions/validation_contexts_spec.rb +1 -1
  396. data/spec/extensions/validation_helpers_spec.rb +10 -44
  397. data/spec/extensions/whitelist_security_spec.rb +5 -5
  398. data/spec/extensions/xml_serializer_spec.rb +8 -13
  399. data/spec/guards_helper.rb +2 -1
  400. data/spec/integration/associations_test.rb +1 -23
  401. data/spec/integration/database_test.rb +7 -7
  402. data/spec/integration/dataset_test.rb +12 -47
  403. data/spec/integration/eager_loader_test.rb +1 -1
  404. data/spec/integration/migrator_test.rb +1 -1
  405. data/spec/integration/model_test.rb +4 -82
  406. data/spec/integration/plugin_test.rb +7 -23
  407. data/spec/integration/prepared_statement_test.rb +8 -88
  408. data/spec/integration/schema_test.rb +10 -10
  409. data/spec/integration/spec_helper.rb +17 -21
  410. data/spec/integration/timezone_test.rb +5 -5
  411. data/spec/integration/transaction_test.rb +3 -55
  412. data/spec/integration/type_test.rb +9 -9
  413. data/spec/model/association_reflection_spec.rb +24 -9
  414. data/spec/model/associations_spec.rb +124 -303
  415. data/spec/model/base_spec.rb +43 -137
  416. data/spec/model/class_dataset_methods_spec.rb +2 -20
  417. data/spec/model/dataset_methods_spec.rb +1 -20
  418. data/spec/model/eager_loading_spec.rb +48 -17
  419. data/spec/model/hooks_spec.rb +5 -300
  420. data/spec/model/inflector_spec.rb +1 -1
  421. data/spec/model/model_spec.rb +29 -339
  422. data/spec/model/plugins_spec.rb +2 -16
  423. data/spec/model/record_spec.rb +33 -129
  424. data/spec/model/spec_helper.rb +5 -15
  425. data/spec/model/validations_spec.rb +1 -1
  426. data/spec/sequel_warning.rb +1 -12
  427. metadata +19 -65
  428. data/doc/active_record.rdoc +0 -927
  429. data/lib/sequel/adapters/cubrid.rb +0 -160
  430. data/lib/sequel/adapters/do/mysql.rb +0 -69
  431. data/lib/sequel/adapters/do/postgres.rb +0 -46
  432. data/lib/sequel/adapters/do/sqlite3.rb +0 -41
  433. data/lib/sequel/adapters/do.rb +0 -166
  434. data/lib/sequel/adapters/jdbc/as400.rb +0 -92
  435. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
  436. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
  437. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
  438. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
  439. data/lib/sequel/adapters/odbc/progress.rb +0 -12
  440. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  441. data/lib/sequel/adapters/shared/firebird.rb +0 -261
  442. data/lib/sequel/adapters/shared/informix.rb +0 -63
  443. data/lib/sequel/adapters/shared/progress.rb +0 -40
  444. data/lib/sequel/adapters/swift/mysql.rb +0 -50
  445. data/lib/sequel/adapters/swift/postgres.rb +0 -49
  446. data/lib/sequel/adapters/swift/sqlite.rb +0 -48
  447. data/lib/sequel/adapters/swift.rb +0 -169
  448. data/lib/sequel/adapters/utils/pg_types.rb +0 -4
  449. data/lib/sequel/dataset/mutation.rb +0 -98
  450. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
  451. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
  452. data/lib/sequel/extensions/filter_having.rb +0 -65
  453. data/lib/sequel/extensions/hash_aliases.rb +0 -51
  454. data/lib/sequel/extensions/meta_def.rb +0 -37
  455. data/lib/sequel/extensions/query_literals.rb +0 -86
  456. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
  457. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
  458. data/lib/sequel/extensions/set_overrides.rb +0 -82
  459. data/lib/sequel/no_core_ext.rb +0 -4
  460. data/lib/sequel/plugins/association_autoreloading.rb +0 -11
  461. data/lib/sequel/plugins/identifier_columns.rb +0 -49
  462. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
  463. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
  464. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
  465. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
  466. data/lib/sequel/plugins/schema.rb +0 -84
  467. data/lib/sequel/plugins/scissors.rb +0 -37
  468. data/spec/core/dataset_mutation_spec.rb +0 -253
  469. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
  470. data/spec/extensions/before_after_save_spec.rb +0 -40
  471. data/spec/extensions/filter_having_spec.rb +0 -42
  472. data/spec/extensions/from_block_spec.rb +0 -21
  473. data/spec/extensions/hash_aliases_spec.rb +0 -26
  474. data/spec/extensions/identifier_columns_spec.rb +0 -19
  475. data/spec/extensions/meta_def_spec.rb +0 -35
  476. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
  477. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
  478. data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
  479. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
  480. data/spec/extensions/query_literals_spec.rb +0 -185
  481. data/spec/extensions/schema_spec.rb +0 -123
  482. data/spec/extensions/scissors_spec.rb +0 -27
  483. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
  484. data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -22,7 +22,7 @@
22
22
  # generally want to create it first, before creating any other application
23
23
  # tables.
24
24
  #
25
- # Because migrations instance_eval the up and down blocks on a database,
25
+ # Because migrations instance_exec the up and down blocks on a database,
26
26
  # using this extension in a migration can be done via:
27
27
  #
28
28
  # Sequel.migration do
@@ -43,7 +43,7 @@
43
43
  # similar to the validation_helpers model plugin API. However,
44
44
  # instead of having separate validates_* methods, it just adds a validate
45
45
  # method that accepts a block to the schema generators. Like the
46
- # create_table and alter_table blocks, this block is instance_evaled and
46
+ # create_table and alter_table blocks, this block is instance_execed and
47
47
  # offers its own DSL. Example:
48
48
  #
49
49
  # DB.create_table(:table) do
@@ -56,8 +56,8 @@
56
56
  # end
57
57
  # end
58
58
  #
59
- # instance_eval is used in this case because create_table and alter_table
60
- # already use instance_eval, so losing access to the surrounding receiver
59
+ # instance_exec is used in this case because create_table and alter_table
60
+ # already use instance_exec, so losing access to the surrounding receiver
61
61
  # is not an issue.
62
62
  #
63
63
  # Here's a breakdown of the constraints created for each constraint validation
@@ -196,9 +196,9 @@ module Sequel
196
196
  @generator.validation({:type=>:drop, :name=>constraint})
197
197
  end
198
198
 
199
- # Alias of instance_eval for a nicer API.
199
+ # Alias of instance_exec for a nicer API.
200
200
  def process(&block)
201
- instance_eval(&block)
201
+ instance_exec(&block)
202
202
  end
203
203
  end
204
204
 
@@ -260,7 +260,7 @@ module Sequel
260
260
  super do
261
261
  extend CreateTableGeneratorMethods
262
262
  @validations = []
263
- instance_eval(&block) if block
263
+ instance_exec(&block) if block
264
264
  end
265
265
  end
266
266
 
@@ -308,7 +308,7 @@ module Sequel
308
308
  super do
309
309
  extend AlterTableGeneratorMethods
310
310
  @validations = []
311
- instance_eval(&block) if block
311
+ instance_exec(&block) if block
312
312
  end
313
313
  end
314
314
 
@@ -374,10 +374,10 @@ module Sequel
374
374
  when :max_length
375
375
  generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| Sequel.char_length(c) <= arg}))
376
376
  when *REVERSE_OPERATOR_MAP.keys
377
- generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| Sequel.identifier(c).send(REVERSE_OPERATOR_MAP[validation_type], arg)}))
377
+ generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| Sequel.identifier(c).public_send(REVERSE_OPERATOR_MAP[validation_type], arg)}))
378
378
  when :length_range
379
379
  op = arg.exclude_end? ? :< : :<=
380
- generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| (Sequel.char_length(c) >= arg.begin) & Sequel.char_length(c).send(op, arg.end)}))
380
+ generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| (Sequel.char_length(c) >= arg.begin) & Sequel.char_length(c).public_send(op, arg.end)}))
381
381
  arg = "#{arg.begin}..#{'.' if arg.exclude_end?}#{arg.end}"
382
382
  when :format
383
383
  generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| {c => arg}}))
@@ -407,7 +407,7 @@ module Sequel
407
407
  raise Error, "validates includes only supports arrays and ranges currently, cannot handle: #{arg.inspect}"
408
408
  end
409
409
  when :like, :ilike
410
- generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| Sequel.send(validation_type, c, arg)}))
410
+ generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| Sequel.public_send(validation_type, c, arg)}))
411
411
  when :unique
412
412
  generator.unique(columns, :name=>constraint)
413
413
  columns = [columns.join(',')]
@@ -21,8 +21,8 @@ class Array
21
21
  # Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, not matching all of the
22
22
  # conditions.
23
23
  #
24
- # ~[[:a, true]] # SQL: a IS NOT TRUE
25
- # ~[[:a, 1], [:b, [2, 3]]] # SQL: a != 1 OR b NOT IN (2, 3)
24
+ # ~[[:a, true]] # SQL: (a IS NOT TRUE)
25
+ # ~[[:a, 1], [:b, [2, 3]]] # SQL: ((a != 1) OR (b NOT IN (2, 3)))
26
26
  def ~
27
27
  Sequel.~(self)
28
28
  end
@@ -30,7 +30,7 @@ class Array
30
30
  # Return a <tt>Sequel::SQL::CaseExpression</tt> with this array as the conditions and the given
31
31
  # default value and expression.
32
32
  #
33
- # [[{:a=>[2,3]}, 1]].case(0) # SQL: CASE WHEN a IN (2, 3) THEN 1 ELSE 0 END
33
+ # [[{a: [2,3]}, 1]].case(0) # SQL: CASE WHEN (a IN (2, 3)) THEN 1 ELSE 0 END
34
34
  # [[:a, 1], [:b, 2]].case(:d, :c) # SQL: CASE c WHEN a THEN 1 WHEN b THEN 2 ELSE d END
35
35
  def case(*args)
36
36
  ::Sequel::SQL::CaseExpression.new(self, *args)
@@ -42,16 +42,12 @@ class Array
42
42
  # this array as a value in a filter, but may be necessary if you are using it as a
43
43
  # value with placeholder SQL:
44
44
  #
45
- # DB[:a].where([:a, :b]=>[[1, 2], [3, 4]]) # SQL: (a, b) IN ((1, 2), (3, 4))
46
- # DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]]) # SQL: (a, b) IN ((1 = 2) AND (3 = 4))
47
- # DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]].sql_value_list) # SQL: (a, b) IN ((1, 2), (3, 4))
45
+ # DB[:a].where([:a, :b]=>[[1, 2], [3, 4]]) # SQL: ((a, b) IN ((1, 2), (3, 4)))
46
+ # DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]]) # SQL: ((a, b) IN ((1 = 2) AND (3 = 4)))
47
+ # DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]].sql_value_list) # SQL: ((a, b) IN ((1, 2), (3, 4)))
48
48
  def sql_value_list
49
49
  ::Sequel::SQL::ValueList.new(self)
50
50
  end
51
- def sql_array
52
- Sequel::Deprecation.deprecate("Array#sql_array in the core_extensions extension", "Use Array#sql_value_list instead")
53
- sql_value_list
54
- end
55
51
 
56
52
  # Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, matching all of the
57
53
  # conditions. Rarely do you need to call this explicitly, as Sequel generally
@@ -60,8 +56,8 @@ class Array
60
56
  # and want to use the = operator instead of the IN operator (which is used by default for
61
57
  # arrays of two element arrays).
62
58
  #
63
- # [[:a, true]].sql_expr # SQL: a IS TRUE
64
- # [[:a, 1], [:b, [2, 3]]].sql_expr # SQL: a = 1 AND b IN (2, 3)
59
+ # [[:a, true]].sql_expr # SQL: (a IS TRUE)
60
+ # [[:a, 1], [:b, [2, 3]]].sql_expr # SQL: ((a = 1) AND (b IN (2, 3)))
65
61
  def sql_expr
66
62
  Sequel[self]
67
63
  end
@@ -69,8 +65,8 @@ class Array
69
65
  # Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, matching none
70
66
  # of the conditions.
71
67
  #
72
- # [[:a, true]].sql_negate # SQL: a IS NOT TRUE
73
- # [[:a, 1], [:b, [2, 3]]].sql_negate # SQL: a != 1 AND b NOT IN (2, 3)
68
+ # [[:a, true]].sql_negate # SQL: (a IS NOT TRUE)
69
+ # [[:a, 1], [:b, [2, 3]]].sql_negate # SQL: ((a != 1) AND (b NOT IN (2, 3)))
74
70
  def sql_negate
75
71
  Sequel.negate(self)
76
72
  end
@@ -78,8 +74,8 @@ class Array
78
74
  # Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, matching any of the
79
75
  # conditions.
80
76
  #
81
- # [[:a, true]].sql_or # SQL: a IS TRUE
82
- # [[:a, 1], [:b, [2, 3]]].sql_or # SQL: a = 1 OR b IN (2, 3)
77
+ # [[:a, true]].sql_or # SQL: (a IS TRUE)
78
+ # [[:a, 1], [:b, [2, 3]]].sql_or # SQL: ((a = 1) OR (b IN (2, 3)))
83
79
  def sql_or
84
80
  Sequel.or(self)
85
81
  end
@@ -90,9 +86,9 @@ class Array
90
86
  # concatenation.
91
87
  #
92
88
  # [:a].sql_string_join # SQL: a
93
- # [:a, :b].sql_string_join # SQL: a || b
94
- # [:a, 'b'].sql_string_join # SQL: a || 'b'
95
- # ['a', :b].sql_string_join(' ') # SQL: 'a' || ' ' || b
89
+ # [:a, :b].sql_string_join # SQL: (a || b)
90
+ # [:a, 'b'].sql_string_join # SQL: (a || 'b')
91
+ # ['a', :b].sql_string_join(' ') # SQL: ('a' || ' ' || b)
96
92
  def sql_string_join(joiner=nil)
97
93
  Sequel.join(self, joiner)
98
94
  end
@@ -104,8 +100,8 @@ class Hash
104
100
  # all of the conditions in this hash and the condition specified by
105
101
  # the given argument.
106
102
  #
107
- # {:a=>1} & :b # SQL: a = 1 AND b
108
- # {:a=>true} & ~:b # SQL: a IS TRUE AND NOT b
103
+ # {a: 1} & :b # SQL: ((a = 1) AND b)
104
+ # {a: true} & ~:b # SQL: ((a IS TRUE) AND NOT b)
109
105
  def &(ce)
110
106
  ::Sequel::SQL::BooleanExpression.new(:AND, self, ce)
111
107
  end
@@ -114,8 +110,8 @@ class Hash
114
110
  # all of the conditions in this hash or the condition specified by
115
111
  # the given argument.
116
112
  #
117
- # {:a=>1} | :b # SQL: a = 1 OR b
118
- # {:a=>true} | ~:b # SQL: a IS TRUE OR NOT b
113
+ # {a: 1} | :b # SQL: ((a = 1) OR b)
114
+ # {a: true} | ~:b # SQL: ((a IS TRUE) OR NOT b)
119
115
  def |(ce)
120
116
  ::Sequel::SQL::BooleanExpression.new(:OR, self, ce)
121
117
  end
@@ -123,19 +119,17 @@ class Hash
123
119
  # Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, not matching all of the
124
120
  # conditions.
125
121
  #
126
- # ~{:a=>true} # SQL: a IS NOT TRUE
127
- # ~{:a=>1, :b=>[2, 3]} # SQL: a != 1 OR b NOT IN (2, 3)
122
+ # ~{a: true} # SQL: (a IS NOT TRUE)
123
+ # ~{a: 1, b: [2, 3]} # SQL: ((a != 1) OR (b NOT IN (2, 3)))
128
124
  def ~
129
125
  ::Sequel::SQL::BooleanExpression.from_value_pairs(self, :OR, true)
130
126
  end
131
127
 
132
128
  # Return a <tt>Sequel::SQL::CaseExpression</tt> with this hash as the conditions and the given
133
- # default value. Note that the order of the conditions will be arbitrary on ruby 1.8, so all
134
- # conditions should be orthogonal.
129
+ # default value.
135
130
  #
136
- # {{:a=>[2,3]}=>1}.case(0) # SQL: CASE WHEN a IN (2, 3) THEN 1 ELSE 0 END
137
- # {:a=>1, :b=>2}.case(:d, :c) # SQL: CASE c WHEN a THEN 1 WHEN b THEN 2 ELSE d END
138
- # # or: CASE c WHEN b THEN 2 WHEN a THEN 1 ELSE d END
131
+ # {{a: [2,3]}=>1}.case(0) # SQL: CASE WHEN (a IN (2, 3)) THEN 1 ELSE 0 END
132
+ # {a: 1, b: 2}.case(:d, :c) # SQL: CASE c WHEN a THEN 1 WHEN b THEN 2 ELSE d END
139
133
  def case(*args)
140
134
  ::Sequel::SQL::CaseExpression.new(to_a, *args)
141
135
  end
@@ -144,8 +138,8 @@ class Hash
144
138
  # conditions. Rarely do you need to call this explicitly, as Sequel generally
145
139
  # assumes that hashes specify this type of condition.
146
140
  #
147
- # {:a=>true}.sql_expr # SQL: a IS TRUE
148
- # {:a=>1, :b=>[2, 3]}.sql_expr # SQL: a = 1 AND b IN (2, 3)
141
+ # {a: true}.sql_expr # SQL: (a IS TRUE)
142
+ # {a: 1, b: [2, 3]}.sql_expr # SQL: ((a = 1) AND (b IN (2, 3)))
149
143
  def sql_expr
150
144
  ::Sequel::SQL::BooleanExpression.from_value_pairs(self)
151
145
  end
@@ -153,8 +147,8 @@ class Hash
153
147
  # Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, matching none
154
148
  # of the conditions.
155
149
  #
156
- # {:a=>true}.sql_negate # SQL: a IS NOT TRUE
157
- # {:a=>1, :b=>[2, 3]}.sql_negate # SQL: a != 1 AND b NOT IN (2, 3)
150
+ # {a: true}.sql_negate # SQL: (a IS NOT TRUE)
151
+ # {a: 1, b: [2, 3]}.sql_negate # SQL: ((a != 1) AND (b NOT IN (2, 3)))
158
152
  def sql_negate
159
153
  ::Sequel::SQL::BooleanExpression.from_value_pairs(self, :AND, true)
160
154
  end
@@ -162,8 +156,8 @@ class Hash
162
156
  # Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, matching any of the
163
157
  # conditions.
164
158
  #
165
- # {:a=>true}.sql_or # SQL: a IS TRUE
166
- # {:a=>1, :b=>[2, 3]}.sql_or # SQL: a = 1 OR b IN (2, 3)
159
+ # {a: true}.sql_or # SQL: (a IS TRUE)
160
+ # {a: 1, b: [2, 3]}.sql_or # SQL: ((a = 1) OR (b IN (2, 3)))
167
161
  def sql_or
168
162
  ::Sequel::SQL::BooleanExpression.from_value_pairs(self, :OR)
169
163
  end
@@ -177,16 +171,16 @@ class String
177
171
  # Converts a string into a <tt>Sequel::LiteralString</tt>, in order to override string
178
172
  # literalization, e.g.:
179
173
  #
180
- # DB[:items].where(:abc => 'def').sql #=>
181
- # "SELECT * FROM items WHERE (abc = 'def')"
174
+ # DB[:items].where(abc: 'def')
175
+ # # "SELECT * FROM items WHERE (abc = 'def')"
182
176
  #
183
- # DB[:items].where(:abc => 'def'.lit).sql #=>
184
- # "SELECT * FROM items WHERE (abc = def)"
177
+ # DB[:items].where(abc: 'def'.lit)
178
+ # # "SELECT * FROM items WHERE (abc = def)"
185
179
  #
186
180
  # You can also provide arguments, to create a <tt>Sequel::SQL::PlaceholderLiteralString</tt>:
187
181
  #
188
- # DB[:items].select{|o| o.count('DISTINCT ?'.lit(:a))}.sql #=>
189
- # "SELECT count(DISTINCT a) FROM items"
182
+ # DB[:items].select{|o| o.count('DISTINCT ?'.lit(:a))}
183
+ # # "SELECT count(DISTINCT a) FROM items"
190
184
  def lit(*args)
191
185
  args.empty? ? Sequel::LiteralString.new(self) : Sequel::SQL::PlaceholderLiteralString.new(self, args)
192
186
  end
@@ -209,19 +203,15 @@ class Symbol
209
203
  include Sequel::SQL::SubscriptMethods
210
204
  include Sequel::SQL::ComplexExpressionMethods
211
205
 
212
- # Returns receiver wrapped in an <tt>Sequel::SQL::Identifier</tt>. Usually used to
213
- # prevent splitting the symbol.
206
+ # Returns receiver wrapped in an <tt>Sequel::SQL::Identifier</tt>.
214
207
  #
215
- # :a__b # SQL: "a"."b"
216
- # :a__b.identifier # SQL: "a__b"
208
+ # :a.identifier # SQL: "a"
217
209
  def identifier
218
210
  Sequel::SQL::Identifier.new(self)
219
211
  end
220
212
 
221
213
  # Returns a <tt>Sequel::SQL::Function</tt> with this as the function name,
222
- # and the given arguments. This is aliased as <tt>Symbol#[]</tt> if the RUBY_VERSION
223
- # is less than 1.9.0. Ruby 1.9 defines <tt>Symbol#[]</tt>, and Sequel
224
- # doesn't override methods defined by ruby itself.
214
+ # and the given arguments.
225
215
  #
226
216
  # :now.sql_function # SQL: now()
227
217
  # :sum.sql_function(:a) # SQL: sum(a)
@@ -17,8 +17,8 @@ module Sequel::CoreRefinements
17
17
  # Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, not matching all of the
18
18
  # conditions.
19
19
  #
20
- # ~[[:a, true]] # SQL: a IS NOT TRUE
21
- # ~[[:a, 1], [:b, [2, 3]]] # SQL: a != 1 OR b NOT IN (2, 3)
20
+ # ~[[:a, true]] # SQL: (a IS NOT TRUE)
21
+ # ~[[:a, 1], [:b, [2, 3]]] # SQL: ((a != 1) OR (b NOT IN (2, 3)))
22
22
  def ~
23
23
  Sequel.~(self)
24
24
  end
@@ -26,7 +26,7 @@ module Sequel::CoreRefinements
26
26
  # Return a <tt>Sequel::SQL::CaseExpression</tt> with this array as the conditions and the given
27
27
  # default value and expression.
28
28
  #
29
- # [[{:a=>[2,3]}, 1]].case(0) # SQL: CASE WHEN a IN (2, 3) THEN 1 ELSE 0 END
29
+ # [[{a: [2,3]}, 1]].case(0) # SQL: CASE WHEN (a IN (2, 3)) THEN 1 ELSE 0 END
30
30
  # [[:a, 1], [:b, 2]].case(:d, :c) # SQL: CASE c WHEN a THEN 1 WHEN b THEN 2 ELSE d END
31
31
  def case(*args)
32
32
  ::Sequel::SQL::CaseExpression.new(self, *args)
@@ -38,9 +38,9 @@ module Sequel::CoreRefinements
38
38
  # this array as a value in a filter, but may be necessary if you are using it as a
39
39
  # value with placeholder SQL:
40
40
  #
41
- # DB[:a].where([:a, :b]=>[[1, 2], [3, 4]]) # SQL: (a, b) IN ((1, 2), (3, 4))
42
- # DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]]) # SQL: (a, b) IN ((1 = 2) AND (3 = 4))
43
- # DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]].sql_value_list) # SQL: (a, b) IN ((1, 2), (3, 4))
41
+ # DB[:a].where([:a, :b]=>[[1, 2], [3, 4]]) # SQL: ((a, b) IN ((1, 2), (3, 4)))
42
+ # DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]]) # SQL: ((a, b) IN ((1 = 2) AND (3 = 4)))
43
+ # DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]].sql_value_list) # SQL: ((a, b) IN ((1, 2), (3, 4)))
44
44
  def sql_value_list
45
45
  ::Sequel::SQL::ValueList.new(self)
46
46
  end
@@ -52,8 +52,8 @@ module Sequel::CoreRefinements
52
52
  # and want to use the = operator instead of the IN operator (which is used by default for
53
53
  # arrays of two element arrays).
54
54
  #
55
- # [[:a, true]].sql_expr # SQL: a IS TRUE
56
- # [[:a, 1], [:b, [2, 3]]].sql_expr # SQL: a = 1 AND b IN (2, 3)
55
+ # [[:a, true]].sql_expr # SQL: (a IS TRUE)
56
+ # [[:a, 1], [:b, [2, 3]]].sql_expr # SQL: ((a = 1) AND (b IN (2, 3)))
57
57
  def sql_expr
58
58
  Sequel[self]
59
59
  end
@@ -61,8 +61,8 @@ module Sequel::CoreRefinements
61
61
  # Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, matching none
62
62
  # of the conditions.
63
63
  #
64
- # [[:a, true]].sql_negate # SQL: a IS NOT TRUE
65
- # [[:a, 1], [:b, [2, 3]]].sql_negate # SQL: a != 1 AND b NOT IN (2, 3)
64
+ # [[:a, true]].sql_negate # SQL: (a IS NOT TRUE)
65
+ # [[:a, 1], [:b, [2, 3]]].sql_negate # SQL: ((a != 1) AND (b NOT IN (2, 3)))
66
66
  def sql_negate
67
67
  Sequel.negate(self)
68
68
  end
@@ -70,8 +70,8 @@ module Sequel::CoreRefinements
70
70
  # Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, matching any of the
71
71
  # conditions.
72
72
  #
73
- # [[:a, true]].sql_or # SQL: a IS TRUE
74
- # [[:a, 1], [:b, [2, 3]]].sql_or # SQL: a = 1 OR b IN (2, 3)
73
+ # [[:a, true]].sql_or # SQL: (a IS TRUE)
74
+ # [[:a, 1], [:b, [2, 3]]].sql_or # SQL: ((a = 1) OR (b IN (2, 3)))
75
75
  def sql_or
76
76
  Sequel.or(self)
77
77
  end
@@ -82,9 +82,9 @@ module Sequel::CoreRefinements
82
82
  # concatenation.
83
83
  #
84
84
  # [:a].sql_string_join # SQL: a
85
- # [:a, :b].sql_string_join # SQL: a || b
86
- # [:a, 'b'].sql_string_join # SQL: a || 'b'
87
- # ['a', :b].sql_string_join(' ') # SQL: 'a' || ' ' || b
85
+ # [:a, :b].sql_string_join # SQL: (a || b)
86
+ # [:a, 'b'].sql_string_join # SQL: (a || 'b')
87
+ # ['a', :b].sql_string_join(' ') # SQL: ('a' || ' ' || b)
88
88
  def sql_string_join(joiner=nil)
89
89
  Sequel.join(self, joiner)
90
90
  end
@@ -95,8 +95,8 @@ module Sequel::CoreRefinements
95
95
  # all of the conditions in this hash and the condition specified by
96
96
  # the given argument.
97
97
  #
98
- # {:a=>1} & :b # SQL: a = 1 AND b
99
- # {:a=>true} & ~:b # SQL: a IS TRUE AND NOT b
98
+ # {a: 1} & :b # SQL: ((a = 1) AND b)
99
+ # {a: true} & ~:b # SQL: ((a IS TRUE) AND NOT b)
100
100
  def &(ce)
101
101
  ::Sequel::SQL::BooleanExpression.new(:AND, self, ce)
102
102
  end
@@ -105,8 +105,8 @@ module Sequel::CoreRefinements
105
105
  # all of the conditions in this hash or the condition specified by
106
106
  # the given argument.
107
107
  #
108
- # {:a=>1} | :b # SQL: a = 1 OR b
109
- # {:a=>true} | ~:b # SQL: a IS TRUE OR NOT b
108
+ # {a: 1} | :b # SQL: ((a = 1) OR b)
109
+ # {a: true} | ~:b # SQL: ((a IS TRUE) OR NOT b)
110
110
  def |(ce)
111
111
  ::Sequel::SQL::BooleanExpression.new(:OR, self, ce)
112
112
  end
@@ -114,19 +114,17 @@ module Sequel::CoreRefinements
114
114
  # Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, not matching all of the
115
115
  # conditions.
116
116
  #
117
- # ~{:a=>true} # SQL: a IS NOT TRUE
118
- # ~{:a=>1, :b=>[2, 3]} # SQL: a != 1 OR b NOT IN (2, 3)
117
+ # ~{a: true} # SQL: (a IS NOT TRUE)
118
+ # ~{a: 1, b: [2, 3]} # SQL: ((a != 1) OR (b NOT IN (2, 3)))
119
119
  def ~
120
120
  ::Sequel::SQL::BooleanExpression.from_value_pairs(self, :OR, true)
121
121
  end
122
122
 
123
123
  # Return a <tt>Sequel::SQL::CaseExpression</tt> with this hash as the conditions and the given
124
- # default value. Note that the order of the conditions will be arbitrary on ruby 1.8, so all
125
- # conditions should be orthogonal.
124
+ # default value.
126
125
  #
127
- # {{:a=>[2,3]}=>1}.case(0) # SQL: CASE WHEN a IN (2, 3) THEN 1 ELSE 0 END
128
- # {:a=>1, :b=>2}.case(:d, :c) # SQL: CASE c WHEN a THEN 1 WHEN b THEN 2 ELSE d END
129
- # # or: CASE c WHEN b THEN 2 WHEN a THEN 1 ELSE d END
126
+ # {{a: [2,3]}=>1}.case(0) # SQL: CASE WHEN (a IN (2, 3)) THEN 1 ELSE 0 END
127
+ # {a: 1, b: 2}.case(:d, :c) # SQL: CASE c WHEN a THEN 1 WHEN b THEN 2 ELSE d END
130
128
  def case(*args)
131
129
  ::Sequel::SQL::CaseExpression.new(to_a, *args)
132
130
  end
@@ -135,8 +133,8 @@ module Sequel::CoreRefinements
135
133
  # conditions. Rarely do you need to call this explicitly, as Sequel generally
136
134
  # assumes that hashes specify this type of condition.
137
135
  #
138
- # {:a=>true}.sql_expr # SQL: a IS TRUE
139
- # {:a=>1, :b=>[2, 3]}.sql_expr # SQL: a = 1 AND b IN (2, 3)
136
+ # {a: true}.sql_expr # SQL: (a IS TRUE)
137
+ # {a: 1, b: [2, 3]}.sql_expr # SQL: ((a = 1) AND (b IN (2, 3)))
140
138
  def sql_expr
141
139
  ::Sequel::SQL::BooleanExpression.from_value_pairs(self)
142
140
  end
@@ -144,8 +142,8 @@ module Sequel::CoreRefinements
144
142
  # Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, matching none
145
143
  # of the conditions.
146
144
  #
147
- # {:a=>true}.sql_negate # SQL: a IS NOT TRUE
148
- # {:a=>1, :b=>[2, 3]}.sql_negate # SQL: a != 1 AND b NOT IN (2, 3)
145
+ # {a: true}.sql_negate # SQL: (a IS NOT TRUE)
146
+ # {a: 1, b: [2, 3]}.sql_negate # SQL: ((a != 1) AND (b NOT IN (2, 3)))
149
147
  def sql_negate
150
148
  ::Sequel::SQL::BooleanExpression.from_value_pairs(self, :AND, true)
151
149
  end
@@ -153,8 +151,8 @@ module Sequel::CoreRefinements
153
151
  # Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, matching any of the
154
152
  # conditions.
155
153
  #
156
- # {:a=>true}.sql_or # SQL: a IS TRUE
157
- # {:a=>1, :b=>[2, 3]}.sql_or # SQL: a = 1 OR b IN (2, 3)
154
+ # {a: true}.sql_or # SQL: (a IS TRUE)
155
+ # {a: 1, b: [2, 3]}.sql_or # SQL: ((a = 1) OR (b IN (2, 3)))
158
156
  def sql_or
159
157
  ::Sequel::SQL::BooleanExpression.from_value_pairs(self, :OR)
160
158
  end
@@ -167,16 +165,16 @@ module Sequel::CoreRefinements
167
165
  # Converts a string into a <tt>Sequel::LiteralString</tt>, in order to override string
168
166
  # literalization, e.g.:
169
167
  #
170
- # DB[:items].where(:abc => 'def').sql #=>
171
- # "SELECT * FROM items WHERE (abc = 'def')"
168
+ # DB[:items].where(abc: 'def')
169
+ # # "SELECT * FROM items WHERE (abc = 'def')"
172
170
  #
173
- # DB[:items].where(:abc => 'def'.lit).sql #=>
174
- # "SELECT * FROM items WHERE (abc = def)"
171
+ # DB[:items].where(abc: 'def'.lit)
172
+ # # "SELECT * FROM items WHERE (abc = def)"
175
173
  #
176
174
  # You can also provide arguments, to create a <tt>Sequel::SQL::PlaceholderLiteralString</tt>:
177
175
  #
178
- # DB[:items].select{|o| o.count('DISTINCT ?'.lit(:a))}.sql #=>
179
- # "SELECT count(DISTINCT a) FROM items"
176
+ # DB[:items].select{|o| o.count('DISTINCT ?'.lit(:a))}
177
+ # # "SELECT count(DISTINCT a) FROM items"
180
178
  def lit(*args)
181
179
  args.empty? ? Sequel::LiteralString.new(self) : Sequel::SQL::PlaceholderLiteralString.new(self, args)
182
180
  end
@@ -199,19 +197,15 @@ module Sequel::CoreRefinements
199
197
  include Sequel::SQL::SubscriptMethods
200
198
  include Sequel::SQL::ComplexExpressionMethods
201
199
 
202
- # Returns receiver wrapped in an <tt>Sequel::SQL::Identifier</tt>. Usually used to
203
- # prevent splitting the symbol.
200
+ # Returns receiver wrapped in an <tt>Sequel::SQL::Identifier</tt>.
204
201
  #
205
- # :a__b # SQL: "a"."b"
206
- # :a__b.identifier # SQL: "a__b"
202
+ # :ab.identifier # SQL: "a"
207
203
  def identifier
208
204
  Sequel::SQL::Identifier.new(self)
209
205
  end
210
206
 
211
207
  # Returns a <tt>Sequel::SQL::Function</tt> with this as the function name,
212
- # and the given arguments. This is aliased as <tt>Symbol#[]</tt> if the RUBY_VERSION
213
- # is less than 1.9.0. Ruby 1.9 defines <tt>Symbol#[]</tt>, and Sequel
214
- # doesn't override methods defined by ruby itself.
208
+ # and the given arguments.
215
209
  #
216
210
  # :now.sql_function # SQL: now()
217
211
  # :sum.sql_function(:a) # SQL: sum(a)
@@ -53,10 +53,6 @@ module Sequel
53
53
 
54
54
  # DateTime subclass literalized as CURRENT_TIMESTAMP
55
55
  class DateTime < ::DateTime; end
56
-
57
- # Mapping of Time/DateTime classes to subclasses literalized as CURRENT_TIMESTAMP
58
- MAP = {::Time=>Time, ::DateTime=>DateTime}
59
- Sequel::Deprecation.deprecate_constant(self, :MAP)
60
56
  end
61
57
 
62
58
  Dataset.register_extension(:current_datetime_timestamp, CurrentDateTimeTimestamp::DatasetMethods)
@@ -10,8 +10,8 @@
10
10
  # Then you can use the Sequel.date_add and Sequel.date_sub methods
11
11
  # to return Sequel expressions:
12
12
  #
13
- # add = Sequel.date_add(:date_column, :years=>1, :months=>2, :days=>3)
14
- # sub = Sequel.date_sub(:date_column, :hours=>1, :minutes=>2, :seconds=>3)
13
+ # add = Sequel.date_add(:date_column, years: 1, months: 2, days: 3)
14
+ # sub = Sequel.date_sub(:date_column, hours: 1, minutes: 2, seconds: 3)
15
15
  #
16
16
  # In addition to specifying the interval as a hash, there is also
17
17
  # support for specifying the interval as an ActiveSupport::Duration
@@ -66,8 +66,6 @@ module Sequel
66
66
  DERBY_DURATION_UNITS = DURATION_UNITS.zip(DURATION_UNITS.map{|s| Sequel.lit("SQL_TSI_#{s.to_s.upcase[0...-1]}").freeze}).freeze
67
67
  ACCESS_DURATION_UNITS = DURATION_UNITS.zip(%w'yyyy m d h n s'.map(&:freeze)).freeze
68
68
  DB2_DURATION_UNITS = DURATION_UNITS.zip(DURATION_UNITS.map{|s| Sequel.lit(s.to_s).freeze}).freeze
69
- FDBSQL_DURATION_UNITS = DURATION_UNITS.zip(DURATION_UNITS.map{|s| Sequel.lit(s.to_s.chop).freeze}).freeze
70
- Sequel::Deprecation.deprecate_constant(self, :FDBSQL_DURATION_UNITS)
71
69
 
72
70
  # Append the SQL fragment for the DateAdd expression to the SQL query.
73
71
  def date_add_sql_append(sql, da)
@@ -93,8 +91,7 @@ module Sequel
93
91
  args << "#{value} #{sql_unit}"
94
92
  end
95
93
  return function_sql_append(sql, Sequel.function(:datetime, *args))
96
- # SEQUEL5: Remove cubrid
97
- when :mysql, :hsqldb, :cubrid
94
+ when :mysql, :hsqldb
98
95
  if db_type == :hsqldb
99
96
  # HSQLDB requires 2.2.9+ for the DATE_ADD function
100
97
  expr = Sequel.cast(expr, Time)
@@ -181,12 +178,15 @@ module Sequel
181
178
  raise Sequel::InvalidValue, "cannot provide String value as interval part: #{v.inspect}"
182
179
  end
183
180
  end
184
- interval
181
+ Hash[interval]
185
182
  else
186
183
  h = Hash.new(0)
187
184
  interval.parts.each{|unit, value| h[unit] += value}
188
185
  Hash[h]
189
186
  end
187
+
188
+ @interval.freeze
189
+ freeze
190
190
  end
191
191
 
192
192
  to_s_method :date_add_sql
@@ -10,24 +10,28 @@
10
10
  #
11
11
  # DB.extension :duplicate_columns_handler
12
12
  #
13
+ # or into individual datasets:
14
+ #
15
+ # ds = DB[:items].extension(:duplicate_columns_handler)
16
+ #
13
17
  # A database option is introduced: :on_duplicate_columns. It accepts a Symbol
14
18
  # or any object that responds to :call.
15
19
  #
16
- # :on_duplicate_columns => :raise
17
- # :on_duplicate_columns => :warn
18
- # :on_duplicate_columns => :ignore
19
- # :on_duplicate_columns => proc { |columns| arbitrary_condition? ? :raise : :warn }
20
+ # on_duplicate_columns: :raise
21
+ # on_duplicate_columns: :warn
22
+ # on_duplicate_columns: :ignore
23
+ # on_duplicate_columns: lambda{|columns| arbitrary_condition? ? :raise : :warn}
20
24
  #
21
25
  # You may also configure duplicate columns handling for a specific dataset:
22
26
  #
23
27
  # ds.on_duplicate_columns(:warn)
24
28
  # ds.on_duplicate_columns(:raise)
25
29
  # ds.on_duplicate_columns(:ignore)
26
- # ds.on_duplicate_columns { |columns| arbitrary_condition? ? :raise : :warn }
27
- # ds.on_duplicate_columns(proc { |columns| arbitrary_condition? ? :raise : :warn })
30
+ # ds.on_duplicate_columns{|columns| arbitrary_condition? ? :raise : :warn}
31
+ # ds.on_duplicate_columns(lambda{|columns| arbitrary_condition? ? :raise : :warn})
28
32
  #
29
33
  # If :raise is specified, a Sequel::DuplicateColumnError is raised.
30
- # If :warn is specified, you will receive a warning via `warn`.
34
+ # If :warn is specified, you will receive a warning via +warn+.
31
35
  # If a callable is specified, it will be called.
32
36
  # If no on_duplicate_columns is specified, the default is :warn.
33
37
  #
@@ -45,8 +49,7 @@ module Sequel
45
49
 
46
50
  private
47
51
 
48
- # Override the attr_writer to check for duplicate columns, and call
49
- # handle_duplicate_columns if necessary.
52
+ # Call handle_duplicate_columns if there are duplicate columns.
50
53
  def columns=(cols)
51
54
  if cols && cols.uniq.size != cols.size
52
55
  handle_duplicate_columns(cols)
@@ -4,9 +4,9 @@
4
4
  # array value to consider NULL values if one of the referenced
5
5
  # columns is NULL:
6
6
  #
7
- # DB[:test].where(:name=>[])
7
+ # DB[:test].where(name: [])
8
8
  # # SELECT * FROM test WHERE (name != name)
9
- # DB[:test].exclude(:name=>[])
9
+ # DB[:test].exclude(name: [])
10
10
  # # SELECT * FROM test WHERE (name = name)
11
11
  #
12
12
  # The default Sequel behavior is to ignore NULLs, as the above
@@ -36,16 +36,7 @@ module Sequel
36
36
  "{#{obj.map{|k, v| "#{eval_inspect(k)} => #{eval_inspect(v)}"}.join(', ')}}"
37
37
  when Time
38
38
  datepart = "%Y-%m-%dT" unless obj.is_a?(Sequel::SQLTime)
39
- if RUBY_VERSION < '1.9'
40
- # :nocov:
41
- # Time on 1.8 doesn't handle %N (or %z on Windows), manually set the usec value in the string
42
- hours, mins = obj.utc_offset.divmod(3600)
43
- mins /= 60
44
- "#{obj.class}.parse(#{obj.strftime("#{datepart}%H:%M:%S.#{sprintf('%06i%+03i%02i', obj.usec, hours, mins)}").inspect})#{'.utc' if obj.utc?}"
45
- # :nocov:
46
- else
47
- "#{obj.class}.parse(#{obj.strftime("#{datepart}%T.%N%z").inspect})#{'.utc' if obj.utc?}"
48
- end
39
+ "#{obj.class}.parse(#{obj.strftime("#{datepart}%T.%N%z").inspect})#{'.utc' if obj.utc?}"
49
40
  when DateTime
50
41
  # Ignore date of calendar reform
51
42
  "DateTime.parse(#{obj.strftime('%FT%T.%N%z').inspect})"
@@ -73,9 +64,11 @@ module Sequel
73
64
  args = inspect_args.map do |arg|
74
65
  if arg.is_a?(String) && arg =~ /\A\*/
75
66
  # Special case string arguments starting with *, indicating that
76
- # they should return an array to be splatted as the remaining arguments
67
+ # they should return an array to be splatted as the remaining arguments.
68
+ # Allow calling private methods to get inspect output.
77
69
  send(arg.sub('*', '')).map{|a| Sequel.eval_inspect(a)}.join(', ')
78
70
  else
71
+ # Allow calling private methods to get inspect output.
79
72
  Sequel.eval_inspect(send(arg))
80
73
  end
81
74
  end