sequel 5.28.0 → 5.33.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (380) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +64 -1922
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +1 -1
  5. data/doc/advanced_associations.rdoc +4 -4
  6. data/doc/association_basics.rdoc +3 -3
  7. data/doc/code_order.rdoc +12 -2
  8. data/doc/model_dataset_method_design.rdoc +1 -1
  9. data/doc/postgresql.rdoc +71 -0
  10. data/doc/release_notes/5.29.0.txt +22 -0
  11. data/doc/release_notes/5.30.0.txt +20 -0
  12. data/doc/release_notes/5.31.0.txt +148 -0
  13. data/doc/release_notes/5.32.0.txt +46 -0
  14. data/doc/release_notes/5.33.0.txt +24 -0
  15. data/doc/testing.rdoc +1 -1
  16. data/lib/sequel/adapters/postgres.rb +5 -1
  17. data/lib/sequel/adapters/shared/access.rb +6 -6
  18. data/lib/sequel/adapters/shared/mssql.rb +5 -5
  19. data/lib/sequel/adapters/shared/mysql.rb +10 -10
  20. data/lib/sequel/adapters/shared/oracle.rb +16 -16
  21. data/lib/sequel/adapters/shared/postgres.rb +169 -14
  22. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  23. data/lib/sequel/adapters/shared/sqlite.rb +32 -5
  24. data/lib/sequel/adapters/tinytds.rb +1 -1
  25. data/lib/sequel/connection_pool/sharded_threaded.rb +2 -2
  26. data/lib/sequel/connection_pool/threaded.rb +1 -1
  27. data/lib/sequel/core.rb +318 -314
  28. data/lib/sequel/database/query.rb +1 -1
  29. data/lib/sequel/database/schema_generator.rb +1 -1
  30. data/lib/sequel/database/transactions.rb +8 -12
  31. data/lib/sequel/dataset/misc.rb +2 -2
  32. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  33. data/lib/sequel/extensions/connection_validator.rb +2 -2
  34. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  35. data/lib/sequel/extensions/index_caching.rb +9 -7
  36. data/lib/sequel/extensions/integer64.rb +2 -0
  37. data/lib/sequel/extensions/migration.rb +1 -1
  38. data/lib/sequel/extensions/pg_enum.rb +5 -2
  39. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  40. data/lib/sequel/extensions/pg_inet.rb +13 -5
  41. data/lib/sequel/extensions/pg_interval.rb +2 -0
  42. data/lib/sequel/extensions/pg_range.rb +2 -0
  43. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  44. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  45. data/lib/sequel/extensions/schema_dumper.rb +10 -4
  46. data/lib/sequel/extensions/server_block.rb +3 -3
  47. data/lib/sequel/model/associations.rb +18 -5
  48. data/lib/sequel/model/base.rb +60 -53
  49. data/lib/sequel/model/plugins.rb +1 -0
  50. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  51. data/lib/sequel/plugins/association_multi_add_remove.rb +2 -0
  52. data/lib/sequel/plugins/association_proxies.rb +2 -0
  53. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  54. data/lib/sequel/plugins/class_table_inheritance.rb +26 -26
  55. data/lib/sequel/plugins/dirty.rb +13 -13
  56. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  57. data/lib/sequel/plugins/forbid_lazy_load.rb +214 -0
  58. data/lib/sequel/plugins/json_serializer.rb +18 -11
  59. data/lib/sequel/plugins/single_table_inheritance.rb +15 -15
  60. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  61. data/lib/sequel/plugins/subclasses.rb +2 -0
  62. data/lib/sequel/plugins/throw_failures.rb +1 -1
  63. data/lib/sequel/timezones.rb +6 -4
  64. data/lib/sequel/version.rb +1 -1
  65. metadata +18 -367
  66. data/Rakefile +0 -151
  67. data/doc/release_notes/4.0.0.txt +0 -262
  68. data/doc/release_notes/4.1.0.txt +0 -85
  69. data/doc/release_notes/4.10.0.txt +0 -226
  70. data/doc/release_notes/4.11.0.txt +0 -147
  71. data/doc/release_notes/4.12.0.txt +0 -105
  72. data/doc/release_notes/4.13.0.txt +0 -169
  73. data/doc/release_notes/4.14.0.txt +0 -68
  74. data/doc/release_notes/4.15.0.txt +0 -56
  75. data/doc/release_notes/4.16.0.txt +0 -36
  76. data/doc/release_notes/4.17.0.txt +0 -38
  77. data/doc/release_notes/4.18.0.txt +0 -36
  78. data/doc/release_notes/4.19.0.txt +0 -45
  79. data/doc/release_notes/4.2.0.txt +0 -129
  80. data/doc/release_notes/4.20.0.txt +0 -79
  81. data/doc/release_notes/4.21.0.txt +0 -94
  82. data/doc/release_notes/4.22.0.txt +0 -72
  83. data/doc/release_notes/4.23.0.txt +0 -65
  84. data/doc/release_notes/4.24.0.txt +0 -99
  85. data/doc/release_notes/4.25.0.txt +0 -181
  86. data/doc/release_notes/4.26.0.txt +0 -44
  87. data/doc/release_notes/4.27.0.txt +0 -78
  88. data/doc/release_notes/4.28.0.txt +0 -57
  89. data/doc/release_notes/4.29.0.txt +0 -41
  90. data/doc/release_notes/4.3.0.txt +0 -40
  91. data/doc/release_notes/4.30.0.txt +0 -37
  92. data/doc/release_notes/4.31.0.txt +0 -57
  93. data/doc/release_notes/4.32.0.txt +0 -132
  94. data/doc/release_notes/4.33.0.txt +0 -88
  95. data/doc/release_notes/4.34.0.txt +0 -86
  96. data/doc/release_notes/4.35.0.txt +0 -130
  97. data/doc/release_notes/4.36.0.txt +0 -116
  98. data/doc/release_notes/4.37.0.txt +0 -50
  99. data/doc/release_notes/4.38.0.txt +0 -67
  100. data/doc/release_notes/4.39.0.txt +0 -127
  101. data/doc/release_notes/4.4.0.txt +0 -92
  102. data/doc/release_notes/4.40.0.txt +0 -179
  103. data/doc/release_notes/4.41.0.txt +0 -77
  104. data/doc/release_notes/4.42.0.txt +0 -221
  105. data/doc/release_notes/4.43.0.txt +0 -87
  106. data/doc/release_notes/4.44.0.txt +0 -125
  107. data/doc/release_notes/4.45.0.txt +0 -370
  108. data/doc/release_notes/4.46.0.txt +0 -404
  109. data/doc/release_notes/4.47.0.txt +0 -56
  110. data/doc/release_notes/4.48.0.txt +0 -293
  111. data/doc/release_notes/4.49.0.txt +0 -222
  112. data/doc/release_notes/4.5.0.txt +0 -34
  113. data/doc/release_notes/4.6.0.txt +0 -30
  114. data/doc/release_notes/4.7.0.txt +0 -103
  115. data/doc/release_notes/4.8.0.txt +0 -175
  116. data/doc/release_notes/4.9.0.txt +0 -190
  117. data/spec/adapter_spec.rb +0 -4
  118. data/spec/adapters/db2_spec.rb +0 -170
  119. data/spec/adapters/mssql_spec.rb +0 -828
  120. data/spec/adapters/mysql_spec.rb +0 -1060
  121. data/spec/adapters/oracle_spec.rb +0 -371
  122. data/spec/adapters/postgres_spec.rb +0 -4476
  123. data/spec/adapters/spec_helper.rb +0 -44
  124. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  125. data/spec/adapters/sqlite_spec.rb +0 -652
  126. data/spec/bin_spec.rb +0 -278
  127. data/spec/core/connection_pool_spec.rb +0 -1250
  128. data/spec/core/database_spec.rb +0 -2915
  129. data/spec/core/dataset_spec.rb +0 -5547
  130. data/spec/core/deprecated_spec.rb +0 -70
  131. data/spec/core/expression_filters_spec.rb +0 -1498
  132. data/spec/core/mock_adapter_spec.rb +0 -722
  133. data/spec/core/object_graph_spec.rb +0 -336
  134. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  135. data/spec/core/schema_generator_spec.rb +0 -214
  136. data/spec/core/schema_spec.rb +0 -1844
  137. data/spec/core/spec_helper.rb +0 -24
  138. data/spec/core/version_spec.rb +0 -14
  139. data/spec/core_extensions_spec.rb +0 -763
  140. data/spec/core_model_spec.rb +0 -2
  141. data/spec/core_spec.rb +0 -1
  142. data/spec/deprecation_helper.rb +0 -30
  143. data/spec/extensions/accessed_columns_spec.rb +0 -51
  144. data/spec/extensions/active_model_spec.rb +0 -99
  145. data/spec/extensions/after_initialize_spec.rb +0 -28
  146. data/spec/extensions/any_not_empty_spec.rb +0 -23
  147. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  148. data/spec/extensions/association_dependencies_spec.rb +0 -125
  149. data/spec/extensions/association_multi_add_remove_spec.rb +0 -1041
  150. data/spec/extensions/association_pks_spec.rb +0 -423
  151. data/spec/extensions/association_proxies_spec.rb +0 -100
  152. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  153. data/spec/extensions/auto_validations_spec.rb +0 -229
  154. data/spec/extensions/blacklist_security_spec.rb +0 -95
  155. data/spec/extensions/blank_spec.rb +0 -69
  156. data/spec/extensions/boolean_readers_spec.rb +0 -93
  157. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  158. data/spec/extensions/caching_spec.rb +0 -273
  159. data/spec/extensions/caller_logging_spec.rb +0 -52
  160. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  161. data/spec/extensions/column_conflicts_spec.rb +0 -75
  162. data/spec/extensions/column_select_spec.rb +0 -129
  163. data/spec/extensions/columns_introspection_spec.rb +0 -90
  164. data/spec/extensions/columns_updated_spec.rb +0 -35
  165. data/spec/extensions/composition_spec.rb +0 -248
  166. data/spec/extensions/connection_expiration_spec.rb +0 -151
  167. data/spec/extensions/connection_validator_spec.rb +0 -144
  168. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  169. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  170. data/spec/extensions/constraint_validations_spec.rb +0 -439
  171. data/spec/extensions/core_refinements_spec.rb +0 -528
  172. data/spec/extensions/csv_serializer_spec.rb +0 -183
  173. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  174. data/spec/extensions/dataset_associations_spec.rb +0 -365
  175. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  176. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  177. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  178. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  179. data/spec/extensions/defaults_setter_spec.rb +0 -150
  180. data/spec/extensions/delay_add_association_spec.rb +0 -73
  181. data/spec/extensions/dirty_spec.rb +0 -222
  182. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  183. data/spec/extensions/eager_each_spec.rb +0 -62
  184. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  185. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  186. data/spec/extensions/error_splitter_spec.rb +0 -18
  187. data/spec/extensions/error_sql_spec.rb +0 -20
  188. data/spec/extensions/escaped_like_spec.rb +0 -40
  189. data/spec/extensions/eval_inspect_spec.rb +0 -81
  190. data/spec/extensions/exclude_or_null_spec.rb +0 -15
  191. data/spec/extensions/finder_spec.rb +0 -260
  192. data/spec/extensions/force_encoding_spec.rb +0 -126
  193. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  194. data/spec/extensions/graph_each_spec.rb +0 -113
  195. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  196. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  197. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  198. data/spec/extensions/index_caching_spec.rb +0 -66
  199. data/spec/extensions/inflector_spec.rb +0 -183
  200. data/spec/extensions/input_transformer_spec.rb +0 -69
  201. data/spec/extensions/insert_conflict_spec.rb +0 -103
  202. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  203. data/spec/extensions/instance_filters_spec.rb +0 -79
  204. data/spec/extensions/instance_hooks_spec.rb +0 -246
  205. data/spec/extensions/integer64_spec.rb +0 -22
  206. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  207. data/spec/extensions/json_serializer_spec.rb +0 -336
  208. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  209. data/spec/extensions/list_spec.rb +0 -291
  210. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  211. data/spec/extensions/many_through_many_spec.rb +0 -2177
  212. data/spec/extensions/migration_spec.rb +0 -864
  213. data/spec/extensions/modification_detection_spec.rb +0 -93
  214. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  215. data/spec/extensions/named_timezones_spec.rb +0 -218
  216. data/spec/extensions/nested_attributes_spec.rb +0 -815
  217. data/spec/extensions/null_dataset_spec.rb +0 -85
  218. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  219. data/spec/extensions/pagination_spec.rb +0 -116
  220. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  221. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  222. data/spec/extensions/pg_array_spec.rb +0 -398
  223. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -209
  224. data/spec/extensions/pg_enum_spec.rb +0 -118
  225. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  226. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  227. data/spec/extensions/pg_hstore_spec.rb +0 -219
  228. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  229. data/spec/extensions/pg_inet_spec.rb +0 -72
  230. data/spec/extensions/pg_interval_spec.rb +0 -103
  231. data/spec/extensions/pg_json_ops_spec.rb +0 -356
  232. data/spec/extensions/pg_json_spec.rb +0 -451
  233. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  234. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  235. data/spec/extensions/pg_range_spec.rb +0 -600
  236. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  237. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  238. data/spec/extensions/pg_row_spec.rb +0 -363
  239. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  240. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  241. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  242. data/spec/extensions/prepared_statements_spec.rb +0 -177
  243. data/spec/extensions/pretty_table_spec.rb +0 -123
  244. data/spec/extensions/query_spec.rb +0 -94
  245. data/spec/extensions/rcte_tree_spec.rb +0 -387
  246. data/spec/extensions/round_timestamps_spec.rb +0 -39
  247. data/spec/extensions/s_spec.rb +0 -60
  248. data/spec/extensions/schema_caching_spec.rb +0 -64
  249. data/spec/extensions/schema_dumper_spec.rb +0 -870
  250. data/spec/extensions/select_remove_spec.rb +0 -38
  251. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  252. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  253. data/spec/extensions/serialization_spec.rb +0 -365
  254. data/spec/extensions/server_block_spec.rb +0 -135
  255. data/spec/extensions/server_logging_spec.rb +0 -45
  256. data/spec/extensions/sharding_spec.rb +0 -197
  257. data/spec/extensions/shared_caching_spec.rb +0 -151
  258. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  259. data/spec/extensions/singular_table_names_spec.rb +0 -22
  260. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  261. data/spec/extensions/spec_helper.rb +0 -70
  262. data/spec/extensions/split_array_nil_spec.rb +0 -24
  263. data/spec/extensions/split_values_spec.rb +0 -57
  264. data/spec/extensions/sql_comments_spec.rb +0 -33
  265. data/spec/extensions/sql_expr_spec.rb +0 -59
  266. data/spec/extensions/static_cache_cache_spec.rb +0 -35
  267. data/spec/extensions/static_cache_spec.rb +0 -471
  268. data/spec/extensions/string_agg_spec.rb +0 -90
  269. data/spec/extensions/string_date_time_spec.rb +0 -95
  270. data/spec/extensions/string_stripper_spec.rb +0 -68
  271. data/spec/extensions/subclasses_spec.rb +0 -79
  272. data/spec/extensions/subset_conditions_spec.rb +0 -38
  273. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  274. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  275. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  276. data/spec/extensions/table_select_spec.rb +0 -83
  277. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  278. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  279. data/spec/extensions/throw_failures_spec.rb +0 -74
  280. data/spec/extensions/timestamps_spec.rb +0 -209
  281. data/spec/extensions/to_dot_spec.rb +0 -153
  282. data/spec/extensions/touch_spec.rb +0 -226
  283. data/spec/extensions/tree_spec.rb +0 -334
  284. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  285. data/spec/extensions/unlimited_update_spec.rb +0 -21
  286. data/spec/extensions/update_or_create_spec.rb +0 -83
  287. data/spec/extensions/update_primary_key_spec.rb +0 -105
  288. data/spec/extensions/update_refresh_spec.rb +0 -59
  289. data/spec/extensions/uuid_spec.rb +0 -101
  290. data/spec/extensions/validate_associated_spec.rb +0 -52
  291. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  292. data/spec/extensions/validation_contexts_spec.rb +0 -31
  293. data/spec/extensions/validation_helpers_spec.rb +0 -525
  294. data/spec/extensions/whitelist_security_spec.rb +0 -157
  295. data/spec/extensions/xml_serializer_spec.rb +0 -213
  296. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  297. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  298. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  299. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  300. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  301. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  302. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  303. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  304. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  305. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  306. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  307. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  308. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  309. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  310. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  311. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  312. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  313. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  314. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  315. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  316. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  317. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  318. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  319. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  320. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  321. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  322. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  323. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  324. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  325. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  326. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  327. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  328. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  329. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  330. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  331. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  332. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  333. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  334. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  335. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  336. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  337. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  338. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  339. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  340. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  341. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  342. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  343. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  344. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  345. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  346. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  347. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  348. data/spec/guards_helper.rb +0 -59
  349. data/spec/integration/associations_test.rb +0 -2597
  350. data/spec/integration/database_test.rb +0 -113
  351. data/spec/integration/dataset_test.rb +0 -2037
  352. data/spec/integration/eager_loader_test.rb +0 -687
  353. data/spec/integration/migrator_test.rb +0 -262
  354. data/spec/integration/model_test.rb +0 -203
  355. data/spec/integration/plugin_test.rb +0 -2423
  356. data/spec/integration/prepared_statement_test.rb +0 -405
  357. data/spec/integration/schema_test.rb +0 -903
  358. data/spec/integration/spec_helper.rb +0 -71
  359. data/spec/integration/timezone_test.rb +0 -86
  360. data/spec/integration/transaction_test.rb +0 -603
  361. data/spec/integration/type_test.rb +0 -127
  362. data/spec/model/association_reflection_spec.rb +0 -803
  363. data/spec/model/associations_spec.rb +0 -4738
  364. data/spec/model/base_spec.rb +0 -875
  365. data/spec/model/class_dataset_methods_spec.rb +0 -146
  366. data/spec/model/dataset_methods_spec.rb +0 -198
  367. data/spec/model/eager_loading_spec.rb +0 -2377
  368. data/spec/model/hooks_spec.rb +0 -370
  369. data/spec/model/inflector_spec.rb +0 -26
  370. data/spec/model/model_spec.rb +0 -956
  371. data/spec/model/plugins_spec.rb +0 -429
  372. data/spec/model/record_spec.rb +0 -2118
  373. data/spec/model/spec_helper.rb +0 -46
  374. data/spec/model/validations_spec.rb +0 -220
  375. data/spec/model_no_assoc_spec.rb +0 -1
  376. data/spec/model_spec.rb +0 -1
  377. data/spec/plugin_spec.rb +0 -1
  378. data/spec/sequel_coverage.rb +0 -15
  379. data/spec/sequel_warning.rb +0 -4
  380. data/spec/spec_config.rb +0 -12
@@ -1,722 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel Mock Adapter" do
4
- it "should have an adapter method" do
5
- db = Sequel.mock
6
- db.must_be_kind_of(Sequel::Mock::Database)
7
- db.adapter_scheme.must_equal :mock
8
- end
9
-
10
- it "should support registering mock adapter type" do
11
- begin
12
- Module.new do
13
- Sequel::Database.set_shared_adapter_scheme(:foo, self)
14
-
15
- def self.mock_adapter_setup(db)
16
- db.instance_variable_set(:@foo, :foo)
17
- end
18
-
19
- module self::DatabaseMethods
20
- def foo
21
- @foo
22
- end
23
- end
24
-
25
- module self::DatasetMethods
26
- def foo
27
- db.foo
28
- end
29
- end
30
- end
31
-
32
- Sequel.connect('mock://foo') do |db|
33
- db.foo.must_equal :foo
34
- db.dataset.foo.must_equal :foo
35
- end
36
- ensure
37
- Sequel.synchronize{Sequel::SHARED_ADAPTER_MAP.delete(:foo)}
38
- end
39
- end
40
-
41
- it "should have constructor accept no arguments" do
42
- Sequel.require 'adapters/mock'
43
- Sequel::Mock::Database.new.must_be_kind_of(Sequel::Mock::Database)
44
- end
45
-
46
- it "should each not return any rows by default" do
47
- called = false
48
- Sequel.mock[:t].each{|r| called = true}
49
- called.must_equal false
50
- end
51
-
52
- it "should return 0 for update/delete/with_sql_delete/execute_dui by default" do
53
- Sequel.mock[:t].update(:a=>1).must_equal 0
54
- Sequel.mock[:t].delete.must_equal 0
55
- Sequel.mock[:t].with_sql_delete('DELETE FROM t').must_equal 0
56
- Sequel.mock.execute_dui('DELETE FROM t').must_equal 0
57
- end
58
-
59
- it "should return nil for insert/execute_insert by default" do
60
- Sequel.mock[:t].insert(:a=>1).must_be_nil
61
- Sequel.mock.execute_insert('INSERT INTO a () DEFAULT VALUES').must_be_nil
62
- end
63
-
64
- it "should be able to set the rows returned by each using :fetch option with a single hash" do
65
- rs = []
66
- db = Sequel.mock(:fetch=>{:a=>1})
67
- db[:t].each{|r| rs << r}
68
- rs.must_equal [{:a=>1}]
69
- db[:t].each{|r| rs << r}
70
- rs.must_equal [{:a=>1}, {:a=>1}]
71
- db[:t].each{|r| r[:a] = 2; rs << r}
72
- rs.must_equal [{:a=>1}, {:a=>1}, {:a=>2}]
73
- db[:t].each{|r| rs << r}
74
- rs.must_equal [{:a=>1}, {:a=>1}, {:a=>2}, {:a=>1}]
75
- end
76
-
77
- it "should be able to set the rows returned by each using :fetch option with an array of hashes" do
78
- rs = []
79
- db = Sequel.mock(:fetch=>[{:a=>1}, {:a=>2}])
80
- db[:t].each{|r| rs << r}
81
- rs.must_equal [{:a=>1}, {:a=>2}]
82
- db[:t].each{|r| rs << r}
83
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>1}, {:a=>2}]
84
- db[:t].each{|r| r[:a] += 2; rs << r}
85
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>1}, {:a=>2}, {:a=>3}, {:a=>4}]
86
- db[:t].each{|r| rs << r}
87
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>1}, {:a=>2}, {:a=>3}, {:a=>4}, {:a=>1}, {:a=>2}]
88
- end
89
-
90
- it "should be able to set the rows returned by each using :fetch option with an array or arrays of hashes" do
91
- rs = []
92
- db = Sequel.mock(:fetch=>[[{:a=>1}, {:a=>2}], [{:a=>3}, {:a=>4}]])
93
- db[:t].each{|r| rs << r}
94
- rs.must_equal [{:a=>1}, {:a=>2}]
95
- db[:t].each{|r| rs << r}
96
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>3}, {:a=>4}]
97
- db[:t].each{|r| rs << r}
98
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>3}, {:a=>4}]
99
- end
100
-
101
- it "should be able to set the rows returned by each using :fetch option with a proc that takes sql" do
102
- rs = []
103
- db = Sequel.mock(:fetch=>proc{|sql| sql =~ /FROM t/ ? {:b=>1} : [{:a=>1}, {:a=>2}]})
104
- db[:t].each{|r| rs << r}
105
- rs.must_equal [{:b=>1}]
106
- db[:b].each{|r| rs << r}
107
- rs.must_equal [{:b=>1}, {:a=>1}, {:a=>2}]
108
- db[:t].each{|r| r[:b] += 1; rs << r}
109
- db[:b].each{|r| r[:a] += 2; rs << r}
110
- rs.must_equal [{:b=>1}, {:a=>1}, {:a=>2}, {:b=>2}, {:a=>3}, {:a=>4}]
111
- db[:t].each{|r| rs << r}
112
- db[:b].each{|r| rs << r}
113
- rs.must_equal [{:b=>1}, {:a=>1}, {:a=>2}, {:b=>2}, {:a=>3}, {:a=>4}, {:b=>1}, {:a=>1}, {:a=>2}]
114
- end
115
-
116
- it "should have a fetch= method for setting rows returned by each after the fact" do
117
- rs = []
118
- db = Sequel.mock
119
- db.fetch = {:a=>1}
120
- db[:t].each{|r| rs << r}
121
- rs.must_equal [{:a=>1}]
122
- db[:t].each{|r| rs << r}
123
- rs.must_equal [{:a=>1}] * 2
124
- end
125
-
126
- it "should be able to set an exception to raise by setting the :fetch option to an exception class " do
127
- db = Sequel.mock(:fetch=>ArgumentError)
128
- proc{db[:t].all}.must_raise(Sequel::DatabaseError)
129
- begin
130
- db[:t].all
131
- rescue => e
132
- end
133
- e.must_be_kind_of(Sequel::DatabaseError)
134
- e.wrapped_exception.must_be_kind_of(ArgumentError)
135
- end
136
-
137
- it "should be able to set separate kinds of results for fetch using an array" do
138
- rs = []
139
- db = Sequel.mock(:fetch=>[{:a=>1}, [{:a=>2}, {:a=>3}], proc{|s| {:a=>4}}, proc{|s| }, nil, ArgumentError])
140
- db[:t].each{|r| rs << r}
141
- rs.must_equal [{:a=>1}]
142
- db[:t].each{|r| rs << r}
143
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>3}]
144
- db[:t].each{|r| rs << r}
145
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>3}, {:a=>4}]
146
- db[:t].each{|r| rs << r}
147
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>3}, {:a=>4}]
148
- db[:t].each{|r| rs << r}
149
- rs.must_equal [{:a=>1}, {:a=>2}, {:a=>3}, {:a=>4}]
150
- proc{db[:t].all}.must_raise(Sequel::DatabaseError)
151
- end
152
-
153
- it "should be able to set the rows returned by each on a per dataset basis using with_fetch" do
154
- rs = []
155
- db = Sequel.mock(:fetch=>{:a=>1})
156
- ds = db[:t]
157
- ds.each{|r| rs << r}
158
- rs.must_equal [{:a=>1}]
159
- ds = ds.with_fetch(:b=>2)
160
- ds.each{|r| rs << r}
161
- rs.must_equal [{:a=>1}, {:b=>2}]
162
- end
163
-
164
- it "should raise Error if given an invalid object to fetch" do
165
- proc{Sequel.mock(:fetch=>Class.new).get(:a)}.must_raise(Sequel::DatabaseError)
166
- proc{Sequel.mock(:fetch=>Object.new).get(:a)}.must_raise(Sequel::DatabaseError)
167
- end
168
-
169
- it "should be able to set the number of rows modified by update and delete using :numrows option as an integer" do
170
- db = Sequel.mock(:numrows=>2)
171
- db[:t].update(:a=>1).must_equal 2
172
- db[:t].delete.must_equal 2
173
- db[:t].update(:a=>1).must_equal 2
174
- db[:t].delete.must_equal 2
175
- end
176
-
177
- it "should be able to set the number of rows modified by update and delete using :numrows option as an array of integers" do
178
- db = Sequel.mock(:numrows=>[2, 1])
179
- db[:t].update(:a=>1).must_equal 2
180
- db[:t].delete.must_equal 1
181
- db[:t].update(:a=>1).must_equal 0
182
- db[:t].delete.must_equal 0
183
- end
184
-
185
- it "should be able to set the number of rows modified by update and delete using :numrows option as a proc" do
186
- db = Sequel.mock(:numrows=>proc{|sql| sql =~ / t/ ? 2 : 1})
187
- db[:t].update(:a=>1).must_equal 2
188
- db[:t].delete.must_equal 2
189
- db[:b].update(:a=>1).must_equal 1
190
- db[:b].delete.must_equal 1
191
- end
192
-
193
- it "should be able to set an exception to raise by setting the :numrows option to an exception class " do
194
- db = Sequel.mock(:numrows=>ArgumentError)
195
- proc{db[:t].update(:a=>1)}.must_raise(Sequel::DatabaseError)
196
- begin
197
- db[:t].delete
198
- rescue => e
199
- end
200
- e.must_be_kind_of(Sequel::DatabaseError)
201
- e.wrapped_exception.must_be_kind_of(ArgumentError)
202
- end
203
-
204
- it "should be able to set separate kinds of results for numrows using an array" do
205
- db = Sequel.mock(:numrows=>[1, proc{|s| 2}, nil, ArgumentError])
206
- db[:t].delete.must_equal 1
207
- db[:t].update(:a=>1).must_equal 2
208
- db[:t].delete.must_equal 0
209
- proc{db[:t].delete}.must_raise(Sequel::DatabaseError)
210
- end
211
-
212
- it "should have a numrows= method to set the number of rows modified by update and delete after the fact" do
213
- db = Sequel.mock
214
- db.numrows = 2
215
- db[:t].update(:a=>1).must_equal 2
216
- db[:t].delete.must_equal 2
217
- db[:t].update(:a=>1).must_equal 2
218
- db[:t].delete.must_equal 2
219
- end
220
-
221
- it "should be able to set the number of rows modified by update and delete on a per dataset basis" do
222
- db = Sequel.mock(:numrows=>2)
223
- ds = db[:t]
224
- ds.update(:a=>1).must_equal 2
225
- ds.delete.must_equal 2
226
- ds = ds.with_numrows(3)
227
- ds.update(:a=>1).must_equal 3
228
- ds.delete.must_equal 3
229
- end
230
-
231
- it "should raise Error if given an invalid object for numrows or autoid" do
232
- proc{Sequel.mock(:numrows=>Class.new)[:a].delete}.must_raise(Sequel::DatabaseError)
233
- proc{Sequel.mock(:numrows=>Object.new)[:a].delete}.must_raise(Sequel::DatabaseError)
234
- proc{Sequel.mock(:autoid=>Class.new)[:a].insert}.must_raise(Sequel::DatabaseError)
235
- proc{Sequel.mock(:autoid=>Object.new)[:a].insert}.must_raise(Sequel::DatabaseError)
236
- end
237
-
238
- it "should be able to set the autogenerated primary key returned by insert using :autoid option as an integer" do
239
- db = Sequel.mock(:autoid=>1)
240
- db[:t].insert(:a=>1).must_equal 1
241
- db[:t].insert(:a=>1).must_equal 2
242
- db[:t].insert(:a=>1).must_equal 3
243
- end
244
-
245
- it "should be able to set the autogenerated primary key returned by insert using :autoid option as an array of integers" do
246
- db = Sequel.mock(:autoid=>[1, 3, 5])
247
- db[:t].insert(:a=>1).must_equal 1
248
- db[:t].insert(:a=>1).must_equal 3
249
- db[:t].insert(:a=>1).must_equal 5
250
- db[:t].insert(:a=>1).must_be_nil
251
- end
252
-
253
- it "should be able to set the autogenerated primary key returned by insert using :autoid option as a proc" do
254
- db = Sequel.mock(:autoid=>proc{|sql| sql =~ /INTO t / ? 2 : 1})
255
- db[:t].insert(:a=>1).must_equal 2
256
- db[:t].insert(:a=>1).must_equal 2
257
- db[:b].insert(:a=>1).must_equal 1
258
- db[:b].insert(:a=>1).must_equal 1
259
- end
260
-
261
- it "should be able to set an exception to raise by setting the :autoid option to an exception class " do
262
- db = Sequel.mock(:autoid=>ArgumentError)
263
- proc{db[:t].insert(:a=>1)}.must_raise(Sequel::DatabaseError)
264
- begin
265
- db[:t].insert
266
- rescue => e
267
- end
268
- e.must_be_kind_of(Sequel::DatabaseError)
269
- e.wrapped_exception.must_be_kind_of(ArgumentError)
270
- end
271
-
272
- it "should be able to set separate kinds of results for autoid using an array" do
273
- db = Sequel.mock(:autoid=>[1, proc{|s| 2}, nil, ArgumentError])
274
- db[:t].insert.must_equal 1
275
- db[:t].insert.must_equal 2
276
- db[:t].insert.must_be_nil
277
- proc{db[:t].insert}.must_raise(Sequel::DatabaseError)
278
- end
279
-
280
- it "should have an autoid= method to set the autogenerated primary key returned by insert after the fact" do
281
- db = Sequel.mock
282
- db.autoid = 1
283
- db[:t].insert(:a=>1).must_equal 1
284
- db[:t].insert(:a=>1).must_equal 2
285
- db[:t].insert(:a=>1).must_equal 3
286
- end
287
-
288
- it "should be able to set the autogenerated primary key returned by insert on a per dataset basis" do
289
- db = Sequel.mock(:autoid=>1)
290
- ds = db[:t]
291
- ds.insert(:a=>1).must_equal 1
292
- ds = ds.with_autoid(5)
293
- ds.insert(:a=>1).must_equal 5
294
- ds.insert(:a=>1).must_equal 6
295
- db[:t].insert(:a=>1).must_equal 2
296
- end
297
-
298
- it "should be able to set the columns to set in the dataset as an array of symbols" do
299
- db = Sequel.mock(:columns=>[:a, :b])
300
- db[:t].columns.must_equal [:a, :b]
301
- db.sqls.must_equal ["SELECT * FROM t LIMIT 1"]
302
- ds = db[:t]
303
- ds.all
304
- db.sqls.must_equal ["SELECT * FROM t"]
305
- ds.columns.must_equal [:a, :b]
306
- db.sqls.must_equal []
307
- db[:t].columns.must_equal [:a, :b]
308
- end
309
-
310
- it "should be able to set the columns to set in the dataset as an array of arrays of symbols" do
311
- db = Sequel.mock(:columns=>[[:a, :b], [:c, :d]])
312
- db[:t].columns.must_equal [:a, :b]
313
- db[:x].columns.must_equal [:c, :d]
314
- end
315
-
316
- it "should be able to set the columns to set in the dataset as a proc" do
317
- db = Sequel.mock(:columns=>proc{|sql| (sql =~ / t/) ? [:a, :b] : [:c, :d]})
318
- db[:b].columns.must_equal [:c, :d]
319
- db[:t].columns.must_equal [:a, :b]
320
- end
321
-
322
- it "should have a columns= method to set the columns to set after the fact" do
323
- db = Sequel.mock
324
- db.columns = [[:a, :b], [:c, :d]]
325
- db[:t].columns.must_equal [:a, :b]
326
- db[:x].columns.must_equal [:c, :d]
327
- end
328
-
329
- it "should raise Error if given an invalid columns" do
330
- proc{Sequel.mock(:columns=>Object.new)[:a].columns}.must_raise(Sequel::DatabaseError)
331
- end
332
-
333
- it "should not quote identifiers by default" do
334
- Sequel.mock.send(:quote_identifiers_default).must_equal false
335
- end
336
-
337
- it "should allow overriding of server_version" do
338
- db = Sequel.mock
339
- db.server_version.must_be_nil
340
- db.server_version = 80102
341
- db.server_version.must_equal 80102
342
- end
343
-
344
- it "should not fold to uppercase by default" do
345
- Sequel.mock.send(:folds_unquoted_identifiers_to_uppercase?).must_equal false
346
- end
347
-
348
- it "should keep a record of all executed SQL in #sqls" do
349
- db = Sequel.mock
350
- db[:t].all
351
- db[:b].delete
352
- db[:c].insert(:a=>1)
353
- db[:d].update(:a=>1)
354
- db.sqls.must_equal ['SELECT * FROM t', 'DELETE FROM b', 'INSERT INTO c (a) VALUES (1)', 'UPDATE d SET a = 1']
355
- end
356
-
357
- it "should clear sqls on retrieval" do
358
- db = Sequel.mock
359
- db[:t].all
360
- db.sqls.must_equal ['SELECT * FROM t']
361
- db.sqls.must_equal []
362
- end
363
-
364
- it "should also log SQL executed to the given loggers" do
365
- a = []
366
- def a.method_missing(m, *x) push(*x) end
367
- db = Sequel.mock(:loggers=>[a])
368
- db[:t].all
369
- db[:b].delete
370
- db[:c].insert(:a=>1)
371
- db[:d].update(:a=>1)
372
- a.zip(['SELECT * FROM t', 'DELETE FROM b', 'INSERT INTO c (a) VALUES (1)', 'UPDATE d SET a = 1']).each do |is, should|
373
- is.must_match should
374
- end
375
- end
376
-
377
- it "should correctly handle transactions" do
378
- db = Sequel.mock
379
- db.transaction{db[:a].all}
380
- db.sqls.must_equal ['BEGIN', 'SELECT * FROM a', 'COMMIT']
381
- db.transaction{db[:a].all; raise Sequel::Rollback}
382
- db.sqls.must_equal ['BEGIN', 'SELECT * FROM a', 'ROLLBACK']
383
- proc{db.transaction{db[:a].all; raise ArgumentError}}.must_raise(ArgumentError)
384
- db.sqls.must_equal ['BEGIN', 'SELECT * FROM a', 'ROLLBACK']
385
- proc{db.transaction(:rollback=>:reraise){db[:a].all; raise Sequel::Rollback}}.must_raise(Sequel::Rollback)
386
- db.sqls.must_equal ['BEGIN', 'SELECT * FROM a', 'ROLLBACK']
387
- db.transaction(:rollback=>:always){db[:a].all}
388
- db.sqls.must_equal ['BEGIN', 'SELECT * FROM a', 'ROLLBACK']
389
- db.transaction{db.transaction{db[:a].all; raise Sequel::Rollback}}
390
- db.sqls.must_equal ['BEGIN', 'SELECT * FROM a', 'ROLLBACK']
391
- db.transaction{db.transaction(:savepoint=>true){db[:a].all; raise Sequel::Rollback}}
392
- db.sqls.must_equal ['BEGIN', 'SAVEPOINT autopoint_1', 'SELECT * FROM a', 'ROLLBACK TO SAVEPOINT autopoint_1', 'COMMIT']
393
- db.transaction{db.transaction(:savepoint=>true){db[:a].all}; raise Sequel::Rollback}
394
- db.sqls.must_equal ['BEGIN', 'SAVEPOINT autopoint_1', 'SELECT * FROM a', 'RELEASE SAVEPOINT autopoint_1', 'ROLLBACK']
395
- end
396
-
397
- it "should correctly handle transactions when sharding" do
398
- db = Sequel.mock(:servers=>{:test=>{}})
399
- db.transaction{db.transaction(:server=>:test){db[:a].all; db[:t].server(:test).all}}
400
- db.sqls.must_equal ['BEGIN', 'BEGIN -- test', 'SELECT * FROM a', 'SELECT * FROM t -- test', 'COMMIT -- test', 'COMMIT']
401
- end
402
-
403
- it "should yield a mock connection object from synchronize" do
404
- c = Sequel.mock.synchronize{|conn| conn}
405
- c.must_be_kind_of(Sequel::Mock::Connection)
406
- end
407
-
408
- it "should deal correctly with sharding" do
409
- db = Sequel.mock(:servers=>{:test=>{}})
410
- c1 = db.synchronize{|conn| conn}
411
- c2 = db.synchronize(:test){|conn| conn}
412
- c1.server.must_equal :default
413
- c2.server.must_equal :test
414
- end
415
-
416
- it "should disconnect correctly" do
417
- db = Sequel.mock
418
- db.test_connection
419
- db.disconnect
420
- end
421
-
422
- it "should accept :extend option for extending the object with a module" do
423
- Sequel.mock(:extend=>Module.new{def foo(v) v * 2 end}).foo(3).must_equal 6
424
- end
425
-
426
- it "should accept :sqls option for where to store the SQL queries" do
427
- a = []
428
- Sequel.mock(:sqls=>a)[:t].all
429
- a.must_equal ['SELECT * FROM t']
430
- end
431
-
432
- it "should include :append option in SQL if it is given" do
433
- db = Sequel.mock(:append=>'a')
434
- db[:t].all
435
- db.sqls.must_equal ['SELECT * FROM t -- a']
436
- end
437
-
438
- it "should append :arguments option to execute to the SQL if present" do
439
- db = Sequel.mock
440
- db.execute('SELECT * FROM t', :arguments=>[1, 2])
441
- db.sqls.must_equal ['SELECT * FROM t -- args: [1, 2]']
442
- end
443
-
444
- it "should have Dataset#columns take columns to set and return self" do
445
- db = Sequel.mock
446
- ds = db[:t].columns(:id, :a, :b)
447
- ds.must_be_kind_of(Sequel::Mock::Dataset)
448
- ds.columns.must_equal [:id, :a, :b]
449
- end
450
-
451
- it "should be able to load dialects based on the database name" do
452
- Sequel.mock(:host=>'access').select(Date.new(2011, 12, 13)).sql.must_equal 'SELECT #2011-12-13#'
453
- Sequel.mock(:host=>'db2').select(1).sql.must_equal 'SELECT 1 FROM "SYSIBM"."SYSDUMMY1"'
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
- 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
- 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
- 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'))"
458
- Sequel.mock(:host=>'sqlanywhere').from(:A).offset(1).with_quote_identifiers(false).sql.must_equal 'SELECT TOP 2147483647 START AT (1 + 1) * FROM A'
459
- Sequel.mock(:host=>'sqlite')[Sequel[:a].as(:b)].with_quote_identifiers(false).sql.must_equal "SELECT * FROM a AS 'b'"
460
- end
461
-
462
- it "should be able to mock schema calls" do
463
- Sequel.mock(:host=>'mysql', :fetch=>{:Field=>'a'}).schema(:a).first.first.must_equal :a
464
- end
465
-
466
- it "should automatically set version for adapters needing versions" do
467
- Sequel.mock(:host=>'postgres').server_version.must_be :>=, 90400
468
- Sequel.mock(:host=>'mssql').server_version.must_be :>=, 11000000
469
- Sequel.mock(:host=>'mysql').server_version.must_be :>=, 50617
470
- Sequel.mock(:host=>'sqlite').sqlite_version.must_be :>=, 30804
471
- Sequel.mock(:host=>'oracle').server_version.must_be :>=, 11000000
472
- end
473
-
474
- it "should stub out the primary_key method for postgres" do
475
- Sequel.mock(:host=>'postgres').primary_key(:t).must_equal :id
476
- end
477
-
478
- it "should stub out the bound_variable_arg method for postgres" do
479
- Sequel.mock(:host=>'postgres').bound_variable_arg(:t, nil).must_equal :t
480
- end
481
-
482
- it "should handle creating tables on oracle" do
483
- Sequel.mock(:host=>'oracle').create_table(:a){String :b}
484
- end
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