sequel 4.49.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
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 "Sequel::Deprecated" do
4
4
  before do
@@ -27,7 +27,7 @@ describe "Sequel::Deprecated" do
27
27
 
28
28
  it "should consider two arguments to be a method name and additional text" do
29
29
  @d.deprecate("foo", "Use bar instead")
30
- @output.must_equal ['foo is deprecated and will be removed in Sequel 5. Use bar instead.']
30
+ @output.must_equal ['foo is deprecated and will be removed in Sequel 5.1. Use bar instead.']
31
31
  end
32
32
 
33
33
  it "should include a prefix if set" do
@@ -67,4 +67,4 @@ describe "Sequel::Deprecated" do
67
67
  @output.first.must_equal 'foo'
68
68
  @output.count.must_equal 4
69
69
  end
70
- end if RUBY_VERSION >= '1.9'
70
+ end
@@ -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 "Blockless Ruby Filters" do
4
4
  before do
@@ -13,6 +13,12 @@ describe "Blockless Ruby Filters" do
13
13
  end
14
14
  end
15
15
 
16
+ it "should support boolean columns directly" do
17
+ x = Sequel[:x]
18
+ x.dup.must_be_same_as x
19
+ x.clone.must_be_same_as x
20
+ end
21
+
16
22
  it "should support boolean columns directly" do
17
23
  @d.l(:x).must_equal 'x'
18
24
  end
@@ -23,30 +29,15 @@ describe "Blockless Ruby Filters" do
23
29
  @d.l(:x__y___z).must_equal 'x.y AS z'
24
30
  end
25
31
 
26
- deprecated "should support qualified columns and aliased columns using symbols 2" do
27
- @d.l(:x__y).must_equal 'x.y'
28
- @d.l(:x___y).must_equal 'x AS y'
29
- @d.l(:x__y___z).must_equal 'x.y AS z'
30
- end
31
-
32
32
  with_symbol_splitting "should support qualified columns using virtual rows" do
33
33
  @d.l(Sequel.expr{x__y}).must_equal 'x.y'
34
34
  end
35
35
 
36
- deprecated "should support qualified columns using virtual rows" do
37
- @d.l(Sequel.expr{x__y}).must_equal 'x.y'
38
- end
39
-
40
36
  it "should not split symbols or virtual row methods if symbol splitting is disabled" do
41
- begin
42
- Sequel.split_symbols = false
43
- @d.l(:x__y).must_equal 'x__y'
44
- @d.l(:x___y).must_equal 'x___y'
45
- @d.l(:x__y___z).must_equal 'x__y___z'
46
- @d.l(Sequel.expr{x__y}).must_equal 'x__y'
47
- ensure
48
- Sequel.split_symbols = :deprecated
49
- end
37
+ @d.l(:x__y).must_equal 'x__y'
38
+ @d.l(:x___y).must_equal 'x___y'
39
+ @d.l(:x__y___z).must_equal 'x__y___z'
40
+ @d.l(Sequel.expr{x__y}).must_equal 'x__y'
50
41
  end
51
42
 
52
43
  it "should support NOT with SQL functions" do
@@ -110,28 +101,26 @@ describe "Blockless Ruby Filters" do
110
101
  @d.l{(x + y) =~ /blah/}.must_equal '((x + y) ~ \'blah\')'
111
102
  end
112
103
 
113
- if RUBY_VERSION >= '1.9'
114
- it "should support != and similar inversions via !~ method" do
115
- @d.l{x !~ 100}.must_equal '(x != 100)'
116
- @d.l{x !~ 'a'}.must_equal '(x != \'a\')'
117
- @d.l{x !~ true}.must_equal '(x IS NOT TRUE)'
118
- @d.l{x !~ false}.must_equal '(x IS NOT FALSE)'
119
- @d.l{x !~ nil}.must_equal '(x IS NOT NULL)'
120
- @d.l{x !~ (1...5)}.must_equal '((x < 1) OR (x >= 5))'
121
- @d.l{x !~ [1,2,3]}.must_equal '(x NOT IN (1, 2, 3))'
122
-
123
- @d.l{(x + y) !~ 100}.must_equal '((x + y) != 100)'
124
- @d.l{(x + y) !~ 'a'}.must_equal '((x + y) != \'a\')'
125
- @d.l{(x + y) !~ true}.must_equal '((x + y) IS NOT TRUE)'
126
- @d.l{(x + y) !~ false}.must_equal '((x + y) IS NOT FALSE)'
127
- @d.l{(x + y) !~ nil}.must_equal '((x + y) IS NOT NULL)'
128
- @d.l{(x + y) !~ (1...5)}.must_equal '(((x + y) < 1) OR ((x + y) >= 5))'
129
- @d.l{(x + y) !~ [1,2,3]}.must_equal '((x + y) NOT IN (1, 2, 3))'
130
-
131
- @d = @d.with_extend{def supports_regexp?; true end}
132
- @d.l{x !~ /blah/}.must_equal '(x !~ \'blah\')'
133
- @d.l{(x + y) !~ /blah/}.must_equal '((x + y) !~ \'blah\')'
134
- end
104
+ it "should support != and similar inversions via !~ method" do
105
+ @d.l{x !~ 100}.must_equal '(x != 100)'
106
+ @d.l{x !~ 'a'}.must_equal '(x != \'a\')'
107
+ @d.l{x !~ true}.must_equal '(x IS NOT TRUE)'
108
+ @d.l{x !~ false}.must_equal '(x IS NOT FALSE)'
109
+ @d.l{x !~ nil}.must_equal '(x IS NOT NULL)'
110
+ @d.l{x !~ (1...5)}.must_equal '((x < 1) OR (x >= 5))'
111
+ @d.l{x !~ [1,2,3]}.must_equal '(x NOT IN (1, 2, 3))'
112
+
113
+ @d.l{(x + y) !~ 100}.must_equal '((x + y) != 100)'
114
+ @d.l{(x + y) !~ 'a'}.must_equal '((x + y) != \'a\')'
115
+ @d.l{(x + y) !~ true}.must_equal '((x + y) IS NOT TRUE)'
116
+ @d.l{(x + y) !~ false}.must_equal '((x + y) IS NOT FALSE)'
117
+ @d.l{(x + y) !~ nil}.must_equal '((x + y) IS NOT NULL)'
118
+ @d.l{(x + y) !~ (1...5)}.must_equal '(((x + y) < 1) OR ((x + y) >= 5))'
119
+ @d.l{(x + y) !~ [1,2,3]}.must_equal '((x + y) NOT IN (1, 2, 3))'
120
+
121
+ @d = @d.with_extend{def supports_regexp?; true end}
122
+ @d.l{x !~ /blah/}.must_equal '(x !~ \'blah\')'
123
+ @d.l{(x + y) !~ /blah/}.must_equal '((x + y) !~ \'blah\')'
135
124
  end
136
125
 
137
126
  it "should support ~ via Hash and Regexp (if supported by database)" do
@@ -330,17 +319,6 @@ describe "Blockless Ruby Filters" do
330
319
  proc{Sequel::SQL::BooleanExpression.invert(Sequel.expr(:x) + 2)}.must_raise(Sequel::Error)
331
320
  end
332
321
 
333
- deprecated "should return self on .lit" do
334
- y = Sequel.expr(:x) + 1
335
- y.lit.must_equal y
336
- end
337
-
338
- deprecated "should return have .sql_literal return the literal SQL for the expression" do
339
- y = Sequel.expr(:x) + 1
340
- y.sql_literal(@d).must_equal '(x + 1)'
341
- y.sql_literal(@d).must_equal @d.literal(y)
342
- end
343
-
344
322
  it "should support SQL::Constants" do
345
323
  @d.l({:x => Sequel::NULL}).must_equal '(x IS NULL)'
346
324
  @d.l({:x => Sequel::NOTNULL}).must_equal '(x IS NOT NULL)'
@@ -549,18 +527,11 @@ describe Sequel::SQL::VirtualRow do
549
527
  @d.l{function(arg1, 10, 'arg3')}.must_equal 'function("arg1", 10, \'arg3\')'
550
528
  end
551
529
 
552
- deprecated "should treat methods with a block and no arguments as a function call with no arguments" do
553
- @d.l{version{}}.must_equal 'version()'
554
- end
555
530
 
556
531
  it "should treat methods followed by function as a function call with no arguments" do
557
532
  @d.l{version.function}.must_equal 'version()'
558
533
  end
559
534
 
560
- deprecated "should treat methods with a block and a leading argument :* as a function call with the SQL wildcard" do
561
- @d.l{count(:*){}}.must_equal 'count(*)'
562
- end
563
-
564
535
  it "should treat methods followed by function.* as a function call with * argument" do
565
536
  @d.l{count.function.*}.must_equal 'count(*)'
566
537
  end
@@ -574,67 +545,11 @@ describe Sequel::SQL::VirtualRow do
574
545
  @d.literal(Sequel.expr{sum(1) * 2}).must_equal '(sum(1) * 2)'
575
546
  end
576
547
 
577
- deprecated "should treat methods with a block and a leading argument :distinct as a function call with DISTINCT and the additional method arguments" do
578
- @d.l{count(:distinct, column1){}}.must_equal 'count(DISTINCT "column1")'
579
- @d.l{count(:distinct, column1, column2){}}.must_equal 'count(DISTINCT "column1", "column2")'
580
- end
581
-
582
548
  it "should support distinct methods on functions to use DISTINCT before the arguments" do
583
549
  @d.l{count(column1).distinct}.must_equal 'count(DISTINCT "column1")'
584
550
  @d.l{count(column1, column2).distinct}.must_equal 'count(DISTINCT "column1", "column2")'
585
551
  end
586
552
 
587
- deprecated "should raise an error if an unsupported argument is used with a block" do
588
- proc{@d.where{count(:blah){}}}.must_raise(Sequel::Error)
589
- end
590
-
591
- deprecated "should treat methods with a block and a leading argument :over as a window function call" do
592
- @d.l{rank(:over){}}.must_equal 'rank() OVER ()'
593
- end
594
-
595
- deprecated "should support :partition options for window function calls" do
596
- @d.l{rank(:over, :partition=>column1){}}.must_equal 'rank() OVER (PARTITION BY "column1")'
597
- @d.l{rank(:over, :partition=>[column1, column2]){}}.must_equal 'rank() OVER (PARTITION BY "column1", "column2")'
598
- end
599
-
600
- deprecated "should support :args options for window function calls" do
601
- @d.l{avg(:over, :args=>column1){}}.must_equal 'avg("column1") OVER ()'
602
- @d.l{avg(:over, :args=>[column1, column2]){}}.must_equal 'avg("column1", "column2") OVER ()'
603
- end
604
-
605
- deprecated "should support :order option for window function calls" do
606
- @d.l{rank(:over, :order=>column1){}}.must_equal 'rank() OVER (ORDER BY "column1")'
607
- @d.l{rank(:over, :order=>[column1, column2]){}}.must_equal 'rank() OVER (ORDER BY "column1", "column2")'
608
- end
609
-
610
- deprecated "should support :window option for window function calls" do
611
- @d.l{rank(:over, :window=>:win){}}.must_equal 'rank() OVER ("win")'
612
- end
613
-
614
- deprecated "should support :*=>true option for window function calls" do
615
- @d.l{count(:over, :* =>true){}}.must_equal 'count(*) OVER ()'
616
- end
617
-
618
- deprecated "should support :frame=>:all option for window function calls" do
619
- @d.l{rank(:over, :frame=>:all){}}.must_equal 'rank() OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)'
620
- end
621
-
622
- deprecated "should support :frame=>:rows option for window function calls" do
623
- @d.l{rank(:over, :frame=>:rows){}}.must_equal 'rank() OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)'
624
- end
625
-
626
- deprecated "should support :frame=>'some string' option for window function calls" do
627
- @d.l{rank(:over, :frame=>'RANGE BETWEEN 3 PRECEDING AND CURRENT ROW'){}}.must_equal 'rank() OVER (RANGE BETWEEN 3 PRECEDING AND CURRENT ROW)'
628
- end
629
-
630
- deprecated "should raise an error if an invalid :frame option is used" do
631
- proc{@d.l{rank(:over, :frame=>:blah){}}}.must_raise(Sequel::Error)
632
- end
633
-
634
- deprecated "should support all these options together" do
635
- @d.l{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}.must_equal 'count(*) OVER ("win" PARTITION BY "a" ORDER BY "b" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)'
636
- end
637
-
638
553
  it "should handle method.function.over as a window function call" do
639
554
  @d.l{rank.function.over}.must_equal 'rank() OVER ()'
640
555
  end
@@ -779,23 +694,6 @@ describe Sequel::SQL::VirtualRow do
779
694
  @d.l{num < Math::PI.to_i}.must_equal "(\"num\" < 3)"
780
695
  end
781
696
 
782
- deprecated "should deal with methods added to Object after requiring Sequel" do
783
- class Object
784
- def adsoiwemlsdaf; 42; end
785
- end
786
- Sequel::BasicObject.remove_methods!
787
- @d.l{a > adsoiwemlsdaf}.must_equal '("a" > "adsoiwemlsdaf")'
788
- end
789
-
790
- deprecated "should deal with private methods added to Kernel after requiring Sequel" do
791
- module Kernel
792
- private
793
- def adsoiwemlsdaf2; 42; end
794
- end
795
- Sequel::BasicObject.remove_methods!
796
- @d.l{a > adsoiwemlsdaf2}.must_equal '("a" > "adsoiwemlsdaf2")'
797
- end
798
-
799
697
  it "should have operator methods defined that produce Sequel expression objects" do
800
698
  @d.l{|o| o.&({:a=>1}, :b)}.must_equal '(("a" = 1) AND "b")'
801
699
  @d.l{|o| o.|({:a=>1}, :b)}.must_equal '(("a" = 1) OR "b")'
@@ -811,11 +709,6 @@ describe Sequel::SQL::VirtualRow do
811
709
  @d.l{|o| o.<=(1, :b)}.must_equal '(1 <= "b")'
812
710
  @d.l{|o| o.>=(1, :b)}.must_equal '(1 >= "b")'
813
711
  end
814
-
815
- deprecated "should have have ` produce literal strings" do
816
- @d.l{a > `some SQL`}.must_equal '("a" > some SQL)'
817
- @d.l{|o| o.a > o.`('some SQL')}.must_equal '("a" > some SQL)' #`
818
- end
819
712
  end
820
713
 
821
714
  describe "Sequel core extension replacements" do
@@ -1044,13 +937,9 @@ describe "Sequel core extension replacements" do
1044
937
  o = Sequel.blob(('a'..'z').to_a.join)
1045
938
  o.inspect.must_equal "#<Sequel::SQL::Blob:0x#{'%x' % o.object_id} bytes=26 start=\"abcdefghij\" end=\"qrstuvwxyz\">"
1046
939
  o = Sequel.blob(255.chr)
1047
- o.inspect.must_equal "#<Sequel::SQL::Blob:0x#{'%x' % o.object_id} bytes=1 content=\"#{RUBY_VERSION >= '1.9' ? "\\xFF" : "\\377"}\">"
940
+ o.inspect.must_equal "#<Sequel::SQL::Blob:0x#{'%x' % o.object_id} bytes=1 content=\"\\xFF\">"
1048
941
  o = Sequel.blob((230..255).map(&:chr).join)
1049
- if RUBY_VERSION >= '1.9'
1050
- o.inspect.must_equal "#<Sequel::SQL::Blob:0x#{'%x' % o.object_id} bytes=26 start=\"\\xE6\\xE7\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF\" end=\"\\xF6\\xF7\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFE\\xFF\">"
1051
- else
1052
- o.inspect.must_equal "#<Sequel::SQL::Blob:0x#{'%x' % o.object_id} bytes=26 start=\"\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\" end=\"\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377\">"
1053
- end
942
+ o.inspect.must_equal "#<Sequel::SQL::Blob:0x#{'%x' % o.object_id} bytes=26 start=\"\\xE6\\xE7\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF\" end=\"\\xF6\\xF7\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFE\\xFF\">"
1054
943
  end
1055
944
 
1056
945
  it "Sequel.deep_qualify should do a deep qualification into nested structors" do
@@ -1129,6 +1018,10 @@ describe "Sequel core extension replacements" do
1129
1018
  l(Sequel.subscript(:a, 1...3), 'a[1:2]')
1130
1019
  end
1131
1020
 
1021
+ it "Sequel.subscript.f should be subscript expression for backwards compatibility" do
1022
+ Sequel.subscript(:a, 1).f.must_equal :a
1023
+ end
1024
+
1132
1025
  it "Sequel.function should return an SQL function" do
1133
1026
  l(Sequel.function(:a), 'a()')
1134
1027
  l(Sequel.function(:a, 1), 'a(1)')
@@ -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 "Sequel Mock Adapter" do
4
4
  it "should have an adapter method" do
@@ -310,7 +310,7 @@ describe "Sequel Mock Adapter" do
310
310
  it "should be able to set the columns to set in the dataset as an array of arrays of symbols" do
311
311
  db = Sequel.mock(:columns=>[[:a, :b], [:c, :d]])
312
312
  db[:t].columns.must_equal [:a, :b]
313
- db[:t].columns.must_equal [:c, :d]
313
+ db[:x].columns.must_equal [:c, :d]
314
314
  end
315
315
 
316
316
  it "should be able to set the columns to set in the dataset as a proc" do
@@ -323,7 +323,7 @@ describe "Sequel Mock Adapter" do
323
323
  db = Sequel.mock
324
324
  db.columns = [[:a, :b], [:c, :d]]
325
325
  db[:t].columns.must_equal [:a, :b]
326
- db[:t].columns.must_equal [:c, :d]
326
+ db[:x].columns.must_equal [:c, :d]
327
327
  end
328
328
 
329
329
  it "should raise Error if given an invalid columns" do
@@ -451,7 +451,7 @@ describe "Sequel Mock Adapter" do
451
451
  it "should be able to load dialects based on the database name" do
452
452
  Sequel.mock(:host=>'access').select(Date.new(2011, 12, 13)).sql.must_equal 'SELECT #2011-12-13#'
453
453
  Sequel.mock(:host=>'db2').select(1).sql.must_equal 'SELECT 1 FROM "SYSIBM"."SYSDUMMY1"'
454
- Sequel.mock(:host=>'mssql', :identifier_mangling=>false)[:A].full_text_search(:B, 'C').with_quote_identifiers(false).sql.must_equal "SELECT * FROM A WHERE (CONTAINS (B, 'C'))"
454
+ Sequel.mock(:host=>'mssql')[:A].full_text_search(:B, 'C').with_quote_identifiers(false).sql.must_equal "SELECT * FROM A WHERE (CONTAINS (B, 'C'))"
455
455
  Sequel.mock(:host=>'mysql')[:a].full_text_search(:b, 'c').with_quote_identifiers(false).sql.must_equal "SELECT * FROM a WHERE (MATCH (b) AGAINST ('c'))"
456
456
  Sequel.mock(:host=>'oracle')[:a].limit(1).with_quote_identifiers(false).sql.upcase.must_equal 'SELECT * FROM (SELECT * FROM A) T1 WHERE (ROWNUM <= 1)'
457
457
  Sequel.mock(:host=>'postgres')[:a].full_text_search(:b, 'c').with_quote_identifiers(false).sql.must_equal "SELECT * FROM a WHERE (to_tsvector(CAST('simple' AS regconfig), (COALESCE(b, ''))) @@ to_tsquery(CAST('simple' AS regconfig), 'c'))"
@@ -483,3 +483,175 @@ describe "Sequel Mock Adapter" do
483
483
  Sequel.mock(:host=>'oracle').create_table(:a){String :b}
484
484
  end
485
485
  end
486
+
487
+ describe "PostgreSQL support" do
488
+ before do
489
+ @db = Sequel.mock(:host=>'postgres')
490
+ end
491
+
492
+ it "should create an unlogged table" do
493
+ @db.create_table(:unlogged_dolls, :unlogged => true){text :name}
494
+ @db.sqls.must_equal ['CREATE UNLOGGED TABLE "unlogged_dolls" ("name" text)']
495
+ end
496
+
497
+ it "should support spatial indexes" do
498
+ @db.alter_table(:posts){add_spatial_index [:geom]}
499
+ @db.sqls.must_equal ['CREATE INDEX "posts_geom_index" ON "posts" USING gist ("geom")']
500
+ end
501
+
502
+ it "should support indexes with index type" do
503
+ @db.alter_table(:posts){add_index :p, :type => 'gist'}
504
+ @db.sqls.must_equal ['CREATE INDEX "posts_p_index" ON "posts" USING gist ("p")']
505
+ end
506
+
507
+ it "should have #transaction support various types of synchronous options" do
508
+ @db.transaction(:synchronous=>:on){}
509
+ @db.transaction(:synchronous=>true){}
510
+ @db.transaction(:synchronous=>:off){}
511
+ @db.transaction(:synchronous=>false){}
512
+ @db.sqls.grep(/synchronous/).must_equal ["SET LOCAL synchronous_commit = on", "SET LOCAL synchronous_commit = on", "SET LOCAL synchronous_commit = off", "SET LOCAL synchronous_commit = off"]
513
+
514
+ @db.transaction(:synchronous=>nil){}
515
+ @db.sqls.must_equal ['BEGIN', 'COMMIT']
516
+
517
+ if @db.server_version >= 90100
518
+ @db.transaction(:synchronous=>:local){}
519
+ @db.sqls.grep(/synchronous/).must_equal ["SET LOCAL synchronous_commit = local"]
520
+
521
+ if @db.server_version >= 90200
522
+ @db.transaction(:synchronous=>:remote_write){}
523
+ @db.sqls.grep(/synchronous/).must_equal ["SET LOCAL synchronous_commit = remote_write"]
524
+ end
525
+ end
526
+ end
527
+
528
+ it "should have #transaction support read only transactions" do
529
+ @db.transaction(:read_only=>true){}
530
+ @db.transaction(:read_only=>false){}
531
+ @db.transaction(:isolation=>:serializable, :read_only=>true){}
532
+ @db.transaction(:isolation=>:serializable, :read_only=>false){}
533
+ @db.sqls.grep(/READ/).must_equal ["SET TRANSACTION READ ONLY", "SET TRANSACTION READ WRITE", "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY", "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE"]
534
+ end
535
+
536
+ it "should have #transaction support deferrable transactions" do
537
+ @db.transaction(:deferrable=>true){}
538
+ @db.transaction(:deferrable=>false){}
539
+ @db.transaction(:deferrable=>true, :read_only=>true){}
540
+ @db.transaction(:deferrable=>false, :read_only=>false){}
541
+ @db.transaction(:isolation=>:serializable, :deferrable=>true, :read_only=>true){}
542
+ @db.transaction(:isolation=>:serializable, :deferrable=>false, :read_only=>false){}
543
+ @db.sqls.grep(/DEF/).must_equal ["SET TRANSACTION DEFERRABLE", "SET TRANSACTION NOT DEFERRABLE", "SET TRANSACTION READ ONLY DEFERRABLE", "SET TRANSACTION READ WRITE NOT DEFERRABLE", "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE", "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE NOT DEFERRABLE"]
544
+ end
545
+
546
+ it "should support creating indexes concurrently" do
547
+ @db.add_index :test, [:name, :value], :concurrently=>true
548
+ @db.sqls.must_equal ['CREATE INDEX CONCURRENTLY "test_name_value_index" ON "test" ("name", "value")']
549
+ end
550
+
551
+ it "should support dropping indexes concurrently" do
552
+ @db.drop_index :test, [:name, :value], :concurrently=>true, :name=>'tnv2'
553
+ @db.sqls.must_equal ['DROP INDEX CONCURRENTLY "tnv2"']
554
+ end
555
+
556
+ it "should use INSERT RETURNING for inserts" do
557
+ @db[:test5].insert(:value=>10)
558
+ @db.sqls.must_equal ['INSERT INTO "test5" ("value") VALUES (10) RETURNING "id"']
559
+ end
560
+
561
+ it "should support opclass specification" do
562
+ @db.alter_table(:posts){add_index(:user_id, :opclass => :int4_ops, :type => :btree)}
563
+ @db.sqls.must_equal ['CREATE INDEX "posts_user_id_index" ON "posts" USING btree ("user_id" int4_ops)']
564
+ end
565
+
566
+ it 'should quote NaN' do
567
+ nan = 0.0/0.0
568
+ @db[:test5].insert_sql(:value => nan).must_equal %q{INSERT INTO "test5" ("value") VALUES ('NaN')}
569
+ end
570
+
571
+ it 'should quote +Infinity' do
572
+ inf = 1.0/0.0
573
+ @db[:test5].insert_sql(:value => inf).must_equal %q{INSERT INTO "test5" ("value") VALUES ('Infinity')}
574
+ end
575
+
576
+ it 'should quote -Infinity' do
577
+ inf = -1.0/0.0
578
+ @db[:test5].insert_sql(:value => inf).must_equal %q{INSERT INTO "test5" ("value") VALUES ('-Infinity')}
579
+ end
580
+ end
581
+
582
+ describe "MySQL support" do
583
+ before do
584
+ @db = Sequel.mock(:host=>'mysql')
585
+ end
586
+
587
+ it "should support spatial indexes" do
588
+ @db.alter_table(:posts){add_spatial_index [:geom]}
589
+ @db.sqls.must_equal ['CREATE SPATIAL INDEX `posts_geom_index` ON `posts` (`geom`)']
590
+ end
591
+
592
+ it "should support fulltext indexes and full_text_search" do
593
+ @db.alter_table(:posts){add_full_text_index :title; add_full_text_index [:title, :body]}
594
+ @db.sqls.must_equal [ "CREATE FULLTEXT INDEX `posts_title_index` ON `posts` (`title`)", "CREATE FULLTEXT INDEX `posts_title_body_index` ON `posts` (`title`, `body`)" ]
595
+ end
596
+
597
+ it "should support indexes with index type" do
598
+ @db.alter_table(:posts){add_index :id, :type => :btree}
599
+ @db.sqls.must_equal ["CREATE INDEX `posts_id_index` USING btree ON `posts` (`id`)"]
600
+ end
601
+ end
602
+
603
+ describe "SQLite support" do
604
+ before do
605
+ @db = Sequel.mock(:host=>'sqlite')
606
+ end
607
+
608
+ it "should use a string literal for Sequel[:col].as(:alias)" do
609
+ @db.literal(Sequel[:c].as(:a)).must_equal "`c` AS 'a'"
610
+ end
611
+
612
+ it "should use a string literal for Sequel[:table][:col].as(:alias)" do
613
+ @db.literal(Sequel[:t][:c].as(:a)).must_equal "`t`.`c` AS 'a'"
614
+ end
615
+
616
+ it "should use a string literal for :column.as(:alias)" do
617
+ @db.literal(Sequel.as(:c, :a)).must_equal "`c` AS 'a'"
618
+ end
619
+
620
+ it "should use a string literal in the SELECT clause" do
621
+ @db[:t].select(Sequel[:c].as(:a)).sql.must_equal "SELECT `c` AS 'a' FROM `t`"
622
+ end
623
+
624
+ it "should use a string literal in the FROM clause" do
625
+ @db[Sequel[:t].as(:a)].sql.must_equal "SELECT * FROM `t` AS 'a'"
626
+ end
627
+
628
+ it "should use a string literal in the JOIN clause" do
629
+ @db[:t].join_table(:natural, :j, nil, :table_alias=>:a).sql.must_equal "SELECT * FROM `t` NATURAL JOIN `j` AS 'a'"
630
+ end
631
+
632
+ it "should have support for various #transaction modes" do
633
+ @db.transaction{}
634
+ @db.transaction(:mode => :immediate){}
635
+ @db.transaction(:mode => :exclusive){}
636
+ @db.transaction(:mode => :deferred){}
637
+ @db.sqls.must_equal ["BEGIN", "COMMIT", "BEGIN IMMEDIATE TRANSACTION", "COMMIT", "BEGIN EXCLUSIVE TRANSACTION", "COMMIT", "BEGIN DEFERRED TRANSACTION", "COMMIT"]
638
+
639
+ @db.transaction_mode.must_be_nil
640
+ @db.transaction_mode = :immediate
641
+ @db.transaction_mode.must_equal :immediate
642
+ @db.transaction{}
643
+ @db.transaction(:mode => :exclusive){}
644
+ @db.sqls.must_equal ["BEGIN IMMEDIATE TRANSACTION", "COMMIT", "BEGIN EXCLUSIVE TRANSACTION", "COMMIT"]
645
+ end
646
+
647
+ it "should choose a temporary table name that isn't already used when dropping or renaming columns" do
648
+ exists = [true, true, false]
649
+ @db.define_singleton_method(:table_exists?){|x| exists.shift}
650
+ @db.drop_column(:test3, :i)
651
+ @db.sqls.grep(/ALTER/).must_equal ["ALTER TABLE `test3` RENAME TO `test3_backup2`"]
652
+
653
+ exists = [true, true, true, false]
654
+ @db.rename_column(:test3, :h, :i)
655
+ @db.sqls.grep(/ALTER/).must_equal ["ALTER TABLE `test3` RENAME TO `test3_backup3`"]
656
+ end
657
+ end