sequel 4.49.0 → 5.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (484) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +130 -0
  3. data/README.rdoc +195 -136
  4. data/Rakefile +26 -42
  5. data/bin/sequel +6 -9
  6. data/doc/advanced_associations.rdoc +91 -168
  7. data/doc/association_basics.rdoc +197 -274
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +66 -43
  10. data/doc/code_order.rdoc +1 -8
  11. data/doc/core_extensions.rdoc +81 -56
  12. data/doc/dataset_basics.rdoc +8 -17
  13. data/doc/dataset_filtering.rdoc +81 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +73 -30
  16. data/doc/migration.rdoc +19 -36
  17. data/doc/model_dataset_method_design.rdoc +14 -17
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +10 -10
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +52 -70
  22. data/doc/opening_databases.rdoc +39 -32
  23. data/doc/postgresql.rdoc +48 -38
  24. data/doc/prepared_statements.rdoc +27 -22
  25. data/doc/querying.rdoc +173 -150
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/release_notes/5.1.0.txt +31 -0
  29. data/doc/release_notes/5.2.0.txt +33 -0
  30. data/doc/release_notes/5.3.0.txt +121 -0
  31. data/doc/schema_modification.rdoc +78 -64
  32. data/doc/security.rdoc +97 -88
  33. data/doc/sharding.rdoc +43 -30
  34. data/doc/sql.rdoc +53 -65
  35. data/doc/testing.rdoc +4 -5
  36. data/doc/thread_safety.rdoc +2 -4
  37. data/doc/transactions.rdoc +18 -17
  38. data/doc/validations.rdoc +48 -45
  39. data/doc/virtual_rows.rdoc +87 -115
  40. data/lib/sequel/adapters/ado/access.rb +7 -13
  41. data/lib/sequel/adapters/ado/mssql.rb +2 -9
  42. data/lib/sequel/adapters/ado.rb +9 -25
  43. data/lib/sequel/adapters/amalgalite.rb +3 -18
  44. data/lib/sequel/adapters/ibmdb.rb +9 -45
  45. data/lib/sequel/adapters/jdbc/db2.rb +8 -37
  46. data/lib/sequel/adapters/jdbc/derby.rb +4 -50
  47. data/lib/sequel/adapters/jdbc/h2.rb +6 -26
  48. data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
  49. data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
  50. data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
  51. data/lib/sequel/adapters/jdbc/mysql.rb +11 -15
  52. data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
  53. data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
  54. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
  55. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
  56. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
  57. data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
  58. data/lib/sequel/adapters/jdbc.rb +18 -74
  59. data/lib/sequel/adapters/mock.rb +4 -30
  60. data/lib/sequel/adapters/mysql.rb +7 -44
  61. data/lib/sequel/adapters/mysql2.rb +5 -23
  62. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  63. data/lib/sequel/adapters/odbc/mssql.rb +4 -12
  64. data/lib/sequel/adapters/odbc/oracle.rb +1 -1
  65. data/lib/sequel/adapters/odbc.rb +0 -19
  66. data/lib/sequel/adapters/oracle.rb +8 -13
  67. data/lib/sequel/adapters/postgres.rb +28 -150
  68. data/lib/sequel/adapters/postgresql.rb +1 -1
  69. data/lib/sequel/adapters/shared/access.rb +11 -51
  70. data/lib/sequel/adapters/shared/db2.rb +3 -61
  71. data/lib/sequel/adapters/shared/mssql.rb +21 -157
  72. data/lib/sequel/adapters/shared/mysql.rb +61 -227
  73. data/lib/sequel/adapters/shared/oracle.rb +13 -41
  74. data/lib/sequel/adapters/shared/postgres.rb +58 -264
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
  76. data/lib/sequel/adapters/shared/sqlite.rb +22 -101
  77. data/lib/sequel/adapters/sqlanywhere.rb +4 -23
  78. data/lib/sequel/adapters/sqlite.rb +2 -19
  79. data/lib/sequel/adapters/tinytds.rb +5 -15
  80. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -4
  82. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
  83. data/lib/sequel/adapters/utils/replace.rb +0 -5
  84. data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
  85. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
  86. data/lib/sequel/ast_transformer.rb +3 -94
  87. data/lib/sequel/connection_pool/sharded_single.rb +1 -4
  88. data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
  89. data/lib/sequel/connection_pool/single.rb +0 -2
  90. data/lib/sequel/connection_pool/threaded.rb +94 -110
  91. data/lib/sequel/connection_pool.rb +38 -28
  92. data/lib/sequel/core.rb +42 -101
  93. data/lib/sequel/database/connecting.rb +23 -60
  94. data/lib/sequel/database/dataset.rb +6 -9
  95. data/lib/sequel/database/dataset_defaults.rb +4 -48
  96. data/lib/sequel/database/features.rb +5 -4
  97. data/lib/sequel/database/logging.rb +2 -9
  98. data/lib/sequel/database/misc.rb +36 -55
  99. data/lib/sequel/database/query.rb +8 -13
  100. data/lib/sequel/database/schema_generator.rb +93 -64
  101. data/lib/sequel/database/schema_methods.rb +61 -79
  102. data/lib/sequel/database/transactions.rb +4 -24
  103. data/lib/sequel/database.rb +12 -2
  104. data/lib/sequel/dataset/actions.rb +57 -107
  105. data/lib/sequel/dataset/dataset_module.rb +4 -16
  106. data/lib/sequel/dataset/features.rb +35 -30
  107. data/lib/sequel/dataset/graph.rb +40 -49
  108. data/lib/sequel/dataset/misc.rb +12 -37
  109. data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
  110. data/lib/sequel/dataset/prepared_statements.rb +23 -51
  111. data/lib/sequel/dataset/query.rb +91 -161
  112. data/lib/sequel/dataset/sql.rb +33 -225
  113. data/lib/sequel/dataset.rb +18 -10
  114. data/lib/sequel/deprecated.rb +18 -27
  115. data/lib/sequel/exceptions.rb +1 -17
  116. data/lib/sequel/extensions/_model_pg_row.rb +0 -7
  117. data/lib/sequel/extensions/_pretty_table.rb +1 -3
  118. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  119. data/lib/sequel/extensions/connection_expiration.rb +1 -1
  120. data/lib/sequel/extensions/connection_validator.rb +1 -1
  121. data/lib/sequel/extensions/constraint_validations.rb +11 -11
  122. data/lib/sequel/extensions/core_extensions.rb +39 -49
  123. data/lib/sequel/extensions/core_refinements.rb +39 -45
  124. data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
  125. data/lib/sequel/extensions/date_arithmetic.rb +7 -7
  126. data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
  127. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  128. data/lib/sequel/extensions/eval_inspect.rb +4 -11
  129. data/lib/sequel/extensions/freeze_datasets.rb +1 -69
  130. data/lib/sequel/extensions/from_block.rb +1 -35
  131. data/lib/sequel/extensions/graph_each.rb +2 -2
  132. data/lib/sequel/extensions/identifier_mangling.rb +9 -19
  133. data/lib/sequel/extensions/implicit_subquery.rb +2 -2
  134. data/lib/sequel/extensions/inflector.rb +4 -4
  135. data/lib/sequel/extensions/migration.rb +27 -43
  136. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
  137. data/lib/sequel/extensions/null_dataset.rb +2 -8
  138. data/lib/sequel/extensions/pagination.rb +1 -17
  139. data/lib/sequel/extensions/pg_array.rb +20 -189
  140. data/lib/sequel/extensions/pg_extended_date_support.rb +230 -0
  141. data/lib/sequel/extensions/pg_hstore.rb +11 -50
  142. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
  143. data/lib/sequel/extensions/pg_inet.rb +3 -16
  144. data/lib/sequel/extensions/pg_interval.rb +1 -20
  145. data/lib/sequel/extensions/pg_json.rb +7 -27
  146. data/lib/sequel/extensions/pg_loose_count.rb +1 -1
  147. data/lib/sequel/extensions/pg_range.rb +6 -121
  148. data/lib/sequel/extensions/pg_range_ops.rb +1 -3
  149. data/lib/sequel/extensions/pg_row.rb +5 -77
  150. data/lib/sequel/extensions/pg_row_ops.rb +2 -13
  151. data/lib/sequel/extensions/query.rb +3 -4
  152. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  153. data/lib/sequel/extensions/schema_dumper.rb +13 -13
  154. data/lib/sequel/extensions/select_remove.rb +3 -3
  155. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  156. data/lib/sequel/extensions/sql_comments.rb +2 -2
  157. data/lib/sequel/extensions/string_agg.rb +11 -8
  158. data/lib/sequel/extensions/symbol_aref.rb +6 -20
  159. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  160. data/lib/sequel/model/associations.rb +129 -131
  161. data/lib/sequel/model/base.rb +133 -731
  162. data/lib/sequel/model/default_inflections.rb +1 -1
  163. data/lib/sequel/model/errors.rb +0 -3
  164. data/lib/sequel/model/exceptions.rb +2 -6
  165. data/lib/sequel/model/inflections.rb +1 -26
  166. data/lib/sequel/model/plugins.rb +1 -0
  167. data/lib/sequel/model.rb +27 -62
  168. data/lib/sequel/plugins/active_model.rb +2 -5
  169. data/lib/sequel/plugins/association_dependencies.rb +15 -15
  170. data/lib/sequel/plugins/association_pks.rb +14 -28
  171. data/lib/sequel/plugins/association_proxies.rb +6 -7
  172. data/lib/sequel/plugins/auto_validations.rb +4 -4
  173. data/lib/sequel/plugins/before_after_save.rb +0 -43
  174. data/lib/sequel/plugins/blacklist_security.rb +9 -8
  175. data/lib/sequel/plugins/boolean_readers.rb +3 -3
  176. data/lib/sequel/plugins/boolean_subsets.rb +2 -2
  177. data/lib/sequel/plugins/caching.rb +5 -5
  178. data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
  179. data/lib/sequel/plugins/column_conflicts.rb +2 -2
  180. data/lib/sequel/plugins/column_select.rb +2 -2
  181. data/lib/sequel/plugins/composition.rb +15 -24
  182. data/lib/sequel/plugins/constraint_validations.rb +4 -3
  183. data/lib/sequel/plugins/csv_serializer.rb +13 -20
  184. data/lib/sequel/plugins/dataset_associations.rb +2 -2
  185. data/lib/sequel/plugins/def_dataset_method.rb +5 -5
  186. data/lib/sequel/plugins/defaults_setter.rb +1 -1
  187. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  188. data/lib/sequel/plugins/finder.rb +16 -10
  189. data/lib/sequel/plugins/force_encoding.rb +1 -7
  190. data/lib/sequel/plugins/hook_class_methods.rb +4 -106
  191. data/lib/sequel/plugins/input_transformer.rb +10 -11
  192. data/lib/sequel/plugins/insert_returning_select.rb +1 -9
  193. data/lib/sequel/plugins/instance_filters.rb +5 -5
  194. data/lib/sequel/plugins/instance_hooks.rb +7 -52
  195. data/lib/sequel/plugins/inverted_subsets.rb +3 -1
  196. data/lib/sequel/plugins/json_serializer.rb +19 -19
  197. data/lib/sequel/plugins/lazy_attributes.rb +1 -10
  198. data/lib/sequel/plugins/list.rb +6 -6
  199. data/lib/sequel/plugins/many_through_many.rb +11 -8
  200. data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
  201. data/lib/sequel/plugins/nested_attributes.rb +18 -31
  202. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  203. data/lib/sequel/plugins/pg_array_associations.rb +8 -2
  204. data/lib/sequel/plugins/pg_row.rb +2 -11
  205. data/lib/sequel/plugins/prepared_statements.rb +13 -66
  206. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
  207. data/lib/sequel/plugins/rcte_tree.rb +7 -7
  208. data/lib/sequel/plugins/serialization.rb +15 -33
  209. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  210. data/lib/sequel/plugins/sharding.rb +2 -8
  211. data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
  212. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  213. data/lib/sequel/plugins/static_cache.rb +8 -9
  214. data/lib/sequel/plugins/string_stripper.rb +3 -3
  215. data/lib/sequel/plugins/subclasses.rb +1 -1
  216. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  217. data/lib/sequel/plugins/table_select.rb +2 -2
  218. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  219. data/lib/sequel/plugins/timestamps.rb +6 -7
  220. data/lib/sequel/plugins/touch.rb +4 -8
  221. data/lib/sequel/plugins/tree.rb +3 -3
  222. data/lib/sequel/plugins/typecast_on_load.rb +2 -2
  223. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  224. data/lib/sequel/plugins/update_or_create.rb +3 -3
  225. data/lib/sequel/plugins/update_refresh.rb +3 -3
  226. data/lib/sequel/plugins/uuid.rb +7 -11
  227. data/lib/sequel/plugins/validation_class_methods.rb +10 -9
  228. data/lib/sequel/plugins/validation_contexts.rb +4 -4
  229. data/lib/sequel/plugins/validation_helpers.rb +26 -25
  230. data/lib/sequel/plugins/whitelist_security.rb +13 -9
  231. data/lib/sequel/plugins/xml_serializer.rb +24 -25
  232. data/lib/sequel/sql.rb +145 -276
  233. data/lib/sequel/timezones.rb +8 -23
  234. data/lib/sequel/version.rb +2 -2
  235. data/lib/sequel.rb +1 -1
  236. data/spec/adapter_spec.rb +1 -1
  237. data/spec/adapters/db2_spec.rb +2 -103
  238. data/spec/adapters/mssql_spec.rb +89 -68
  239. data/spec/adapters/mysql_spec.rb +111 -478
  240. data/spec/adapters/oracle_spec.rb +1 -9
  241. data/spec/adapters/postgres_spec.rb +459 -664
  242. data/spec/adapters/spec_helper.rb +12 -31
  243. data/spec/adapters/sqlanywhere_spec.rb +2 -77
  244. data/spec/adapters/sqlite_spec.rb +8 -146
  245. data/spec/bin_spec.rb +11 -16
  246. data/spec/core/connection_pool_spec.rb +173 -74
  247. data/spec/core/database_spec.rb +96 -244
  248. data/spec/core/dataset_spec.rb +99 -414
  249. data/spec/core/deprecated_spec.rb +3 -3
  250. data/spec/core/expression_filters_spec.rb +37 -144
  251. data/spec/core/mock_adapter_spec.rb +241 -4
  252. data/spec/core/object_graph_spec.rb +11 -60
  253. data/spec/core/placeholder_literalizer_spec.rb +1 -14
  254. data/spec/core/schema_generator_spec.rb +51 -40
  255. data/spec/core/schema_spec.rb +88 -77
  256. data/spec/core/spec_helper.rb +6 -24
  257. data/spec/core/version_spec.rb +1 -1
  258. data/spec/core_extensions_spec.rb +7 -83
  259. data/spec/core_model_spec.rb +2 -2
  260. data/spec/deprecation_helper.rb +2 -14
  261. data/spec/extensions/accessed_columns_spec.rb +1 -1
  262. data/spec/extensions/active_model_spec.rb +3 -3
  263. data/spec/extensions/after_initialize_spec.rb +1 -1
  264. data/spec/extensions/arbitrary_servers_spec.rb +2 -2
  265. data/spec/extensions/association_dependencies_spec.rb +1 -1
  266. data/spec/extensions/association_pks_spec.rb +30 -92
  267. data/spec/extensions/association_proxies_spec.rb +1 -1
  268. data/spec/extensions/auto_literal_strings_spec.rb +1 -12
  269. data/spec/extensions/auto_validations_spec.rb +1 -1
  270. data/spec/extensions/blacklist_security_spec.rb +1 -1
  271. data/spec/extensions/blank_spec.rb +1 -1
  272. data/spec/extensions/boolean_readers_spec.rb +1 -1
  273. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  274. data/spec/extensions/caching_spec.rb +1 -1
  275. data/spec/extensions/class_table_inheritance_spec.rb +53 -1118
  276. data/spec/extensions/column_conflicts_spec.rb +1 -1
  277. data/spec/extensions/column_select_spec.rb +4 -4
  278. data/spec/extensions/columns_introspection_spec.rb +1 -1
  279. data/spec/extensions/columns_updated_spec.rb +1 -1
  280. data/spec/extensions/composition_spec.rb +8 -30
  281. data/spec/extensions/connection_expiration_spec.rb +3 -3
  282. data/spec/extensions/connection_validator_spec.rb +3 -3
  283. data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
  284. data/spec/extensions/constraint_validations_spec.rb +1 -1
  285. data/spec/extensions/core_refinements_spec.rb +1 -3
  286. data/spec/extensions/csv_serializer_spec.rb +4 -9
  287. data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
  288. data/spec/extensions/dataset_associations_spec.rb +2 -1
  289. data/spec/extensions/dataset_source_alias_spec.rb +1 -1
  290. data/spec/extensions/date_arithmetic_spec.rb +3 -3
  291. data/spec/extensions/def_dataset_method_spec.rb +1 -1
  292. data/spec/extensions/defaults_setter_spec.rb +2 -2
  293. data/spec/extensions/delay_add_association_spec.rb +8 -9
  294. data/spec/extensions/dirty_spec.rb +1 -1
  295. data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
  296. data/spec/extensions/eager_each_spec.rb +2 -2
  297. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  298. data/spec/extensions/error_splitter_spec.rb +1 -1
  299. data/spec/extensions/error_sql_spec.rb +1 -1
  300. data/spec/extensions/eval_inspect_spec.rb +1 -1
  301. data/spec/extensions/finder_spec.rb +1 -1
  302. data/spec/extensions/force_encoding_spec.rb +2 -5
  303. data/spec/extensions/freeze_datasets_spec.rb +1 -1
  304. data/spec/extensions/graph_each_spec.rb +5 -5
  305. data/spec/extensions/hook_class_methods_spec.rb +1 -194
  306. data/spec/extensions/identifier_mangling_spec.rb +17 -170
  307. data/spec/extensions/implicit_subquery_spec.rb +1 -5
  308. data/spec/extensions/inflector_spec.rb +1 -1
  309. data/spec/extensions/input_transformer_spec.rb +7 -2
  310. data/spec/extensions/insert_returning_select_spec.rb +1 -1
  311. data/spec/extensions/instance_filters_spec.rb +1 -1
  312. data/spec/extensions/instance_hooks_spec.rb +1 -95
  313. data/spec/extensions/inverted_subsets_spec.rb +1 -1
  314. data/spec/extensions/json_serializer_spec.rb +1 -1
  315. data/spec/extensions/lazy_attributes_spec.rb +1 -7
  316. data/spec/extensions/list_spec.rb +5 -6
  317. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  318. data/spec/extensions/many_through_many_spec.rb +25 -33
  319. data/spec/extensions/migration_spec.rb +12 -2
  320. data/spec/extensions/modification_detection_spec.rb +1 -1
  321. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  322. data/spec/extensions/named_timezones_spec.rb +3 -3
  323. data/spec/extensions/nested_attributes_spec.rb +1 -29
  324. data/spec/extensions/null_dataset_spec.rb +1 -11
  325. data/spec/extensions/optimistic_locking_spec.rb +2 -2
  326. data/spec/extensions/pagination_spec.rb +1 -1
  327. data/spec/extensions/pg_array_associations_spec.rb +22 -26
  328. data/spec/extensions/pg_array_ops_spec.rb +1 -1
  329. data/spec/extensions/pg_array_spec.rb +3 -48
  330. data/spec/extensions/pg_enum_spec.rb +1 -1
  331. data/spec/extensions/pg_extended_date_support_spec.rb +122 -0
  332. data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
  333. data/spec/extensions/pg_hstore_spec.rb +22 -31
  334. data/spec/extensions/pg_inet_ops_spec.rb +1 -1
  335. data/spec/extensions/pg_inet_spec.rb +1 -14
  336. data/spec/extensions/pg_interval_spec.rb +3 -13
  337. data/spec/extensions/pg_json_ops_spec.rb +1 -1
  338. data/spec/extensions/pg_json_spec.rb +1 -13
  339. data/spec/extensions/pg_loose_count_spec.rb +1 -1
  340. data/spec/extensions/pg_range_ops_spec.rb +1 -1
  341. data/spec/extensions/pg_range_spec.rb +3 -88
  342. data/spec/extensions/pg_row_ops_spec.rb +1 -1
  343. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  344. data/spec/extensions/pg_row_spec.rb +1 -44
  345. data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
  346. data/spec/extensions/prepared_statements_safe_spec.rb +7 -7
  347. data/spec/extensions/prepared_statements_spec.rb +13 -48
  348. data/spec/extensions/pretty_table_spec.rb +40 -9
  349. data/spec/extensions/query_spec.rb +1 -12
  350. data/spec/extensions/rcte_tree_spec.rb +23 -34
  351. data/spec/extensions/round_timestamps_spec.rb +1 -5
  352. data/spec/extensions/s_spec.rb +1 -1
  353. data/spec/extensions/schema_caching_spec.rb +1 -1
  354. data/spec/extensions/schema_dumper_spec.rb +43 -32
  355. data/spec/extensions/select_remove_spec.rb +1 -1
  356. data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
  357. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  358. data/spec/extensions/serialization_spec.rb +5 -17
  359. data/spec/extensions/server_block_spec.rb +1 -1
  360. data/spec/extensions/server_logging_spec.rb +2 -2
  361. data/spec/extensions/sharding_spec.rb +1 -1
  362. data/spec/extensions/shared_caching_spec.rb +1 -28
  363. data/spec/extensions/single_table_inheritance_spec.rb +2 -5
  364. data/spec/extensions/singular_table_names_spec.rb +1 -1
  365. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  366. data/spec/extensions/spec_helper.rb +5 -27
  367. data/spec/extensions/split_array_nil_spec.rb +1 -1
  368. data/spec/extensions/split_values_spec.rb +1 -1
  369. data/spec/extensions/sql_comments_spec.rb +1 -1
  370. data/spec/extensions/sql_expr_spec.rb +1 -1
  371. data/spec/extensions/static_cache_spec.rb +1 -1
  372. data/spec/extensions/string_agg_spec.rb +2 -2
  373. data/spec/extensions/string_date_time_spec.rb +1 -1
  374. data/spec/extensions/string_stripper_spec.rb +1 -1
  375. data/spec/extensions/subclasses_spec.rb +1 -1
  376. data/spec/extensions/subset_conditions_spec.rb +1 -1
  377. data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
  378. data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
  379. data/spec/extensions/synchronize_sql_spec.rb +124 -0
  380. data/spec/extensions/table_select_spec.rb +4 -4
  381. data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
  382. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  383. data/spec/extensions/timestamps_spec.rb +5 -7
  384. data/spec/extensions/to_dot_spec.rb +1 -1
  385. data/spec/extensions/touch_spec.rb +1 -1
  386. data/spec/extensions/tree_spec.rb +1 -1
  387. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  388. data/spec/extensions/unlimited_update_spec.rb +1 -1
  389. data/spec/extensions/update_or_create_spec.rb +12 -16
  390. data/spec/extensions/update_primary_key_spec.rb +4 -3
  391. data/spec/extensions/update_refresh_spec.rb +1 -1
  392. data/spec/extensions/uuid_spec.rb +10 -13
  393. data/spec/extensions/validate_associated_spec.rb +1 -1
  394. data/spec/extensions/validation_class_methods_spec.rb +3 -3
  395. data/spec/extensions/validation_contexts_spec.rb +1 -1
  396. data/spec/extensions/validation_helpers_spec.rb +10 -44
  397. data/spec/extensions/whitelist_security_spec.rb +5 -5
  398. data/spec/extensions/xml_serializer_spec.rb +8 -13
  399. data/spec/guards_helper.rb +2 -1
  400. data/spec/integration/associations_test.rb +1 -23
  401. data/spec/integration/database_test.rb +7 -7
  402. data/spec/integration/dataset_test.rb +12 -47
  403. data/spec/integration/eager_loader_test.rb +1 -1
  404. data/spec/integration/migrator_test.rb +1 -1
  405. data/spec/integration/model_test.rb +4 -82
  406. data/spec/integration/plugin_test.rb +7 -23
  407. data/spec/integration/prepared_statement_test.rb +8 -88
  408. data/spec/integration/schema_test.rb +10 -10
  409. data/spec/integration/spec_helper.rb +17 -21
  410. data/spec/integration/timezone_test.rb +5 -5
  411. data/spec/integration/transaction_test.rb +3 -55
  412. data/spec/integration/type_test.rb +9 -9
  413. data/spec/model/association_reflection_spec.rb +24 -9
  414. data/spec/model/associations_spec.rb +124 -303
  415. data/spec/model/base_spec.rb +43 -137
  416. data/spec/model/class_dataset_methods_spec.rb +2 -20
  417. data/spec/model/dataset_methods_spec.rb +1 -20
  418. data/spec/model/eager_loading_spec.rb +48 -17
  419. data/spec/model/hooks_spec.rb +5 -300
  420. data/spec/model/inflector_spec.rb +1 -1
  421. data/spec/model/model_spec.rb +29 -339
  422. data/spec/model/plugins_spec.rb +2 -16
  423. data/spec/model/record_spec.rb +33 -129
  424. data/spec/model/spec_helper.rb +5 -15
  425. data/spec/model/validations_spec.rb +1 -1
  426. data/spec/sequel_warning.rb +1 -12
  427. metadata +19 -65
  428. data/doc/active_record.rdoc +0 -927
  429. data/lib/sequel/adapters/cubrid.rb +0 -160
  430. data/lib/sequel/adapters/do/mysql.rb +0 -69
  431. data/lib/sequel/adapters/do/postgres.rb +0 -46
  432. data/lib/sequel/adapters/do/sqlite3.rb +0 -41
  433. data/lib/sequel/adapters/do.rb +0 -166
  434. data/lib/sequel/adapters/jdbc/as400.rb +0 -92
  435. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
  436. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
  437. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
  438. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
  439. data/lib/sequel/adapters/odbc/progress.rb +0 -12
  440. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  441. data/lib/sequel/adapters/shared/firebird.rb +0 -261
  442. data/lib/sequel/adapters/shared/informix.rb +0 -63
  443. data/lib/sequel/adapters/shared/progress.rb +0 -40
  444. data/lib/sequel/adapters/swift/mysql.rb +0 -50
  445. data/lib/sequel/adapters/swift/postgres.rb +0 -49
  446. data/lib/sequel/adapters/swift/sqlite.rb +0 -48
  447. data/lib/sequel/adapters/swift.rb +0 -169
  448. data/lib/sequel/adapters/utils/pg_types.rb +0 -4
  449. data/lib/sequel/dataset/mutation.rb +0 -98
  450. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
  451. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
  452. data/lib/sequel/extensions/filter_having.rb +0 -65
  453. data/lib/sequel/extensions/hash_aliases.rb +0 -51
  454. data/lib/sequel/extensions/meta_def.rb +0 -37
  455. data/lib/sequel/extensions/query_literals.rb +0 -86
  456. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
  457. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
  458. data/lib/sequel/extensions/set_overrides.rb +0 -82
  459. data/lib/sequel/no_core_ext.rb +0 -4
  460. data/lib/sequel/plugins/association_autoreloading.rb +0 -11
  461. data/lib/sequel/plugins/identifier_columns.rb +0 -49
  462. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
  463. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
  464. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
  465. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
  466. data/lib/sequel/plugins/schema.rb +0 -84
  467. data/lib/sequel/plugins/scissors.rb +0 -37
  468. data/spec/core/dataset_mutation_spec.rb +0 -253
  469. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
  470. data/spec/extensions/before_after_save_spec.rb +0 -40
  471. data/spec/extensions/filter_having_spec.rb +0 -42
  472. data/spec/extensions/from_block_spec.rb +0 -21
  473. data/spec/extensions/hash_aliases_spec.rb +0 -26
  474. data/spec/extensions/identifier_columns_spec.rb +0 -19
  475. data/spec/extensions/meta_def_spec.rb +0 -35
  476. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
  477. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
  478. data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
  479. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
  480. data/spec/extensions/query_literals_spec.rb +0 -185
  481. data/spec/extensions/schema_spec.rb +0 -123
  482. data/spec/extensions/scissors_spec.rb +0 -27
  483. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
  484. data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -1,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,240 @@ 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
+
581
+ it "Dataset#insert_conflict should respect expressions in the target argument" do
582
+ @ds = @db[:ic_test]
583
+ @ds.insert_conflict(:target=>:a).insert_sql(1, 2, 3).must_equal "INSERT INTO \"ic_test\" VALUES (1, 2, 3) ON CONFLICT (\"a\") DO NOTHING"
584
+ @ds.insert_conflict(:target=>:c, :conflict_where=>{:c_is_unique=>true}).insert_sql(1, 2, 3).must_equal "INSERT INTO \"ic_test\" VALUES (1, 2, 3) ON CONFLICT (\"c\") WHERE (\"c_is_unique\" IS TRUE) DO NOTHING"
585
+ @ds.insert_conflict(:target=>[:b, :c]).insert_sql(1, 2, 3).must_equal "INSERT INTO \"ic_test\" VALUES (1, 2, 3) ON CONFLICT (\"b\", \"c\") DO NOTHING"
586
+ @ds.insert_conflict(:target=>[:b, Sequel.function(:round, :c)]).insert_sql(1, 2, 3).must_equal "INSERT INTO \"ic_test\" VALUES (1, 2, 3) ON CONFLICT (\"b\", round(\"c\")) DO NOTHING"
587
+ @ds.insert_conflict(:target=>[:b, Sequel.virtual_row{|o| o.round(:c)}]).insert_sql(1, 2, 3).must_equal "INSERT INTO \"ic_test\" VALUES (1, 2, 3) ON CONFLICT (\"b\", round(\"c\")) DO NOTHING"
588
+ end
589
+
590
+ it "should support creating and dropping foreign tables" do
591
+ @db.create_table(:t, :foreign=>:f, :options=>{:o=>1}){Integer :a}
592
+ @db.drop_table(:t, :foreign=>true)
593
+ @db.sqls.must_equal ['CREATE FOREIGN TABLE "t" ("a" integer) SERVER "f" OPTIONS (o \'1\')',
594
+ 'DROP FOREIGN TABLE "t"']
595
+ end
596
+
597
+ it "#create_function and #drop_function should create and drop functions" do
598
+ @db.create_function('tf', 'SELECT 1', :returns=>:integer)
599
+ @db.drop_function('tf')
600
+ @db.sqls.map{|s| s.gsub(/\s+/, ' ').strip}.must_equal ["CREATE FUNCTION tf() RETURNS integer LANGUAGE SQL AS 'SELECT 1'",
601
+ 'DROP FUNCTION tf()']
602
+ end
603
+
604
+ it "#create_function and #drop_function should support options" do
605
+ @db.create_function('tf', 'SELECT $1 + $2', :args=>[[:integer, :a], :integer], :replace=>true, :returns=>:integer, :language=>'SQL', :behavior=>:immutable, :strict=>true, :security_definer=>true, :cost=>2, :set=>{:search_path => 'public'})
606
+ @db.drop_function('tf', :if_exists=>true, :cascade=>true, :args=>[[:integer, :a], :integer])
607
+ @db.sqls.map{|s| s.gsub(/\s+/, ' ').strip}.must_equal ["CREATE OR REPLACE FUNCTION tf(a integer, integer) RETURNS integer LANGUAGE SQL IMMUTABLE STRICT SECURITY DEFINER COST 2 SET search_path = public AS 'SELECT $1 + $2'",
608
+ 'DROP FUNCTION IF EXISTS tf(a integer, integer) CASCADE']
609
+ end
610
+
611
+ it "#create_language and #drop_language should create and drop languages" do
612
+ @db.create_language(:plpgsql)
613
+ @db.create_language(:plpgsql, :replace=>true, :trusted=>true, :handler=>:a, :validator=>:b)
614
+ @db.drop_language(:plpgsql)
615
+ @db.drop_language(:plpgsql, :if_exists=>true, :cascade=>true)
616
+ @db.sqls.map{|s| s.gsub(/\s+/, ' ').strip}.must_equal ['CREATE LANGUAGE plpgsql',
617
+ 'CREATE OR REPLACE TRUSTED LANGUAGE plpgsql HANDLER a VALIDATOR b',
618
+ 'DROP LANGUAGE plpgsql',
619
+ 'DROP LANGUAGE IF EXISTS plpgsql CASCADE']
620
+ end
621
+
622
+ it "#create_schema and #drop_schema should create and drop schemas" do
623
+ @db.create_schema(:sequel)
624
+ @db.create_schema(:sequel, :if_not_exists=>true, :owner=>:foo)
625
+ @db.drop_schema(:sequel)
626
+ @db.drop_schema(:sequel, :if_exists=>true, :cascade=>true)
627
+ @db.sqls.must_equal ['CREATE SCHEMA "sequel"',
628
+ 'CREATE SCHEMA IF NOT EXISTS "sequel" AUTHORIZATION "foo"',
629
+ 'DROP SCHEMA "sequel"',
630
+ 'DROP SCHEMA IF EXISTS "sequel" CASCADE']
631
+ end
632
+
633
+ it "#create_trigger and #drop_trigger should create and drop triggers" do
634
+ @db.create_trigger(:test, :identity, :tf, :each_row=>true)
635
+ @db.create_trigger(:test, :identity, :tf, :after=>true, :events=>:insert, :args=>[1, 'a'])
636
+ @db.create_trigger(:test, :identity, :tf, :each_row=>true, :when=> {Sequel[:new][:name] => 'b'})
637
+ @db.drop_trigger(:test, :identity)
638
+ @db.drop_trigger(:test, :identity, :if_exists=>true, :cascade=>true)
639
+ @db.sqls.map{|s| s.gsub(/\s+/, ' ').strip}.must_equal ['CREATE TRIGGER identity BEFORE INSERT OR UPDATE OR DELETE ON "test" FOR EACH ROW EXECUTE PROCEDURE tf()',
640
+ 'CREATE TRIGGER identity AFTER INSERT ON "test" EXECUTE PROCEDURE tf(1, \'a\')',
641
+ %q{CREATE TRIGGER identity BEFORE INSERT OR UPDATE OR DELETE ON "test" FOR EACH ROW WHEN ("new"."name" = 'b') EXECUTE PROCEDURE tf()},
642
+ 'DROP TRIGGER identity ON "test"',
643
+ 'DROP TRIGGER IF EXISTS identity ON "test" CASCADE']
644
+ end
645
+ end
646
+
647
+ describe "MySQL support" do
648
+ before do
649
+ @db = Sequel.mock(:host=>'mysql')
650
+ end
651
+
652
+ it "should support spatial indexes" do
653
+ @db.alter_table(:posts){add_spatial_index [:geom]}
654
+ @db.sqls.must_equal ['CREATE SPATIAL INDEX `posts_geom_index` ON `posts` (`geom`)']
655
+ end
656
+
657
+ it "should support fulltext indexes and full_text_search" do
658
+ @db.alter_table(:posts){add_full_text_index :title; add_full_text_index [:title, :body]}
659
+ @db.sqls.must_equal [ "CREATE FULLTEXT INDEX `posts_title_index` ON `posts` (`title`)", "CREATE FULLTEXT INDEX `posts_title_body_index` ON `posts` (`title`, `body`)" ]
660
+ end
661
+
662
+ it "should support indexes with index type" do
663
+ @db.alter_table(:posts){add_index :id, :type => :btree}
664
+ @db.sqls.must_equal ["CREATE INDEX `posts_id_index` USING btree ON `posts` (`id`)"]
665
+ end
666
+ end
667
+
668
+ describe "SQLite support" do
669
+ before do
670
+ @db = Sequel.mock(:host=>'sqlite')
671
+ end
672
+
673
+ it "should use a string literal for Sequel[:col].as(:alias)" do
674
+ @db.literal(Sequel[:c].as(:a)).must_equal "`c` AS 'a'"
675
+ end
676
+
677
+ it "should use a string literal for Sequel[:table][:col].as(:alias)" do
678
+ @db.literal(Sequel[:t][:c].as(:a)).must_equal "`t`.`c` AS 'a'"
679
+ end
680
+
681
+ it "should use a string literal for :column.as(:alias)" do
682
+ @db.literal(Sequel.as(:c, :a)).must_equal "`c` AS 'a'"
683
+ end
684
+
685
+ it "should use a string literal in the SELECT clause" do
686
+ @db[:t].select(Sequel[:c].as(:a)).sql.must_equal "SELECT `c` AS 'a' FROM `t`"
687
+ end
688
+
689
+ it "should use a string literal in the FROM clause" do
690
+ @db[Sequel[:t].as(:a)].sql.must_equal "SELECT * FROM `t` AS 'a'"
691
+ end
692
+
693
+ it "should use a string literal in the JOIN clause" do
694
+ @db[:t].join_table(:natural, :j, nil, :table_alias=>:a).sql.must_equal "SELECT * FROM `t` NATURAL JOIN `j` AS 'a'"
695
+ end
696
+
697
+ it "should have support for various #transaction modes" do
698
+ @db.transaction{}
699
+ @db.transaction(:mode => :immediate){}
700
+ @db.transaction(:mode => :exclusive){}
701
+ @db.transaction(:mode => :deferred){}
702
+ @db.sqls.must_equal ["BEGIN", "COMMIT", "BEGIN IMMEDIATE TRANSACTION", "COMMIT", "BEGIN EXCLUSIVE TRANSACTION", "COMMIT", "BEGIN DEFERRED TRANSACTION", "COMMIT"]
703
+
704
+ @db.transaction_mode.must_be_nil
705
+ @db.transaction_mode = :immediate
706
+ @db.transaction_mode.must_equal :immediate
707
+ @db.transaction{}
708
+ @db.transaction(:mode => :exclusive){}
709
+ @db.sqls.must_equal ["BEGIN IMMEDIATE TRANSACTION", "COMMIT", "BEGIN EXCLUSIVE TRANSACTION", "COMMIT"]
710
+ end
711
+
712
+ it "should choose a temporary table name that isn't already used when dropping or renaming columns" do
713
+ exists = [true, true, false]
714
+ @db.define_singleton_method(:table_exists?){|x| exists.shift}
715
+ @db.drop_column(:test3, :i)
716
+ @db.sqls.grep(/ALTER/).must_equal ["ALTER TABLE `test3` RENAME TO `test3_backup2`"]
717
+
718
+ exists = [true, true, true, false]
719
+ @db.rename_column(:test3, :h, :i)
720
+ @db.sqls.grep(/ALTER/).must_equal ["ALTER TABLE `test3` RENAME TO `test3_backup3`"]
721
+ end
722
+ end