sequel 5.8.0 → 5.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +409 -1795
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +4 -4
  5. data/bin/sequel +4 -0
  6. data/doc/advanced_associations.rdoc +136 -18
  7. data/doc/association_basics.rdoc +10 -5
  8. data/doc/cheat_sheet.rdoc +1 -0
  9. data/doc/code_order.rdoc +12 -2
  10. data/doc/dataset_filtering.rdoc +17 -2
  11. data/doc/mass_assignment.rdoc +3 -3
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +30 -8
  15. data/doc/postgresql.rdoc +107 -2
  16. data/doc/release_notes/5.10.0.txt +84 -0
  17. data/doc/release_notes/5.11.0.txt +83 -0
  18. data/doc/release_notes/5.12.0.txt +141 -0
  19. data/doc/release_notes/5.13.0.txt +27 -0
  20. data/doc/release_notes/5.14.0.txt +63 -0
  21. data/doc/release_notes/5.15.0.txt +39 -0
  22. data/doc/release_notes/5.16.0.txt +110 -0
  23. data/doc/release_notes/5.17.0.txt +31 -0
  24. data/doc/release_notes/5.18.0.txt +69 -0
  25. data/doc/release_notes/5.19.0.txt +28 -0
  26. data/doc/release_notes/5.20.0.txt +89 -0
  27. data/doc/release_notes/5.21.0.txt +87 -0
  28. data/doc/release_notes/5.22.0.txt +48 -0
  29. data/doc/release_notes/5.23.0.txt +56 -0
  30. data/doc/release_notes/5.24.0.txt +56 -0
  31. data/doc/release_notes/5.25.0.txt +32 -0
  32. data/doc/release_notes/5.26.0.txt +35 -0
  33. data/doc/release_notes/5.27.0.txt +21 -0
  34. data/doc/release_notes/5.28.0.txt +16 -0
  35. data/doc/release_notes/5.29.0.txt +22 -0
  36. data/doc/release_notes/5.30.0.txt +20 -0
  37. data/doc/release_notes/5.31.0.txt +148 -0
  38. data/doc/release_notes/5.32.0.txt +46 -0
  39. data/doc/release_notes/5.33.0.txt +24 -0
  40. data/doc/release_notes/5.34.0.txt +40 -0
  41. data/doc/release_notes/5.35.0.txt +56 -0
  42. data/doc/release_notes/5.36.0.txt +60 -0
  43. data/doc/release_notes/5.37.0.txt +30 -0
  44. data/doc/release_notes/5.38.0.txt +28 -0
  45. data/doc/release_notes/5.9.0.txt +99 -0
  46. data/doc/security.rdoc +10 -0
  47. data/doc/sharding.rdoc +42 -28
  48. data/doc/sql.rdoc +12 -0
  49. data/doc/testing.rdoc +24 -17
  50. data/doc/transactions.rdoc +78 -0
  51. data/doc/validations.rdoc +2 -2
  52. data/lib/sequel/adapters/ado.rb +26 -18
  53. data/lib/sequel/adapters/ado/access.rb +2 -2
  54. data/lib/sequel/adapters/ado/mssql.rb +5 -8
  55. data/lib/sequel/adapters/amalgalite.rb +1 -1
  56. data/lib/sequel/adapters/jdbc.rb +71 -27
  57. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  58. data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
  59. data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
  60. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
  61. data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
  62. data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
  63. data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
  64. data/lib/sequel/adapters/mysql.rb +14 -15
  65. data/lib/sequel/adapters/mysql2.rb +5 -3
  66. data/lib/sequel/adapters/odbc.rb +4 -6
  67. data/lib/sequel/adapters/oracle.rb +7 -7
  68. data/lib/sequel/adapters/postgres.rb +52 -16
  69. data/lib/sequel/adapters/shared/access.rb +16 -12
  70. data/lib/sequel/adapters/shared/db2.rb +5 -0
  71. data/lib/sequel/adapters/shared/mssql.rb +41 -18
  72. data/lib/sequel/adapters/shared/mysql.rb +66 -19
  73. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  74. data/lib/sequel/adapters/shared/postgres.rb +341 -95
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
  76. data/lib/sequel/adapters/shared/sqlite.rb +174 -21
  77. data/lib/sequel/adapters/sqlanywhere.rb +33 -17
  78. data/lib/sequel/adapters/sqlite.rb +78 -68
  79. data/lib/sequel/adapters/tinytds.rb +14 -6
  80. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
  82. data/lib/sequel/connection_pool.rb +2 -6
  83. data/lib/sequel/connection_pool/sharded_single.rb +7 -4
  84. data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
  85. data/lib/sequel/connection_pool/single.rb +1 -1
  86. data/lib/sequel/connection_pool/threaded.rb +26 -11
  87. data/lib/sequel/core.rb +327 -319
  88. data/lib/sequel/database/connecting.rb +7 -8
  89. data/lib/sequel/database/logging.rb +7 -1
  90. data/lib/sequel/database/misc.rb +68 -34
  91. data/lib/sequel/database/query.rb +6 -4
  92. data/lib/sequel/database/schema_generator.rb +31 -11
  93. data/lib/sequel/database/schema_methods.rb +32 -22
  94. data/lib/sequel/database/transactions.rb +129 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/dataset/actions.rb +34 -23
  97. data/lib/sequel/dataset/features.rb +34 -0
  98. data/lib/sequel/dataset/graph.rb +27 -11
  99. data/lib/sequel/dataset/misc.rb +17 -3
  100. data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
  101. data/lib/sequel/dataset/prepared_statements.rb +96 -26
  102. data/lib/sequel/dataset/query.rb +43 -8
  103. data/lib/sequel/dataset/sql.rb +189 -41
  104. data/lib/sequel/deprecated.rb +3 -1
  105. data/lib/sequel/exceptions.rb +2 -0
  106. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  107. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  108. data/lib/sequel/extensions/caller_logging.rb +79 -0
  109. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  110. data/lib/sequel/extensions/connection_expiration.rb +6 -6
  111. data/lib/sequel/extensions/connection_validator.rb +7 -6
  112. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  113. data/lib/sequel/extensions/constraint_validations.rb +53 -28
  114. data/lib/sequel/extensions/core_refinements.rb +2 -0
  115. data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
  116. data/lib/sequel/extensions/escaped_like.rb +100 -0
  117. data/lib/sequel/extensions/eval_inspect.rb +3 -1
  118. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  119. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  120. data/lib/sequel/extensions/index_caching.rb +9 -7
  121. data/lib/sequel/extensions/integer64.rb +3 -1
  122. data/lib/sequel/extensions/looser_typecasting.rb +3 -3
  123. data/lib/sequel/extensions/migration.rb +13 -6
  124. data/lib/sequel/extensions/named_timezones.rb +84 -23
  125. data/lib/sequel/extensions/pg_array.rb +87 -79
  126. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  127. data/lib/sequel/extensions/pg_enum.rb +34 -18
  128. data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
  129. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  130. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
  131. data/lib/sequel/extensions/pg_inet.rb +15 -5
  132. data/lib/sequel/extensions/pg_interval.rb +2 -0
  133. data/lib/sequel/extensions/pg_json.rb +387 -123
  134. data/lib/sequel/extensions/pg_json_ops.rb +168 -0
  135. data/lib/sequel/extensions/pg_range.rb +20 -10
  136. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  137. data/lib/sequel/extensions/pg_row.rb +3 -2
  138. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  139. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  140. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  141. data/lib/sequel/extensions/query.rb +1 -0
  142. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  143. data/lib/sequel/extensions/s.rb +2 -0
  144. data/lib/sequel/extensions/schema_dumper.rb +13 -7
  145. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
  146. data/lib/sequel/extensions/server_block.rb +18 -7
  147. data/lib/sequel/extensions/sql_comments.rb +2 -2
  148. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  149. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  150. data/lib/sequel/extensions/to_dot.rb +9 -3
  151. data/lib/sequel/model.rb +3 -1
  152. data/lib/sequel/model/associations.rb +403 -69
  153. data/lib/sequel/model/base.rb +170 -90
  154. data/lib/sequel/model/plugins.rb +105 -0
  155. data/lib/sequel/plugins/after_initialize.rb +1 -1
  156. data/lib/sequel/plugins/association_dependencies.rb +3 -3
  157. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  158. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  159. data/lib/sequel/plugins/association_pks.rb +74 -22
  160. data/lib/sequel/plugins/association_proxies.rb +6 -2
  161. data/lib/sequel/plugins/auto_validations.rb +36 -17
  162. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  163. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  164. data/lib/sequel/plugins/caching.rb +3 -0
  165. data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
  166. data/lib/sequel/plugins/composition.rb +13 -9
  167. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  168. data/lib/sequel/plugins/defaults_setter.rb +2 -2
  169. data/lib/sequel/plugins/dirty.rb +60 -22
  170. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  171. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  172. data/lib/sequel/plugins/finder.rb +2 -2
  173. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  174. data/lib/sequel/plugins/hook_class_methods.rb +17 -5
  175. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  176. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  177. data/lib/sequel/plugins/inverted_subsets.rb +2 -2
  178. data/lib/sequel/plugins/json_serializer.rb +21 -14
  179. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  180. data/lib/sequel/plugins/list.rb +22 -10
  181. data/lib/sequel/plugins/many_through_many.rb +1 -1
  182. data/lib/sequel/plugins/nested_attributes.rb +27 -5
  183. data/lib/sequel/plugins/pg_array_associations.rb +12 -9
  184. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
  185. data/lib/sequel/plugins/prepared_statements.rb +6 -12
  186. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  187. data/lib/sequel/plugins/rcte_tree.rb +20 -22
  188. data/lib/sequel/plugins/sharding.rb +13 -7
  189. data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
  190. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  191. data/lib/sequel/plugins/static_cache.rb +36 -17
  192. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  193. data/lib/sequel/plugins/string_stripper.rb +1 -1
  194. data/lib/sequel/plugins/subclasses.rb +2 -0
  195. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  196. data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
  197. data/lib/sequel/plugins/throw_failures.rb +110 -0
  198. data/lib/sequel/plugins/tree.rb +49 -31
  199. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  200. data/lib/sequel/plugins/validation_class_methods.rb +11 -5
  201. data/lib/sequel/plugins/validation_helpers.rb +2 -2
  202. data/lib/sequel/sql.rb +120 -30
  203. data/lib/sequel/timezones.rb +55 -14
  204. data/lib/sequel/version.rb +6 -1
  205. metadata +101 -361
  206. data/Rakefile +0 -151
  207. data/doc/release_notes/4.0.0.txt +0 -262
  208. data/doc/release_notes/4.1.0.txt +0 -85
  209. data/doc/release_notes/4.10.0.txt +0 -226
  210. data/doc/release_notes/4.11.0.txt +0 -147
  211. data/doc/release_notes/4.12.0.txt +0 -105
  212. data/doc/release_notes/4.13.0.txt +0 -169
  213. data/doc/release_notes/4.14.0.txt +0 -68
  214. data/doc/release_notes/4.15.0.txt +0 -56
  215. data/doc/release_notes/4.16.0.txt +0 -36
  216. data/doc/release_notes/4.17.0.txt +0 -38
  217. data/doc/release_notes/4.18.0.txt +0 -36
  218. data/doc/release_notes/4.19.0.txt +0 -45
  219. data/doc/release_notes/4.2.0.txt +0 -129
  220. data/doc/release_notes/4.20.0.txt +0 -79
  221. data/doc/release_notes/4.21.0.txt +0 -94
  222. data/doc/release_notes/4.22.0.txt +0 -72
  223. data/doc/release_notes/4.23.0.txt +0 -65
  224. data/doc/release_notes/4.24.0.txt +0 -99
  225. data/doc/release_notes/4.25.0.txt +0 -181
  226. data/doc/release_notes/4.26.0.txt +0 -44
  227. data/doc/release_notes/4.27.0.txt +0 -78
  228. data/doc/release_notes/4.28.0.txt +0 -57
  229. data/doc/release_notes/4.29.0.txt +0 -41
  230. data/doc/release_notes/4.3.0.txt +0 -40
  231. data/doc/release_notes/4.30.0.txt +0 -37
  232. data/doc/release_notes/4.31.0.txt +0 -57
  233. data/doc/release_notes/4.32.0.txt +0 -132
  234. data/doc/release_notes/4.33.0.txt +0 -88
  235. data/doc/release_notes/4.34.0.txt +0 -86
  236. data/doc/release_notes/4.35.0.txt +0 -130
  237. data/doc/release_notes/4.36.0.txt +0 -116
  238. data/doc/release_notes/4.37.0.txt +0 -50
  239. data/doc/release_notes/4.38.0.txt +0 -67
  240. data/doc/release_notes/4.39.0.txt +0 -127
  241. data/doc/release_notes/4.4.0.txt +0 -92
  242. data/doc/release_notes/4.40.0.txt +0 -179
  243. data/doc/release_notes/4.41.0.txt +0 -77
  244. data/doc/release_notes/4.42.0.txt +0 -221
  245. data/doc/release_notes/4.43.0.txt +0 -87
  246. data/doc/release_notes/4.44.0.txt +0 -125
  247. data/doc/release_notes/4.45.0.txt +0 -370
  248. data/doc/release_notes/4.46.0.txt +0 -404
  249. data/doc/release_notes/4.47.0.txt +0 -56
  250. data/doc/release_notes/4.48.0.txt +0 -293
  251. data/doc/release_notes/4.49.0.txt +0 -222
  252. data/doc/release_notes/4.5.0.txt +0 -34
  253. data/doc/release_notes/4.6.0.txt +0 -30
  254. data/doc/release_notes/4.7.0.txt +0 -103
  255. data/doc/release_notes/4.8.0.txt +0 -175
  256. data/doc/release_notes/4.9.0.txt +0 -190
  257. data/spec/adapter_spec.rb +0 -4
  258. data/spec/adapters/db2_spec.rb +0 -170
  259. data/spec/adapters/mssql_spec.rb +0 -804
  260. data/spec/adapters/mysql_spec.rb +0 -1041
  261. data/spec/adapters/oracle_spec.rb +0 -327
  262. data/spec/adapters/postgres_spec.rb +0 -4000
  263. data/spec/adapters/spec_helper.rb +0 -43
  264. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  265. data/spec/adapters/sqlite_spec.rb +0 -600
  266. data/spec/bin_spec.rb +0 -269
  267. data/spec/core/connection_pool_spec.rb +0 -1228
  268. data/spec/core/database_spec.rb +0 -2673
  269. data/spec/core/dataset_spec.rb +0 -5419
  270. data/spec/core/deprecated_spec.rb +0 -70
  271. data/spec/core/expression_filters_spec.rb +0 -1344
  272. data/spec/core/mock_adapter_spec.rb +0 -722
  273. data/spec/core/object_graph_spec.rb +0 -306
  274. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  275. data/spec/core/schema_generator_spec.rb +0 -214
  276. data/spec/core/schema_spec.rb +0 -1820
  277. data/spec/core/spec_helper.rb +0 -23
  278. data/spec/core/version_spec.rb +0 -7
  279. data/spec/core_extensions_spec.rb +0 -762
  280. data/spec/core_model_spec.rb +0 -2
  281. data/spec/core_spec.rb +0 -1
  282. data/spec/deprecation_helper.rb +0 -30
  283. data/spec/extensions/accessed_columns_spec.rb +0 -51
  284. data/spec/extensions/active_model_spec.rb +0 -99
  285. data/spec/extensions/after_initialize_spec.rb +0 -24
  286. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  287. data/spec/extensions/association_dependencies_spec.rb +0 -125
  288. data/spec/extensions/association_pks_spec.rb +0 -423
  289. data/spec/extensions/association_proxies_spec.rb +0 -100
  290. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  291. data/spec/extensions/auto_validations_spec.rb +0 -202
  292. data/spec/extensions/blacklist_security_spec.rb +0 -95
  293. data/spec/extensions/blank_spec.rb +0 -69
  294. data/spec/extensions/boolean_readers_spec.rb +0 -93
  295. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  296. data/spec/extensions/caching_spec.rb +0 -273
  297. data/spec/extensions/class_table_inheritance_spec.rb +0 -568
  298. data/spec/extensions/column_conflicts_spec.rb +0 -75
  299. data/spec/extensions/column_select_spec.rb +0 -129
  300. data/spec/extensions/columns_introspection_spec.rb +0 -90
  301. data/spec/extensions/columns_updated_spec.rb +0 -35
  302. data/spec/extensions/composition_spec.rb +0 -248
  303. data/spec/extensions/connection_expiration_spec.rb +0 -133
  304. data/spec/extensions/connection_validator_spec.rb +0 -127
  305. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  306. data/spec/extensions/constraint_validations_spec.rb +0 -395
  307. data/spec/extensions/core_refinements_spec.rb +0 -528
  308. data/spec/extensions/csv_serializer_spec.rb +0 -183
  309. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  310. data/spec/extensions/dataset_associations_spec.rb +0 -365
  311. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  312. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  313. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  314. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  315. data/spec/extensions/defaults_setter_spec.rb +0 -141
  316. data/spec/extensions/delay_add_association_spec.rb +0 -73
  317. data/spec/extensions/dirty_spec.rb +0 -189
  318. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  319. data/spec/extensions/eager_each_spec.rb +0 -62
  320. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  321. data/spec/extensions/error_splitter_spec.rb +0 -18
  322. data/spec/extensions/error_sql_spec.rb +0 -20
  323. data/spec/extensions/eval_inspect_spec.rb +0 -74
  324. data/spec/extensions/finder_spec.rb +0 -260
  325. data/spec/extensions/force_encoding_spec.rb +0 -126
  326. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  327. data/spec/extensions/graph_each_spec.rb +0 -113
  328. data/spec/extensions/hook_class_methods_spec.rb +0 -380
  329. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  330. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  331. data/spec/extensions/index_caching_spec.rb +0 -66
  332. data/spec/extensions/inflector_spec.rb +0 -183
  333. data/spec/extensions/input_transformer_spec.rb +0 -69
  334. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  335. data/spec/extensions/instance_filters_spec.rb +0 -79
  336. data/spec/extensions/instance_hooks_spec.rb +0 -246
  337. data/spec/extensions/integer64_spec.rb +0 -22
  338. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  339. data/spec/extensions/json_serializer_spec.rb +0 -336
  340. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  341. data/spec/extensions/list_spec.rb +0 -275
  342. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  343. data/spec/extensions/many_through_many_spec.rb +0 -2177
  344. data/spec/extensions/migration_spec.rb +0 -840
  345. data/spec/extensions/modification_detection_spec.rb +0 -93
  346. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  347. data/spec/extensions/named_timezones_spec.rb +0 -109
  348. data/spec/extensions/nested_attributes_spec.rb +0 -703
  349. data/spec/extensions/null_dataset_spec.rb +0 -85
  350. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  351. data/spec/extensions/pagination_spec.rb +0 -116
  352. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  353. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  354. data/spec/extensions/pg_array_spec.rb +0 -398
  355. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -165
  356. data/spec/extensions/pg_enum_spec.rb +0 -113
  357. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  358. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  359. data/spec/extensions/pg_hstore_spec.rb +0 -219
  360. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  361. data/spec/extensions/pg_inet_spec.rb +0 -72
  362. data/spec/extensions/pg_interval_spec.rb +0 -103
  363. data/spec/extensions/pg_json_ops_spec.rb +0 -289
  364. data/spec/extensions/pg_json_spec.rb +0 -262
  365. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  366. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  367. data/spec/extensions/pg_range_spec.rb +0 -487
  368. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  369. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  370. data/spec/extensions/pg_row_spec.rb +0 -363
  371. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  372. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  373. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  374. data/spec/extensions/prepared_statements_spec.rb +0 -182
  375. data/spec/extensions/pretty_table_spec.rb +0 -123
  376. data/spec/extensions/query_spec.rb +0 -94
  377. data/spec/extensions/rcte_tree_spec.rb +0 -381
  378. data/spec/extensions/round_timestamps_spec.rb +0 -39
  379. data/spec/extensions/s_spec.rb +0 -60
  380. data/spec/extensions/schema_caching_spec.rb +0 -64
  381. data/spec/extensions/schema_dumper_spec.rb +0 -868
  382. data/spec/extensions/select_remove_spec.rb +0 -38
  383. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  384. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  385. data/spec/extensions/serialization_spec.rb +0 -365
  386. data/spec/extensions/server_block_spec.rb +0 -97
  387. data/spec/extensions/server_logging_spec.rb +0 -45
  388. data/spec/extensions/sharding_spec.rb +0 -189
  389. data/spec/extensions/shared_caching_spec.rb +0 -151
  390. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  391. data/spec/extensions/singular_table_names_spec.rb +0 -22
  392. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  393. data/spec/extensions/spec_helper.rb +0 -61
  394. data/spec/extensions/split_array_nil_spec.rb +0 -24
  395. data/spec/extensions/split_values_spec.rb +0 -57
  396. data/spec/extensions/sql_comments_spec.rb +0 -33
  397. data/spec/extensions/sql_expr_spec.rb +0 -59
  398. data/spec/extensions/static_cache_spec.rb +0 -410
  399. data/spec/extensions/string_agg_spec.rb +0 -90
  400. data/spec/extensions/string_date_time_spec.rb +0 -95
  401. data/spec/extensions/string_stripper_spec.rb +0 -68
  402. data/spec/extensions/subclasses_spec.rb +0 -79
  403. data/spec/extensions/subset_conditions_spec.rb +0 -38
  404. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  405. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  406. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  407. data/spec/extensions/table_select_spec.rb +0 -83
  408. data/spec/extensions/tactical_eager_loading_spec.rb +0 -141
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/timestamps_spec.rb +0 -209
  411. data/spec/extensions/to_dot_spec.rb +0 -153
  412. data/spec/extensions/touch_spec.rb +0 -226
  413. data/spec/extensions/tree_spec.rb +0 -284
  414. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  415. data/spec/extensions/unlimited_update_spec.rb +0 -21
  416. data/spec/extensions/update_or_create_spec.rb +0 -83
  417. data/spec/extensions/update_primary_key_spec.rb +0 -105
  418. data/spec/extensions/update_refresh_spec.rb +0 -59
  419. data/spec/extensions/uuid_spec.rb +0 -101
  420. data/spec/extensions/validate_associated_spec.rb +0 -52
  421. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  422. data/spec/extensions/validation_contexts_spec.rb +0 -31
  423. data/spec/extensions/validation_helpers_spec.rb +0 -525
  424. data/spec/extensions/whitelist_security_spec.rb +0 -157
  425. data/spec/extensions/xml_serializer_spec.rb +0 -213
  426. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  427. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  428. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  429. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  431. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  432. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  433. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  434. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  436. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  437. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  438. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  439. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  440. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  441. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  443. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  444. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  446. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  447. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  448. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  449. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  450. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  451. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  452. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  453. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  457. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  458. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  459. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  460. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  461. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  462. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  466. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  468. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  469. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  471. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  473. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  474. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  475. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  476. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  478. data/spec/guards_helper.rb +0 -58
  479. data/spec/integration/associations_test.rb +0 -2513
  480. data/spec/integration/database_test.rb +0 -113
  481. data/spec/integration/dataset_test.rb +0 -1880
  482. data/spec/integration/eager_loader_test.rb +0 -687
  483. data/spec/integration/migrator_test.rb +0 -262
  484. data/spec/integration/model_test.rb +0 -203
  485. data/spec/integration/plugin_test.rb +0 -2302
  486. data/spec/integration/prepared_statement_test.rb +0 -398
  487. data/spec/integration/schema_test.rb +0 -869
  488. data/spec/integration/spec_helper.rb +0 -64
  489. data/spec/integration/timezone_test.rb +0 -86
  490. data/spec/integration/transaction_test.rb +0 -354
  491. data/spec/integration/type_test.rb +0 -127
  492. data/spec/model/association_reflection_spec.rb +0 -803
  493. data/spec/model/associations_spec.rb +0 -4538
  494. data/spec/model/base_spec.rb +0 -817
  495. data/spec/model/class_dataset_methods_spec.rb +0 -146
  496. data/spec/model/dataset_methods_spec.rb +0 -198
  497. data/spec/model/eager_loading_spec.rb +0 -2262
  498. data/spec/model/hooks_spec.rb +0 -370
  499. data/spec/model/inflector_spec.rb +0 -26
  500. data/spec/model/model_spec.rb +0 -953
  501. data/spec/model/plugins_spec.rb +0 -318
  502. data/spec/model/record_spec.rb +0 -2107
  503. data/spec/model/spec_helper.rb +0 -45
  504. data/spec/model/validations_spec.rb +0 -193
  505. data/spec/model_no_assoc_spec.rb +0 -1
  506. data/spec/model_spec.rb +0 -1
  507. data/spec/plugin_spec.rb +0 -1
  508. data/spec/sequel_coverage.rb +0 -15
  509. data/spec/sequel_warning.rb +0 -4
  510. data/spec/spec_config.rb +0 -12
@@ -1,43 +0,0 @@
1
- require 'logger'
2
- require_relative "../sequel_warning"
3
-
4
- if ENV['COVERAGE']
5
- require_relative "../sequel_coverage"
6
- SimpleCov.sequel_coverage(:group=>%r{lib/sequel/adapters})
7
- end
8
-
9
- $:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
10
- require_relative "../../lib/sequel"
11
-
12
- begin
13
- require_relative "../spec_config"
14
- rescue LoadError
15
- end
16
-
17
- Sequel::DB = nil
18
- Sequel.split_symbols = true if ENV['SEQUEL_SPLIT_SYMBOLS']
19
- Sequel::Database.extension :duplicate_column_handler if ENV['SEQUEL_DUPLICATE_COLUMN_HANDLER']
20
- Sequel::Database.extension :columns_introspection if ENV['SEQUEL_COLUMNS_INTROSPECTION']
21
- Sequel::Model.cache_associations = false if ENV['SEQUEL_NO_CACHE_ASSOCIATIONS']
22
- Sequel::Model.plugin :prepared_statements if ENV['SEQUEL_MODEL_PREPARED_STATEMENTS']
23
- Sequel::Model.cache_anonymous_models = false
24
-
25
- require_relative '../guards_helper'
26
-
27
- unless defined?(DB)
28
- env_var = "SEQUEL_#{SEQUEL_ADAPTER_TEST.to_s.upcase}_URL"
29
- env_var = ENV.has_key?(env_var) ? env_var : 'SEQUEL_INTEGRATION_URL'
30
- DB = Sequel.connect(ENV[env_var])
31
- end
32
-
33
- IDENTIFIER_MANGLING = !!ENV['SEQUEL_IDENTIFIER_MANGLING'] unless defined?(IDENTIFIER_MANGLING)
34
- DB.extension(:identifier_mangling) if IDENTIFIER_MANGLING
35
-
36
- DB.extension :pg_timestamptz if ENV['SEQUEL_PG_TIMESTAMPTZ']
37
- DB.extension :integer64 if ENV['SEQUEL_INTEGER64']
38
- DB.extension :index_caching if ENV['SEQUEL_INDEX_CACHING']
39
-
40
- if dch = ENV['SEQUEL_DUPLICATE_COLUMNS_HANDLER']
41
- DB.extension :duplicate_columns_handler
42
- DB.opts[:on_duplicate_columns] = dch.to_sym unless dch.empty?
43
- end
@@ -1,97 +0,0 @@
1
- SEQUEL_ADAPTER_TEST = :sqlanywhere
2
-
3
- require_relative 'spec_helper'
4
-
5
- describe "convert_smallint_to_bool" do
6
- before do
7
- @db = DB
8
- @ds = @db[:booltest]
9
- end
10
- after do
11
- @db.convert_smallint_to_bool = true
12
- end
13
-
14
- describe "Database#convert_smallint_to_bool" do
15
- before do
16
- @db.create_table!(:booltest){column :b, 'smallint'; column :i, 'integer'}
17
- end
18
- after do
19
- @db.drop_table(:booltest)
20
- end
21
-
22
- it "should consider smallint datatypes as boolean if set, but not larger smallints" do
23
- @db.schema(:booltest, :reload=>true).first.last[:type].must_equal :boolean
24
- @db.schema(:booltest, :reload=>true).first.last[:db_type].must_match /smallint/i
25
- @db.convert_smallint_to_bool = false
26
- @db.schema(:booltest, :reload=>true).first.last[:type].must_equal :integer
27
- @db.schema(:booltest, :reload=>true).first.last[:db_type].must_match /smallint/i
28
- end
29
-
30
- it "should return smallints as bools and integers as integers when set" do
31
- @ds.delete
32
- @ds.insert(:b=>true, :i=>10)
33
- @ds.all.must_equal [{:b=>true, :i=>10}]
34
- @ds.delete
35
- @ds.insert(:b=>false, :i=>0)
36
- @ds.all.must_equal [{:b=>false, :i=>0}]
37
- @ds.delete
38
- @ds.insert(:b=>true, :i=>1)
39
- @ds.all.must_equal [{:b=>true, :i=>1}]
40
- end
41
-
42
- it "should return all smallints as integers when unset" do
43
- @db.convert_smallint_to_bool = false
44
- @ds.delete
45
- @ds.insert(:b=>true, :i=>10)
46
- @ds.all.must_equal [{:b=>1, :i=>10}]
47
- @ds.delete
48
- @ds.insert(:b=>false, :i=>0)
49
- @ds.all.must_equal [{:b=>0, :i=>0}]
50
-
51
- @ds.delete
52
- @ds.insert(:b=>1, :i=>10)
53
- @ds.all.must_equal [{:b=>1, :i=>10}]
54
- @ds.delete
55
- @ds.insert(:b=>0, :i=>0)
56
- @ds.all.must_equal [{:b=>0, :i=>0}]
57
- end
58
- end
59
-
60
- describe "Dataset#convert_smallint_to_bool" do
61
- before do
62
- @db.create_table!(:booltest){column :b, 'smallint'; column :i, 'integer'}
63
- end
64
- after do
65
- @db.drop_table(:booltest)
66
- end
67
-
68
- it "should return smallints as bools and integers as integers when set" do
69
- @ds.delete
70
- @ds.insert(:b=>true, :i=>10)
71
- @ds.all.must_equal [{:b=>true, :i=>10}]
72
- @ds.delete
73
- @ds.insert(:b=>false, :i=>0)
74
- @ds.all.must_equal [{:b=>false, :i=>0}]
75
- @ds.delete
76
- @ds.insert(:b=>true, :i=>1)
77
- @ds.all.must_equal [{:b=>true, :i=>1}]
78
- end
79
-
80
- it "should support with_convert_smallint_to_bool for returning modified dataset with setting changed" do
81
- @ds = @ds.with_convert_smallint_to_bool(false)
82
- @ds.delete
83
- @ds.insert(:b=>true, :i=>10)
84
- @ds.all.must_equal [{:b=>1, :i=>10}]
85
- @ds.delete
86
- @ds.insert(:b=>false, :i=>0)
87
- @ds.all.must_equal [{:b=>0, :i=>0}]
88
-
89
- @ds.delete
90
- @ds.insert(:b=>1, :i=>10)
91
- @ds.all.must_equal [{:b=>1, :i=>10}]
92
- @ds.delete
93
- @ds.insert(:b=>0, :i=>0)
94
- @ds.all.must_equal [{:b=>0, :i=>0}]
95
- end
96
- end
97
- end
@@ -1,600 +0,0 @@
1
- SEQUEL_ADAPTER_TEST = :sqlite
2
-
3
- require_relative 'spec_helper'
4
-
5
- describe "An SQLite database" do
6
- before do
7
- @db = DB
8
- end
9
- after do
10
- @db.drop_table?(:fk)
11
- @db.use_timestamp_timezones = false
12
- Sequel.datetime_class = Time
13
- end
14
-
15
- it "should support casting to Date by using the date function" do
16
- @db.get(Sequel.cast('2012-10-20 11:12:13', Date)).must_equal '2012-10-20'
17
- end
18
-
19
- it "should support casting to Time or DateTime by using the datetime function" do
20
- @db.get(Sequel.cast('2012-10-20', Time)).must_equal '2012-10-20 00:00:00'
21
- @db.get(Sequel.cast('2012-10-20', DateTime)).must_equal '2012-10-20 00:00:00'
22
- end
23
-
24
- it "should provide the SQLite version as an integer" do
25
- @db.sqlite_version.must_be_kind_of(Integer)
26
- end
27
-
28
- it "should support a use_timestamp_timezones setting" do
29
- @db.use_timestamp_timezones = true
30
- @db.create_table!(:fk){Time :time}
31
- @db[:fk].insert(Time.now)
32
- @db[:fk].get(Sequel.cast(:time, String)).must_match(/[-+]\d\d\d\d\z/)
33
- @db.use_timestamp_timezones = false
34
- @db[:fk].delete
35
- @db[:fk].insert(Time.now)
36
- @db[:fk].get(Sequel.cast(:time, String)).wont_match(/[-+]\d\d\d\d\z/)
37
- end
38
-
39
- it "should provide a list of existing tables" do
40
- @db.drop_table?(:fk)
41
- @db.tables.must_be_kind_of(Array)
42
- @db.tables.wont_include(:fk)
43
- @db.create_table!(:fk){String :name}
44
- @db.tables.must_include(:fk)
45
- end
46
-
47
- cspecify "should support timestamps and datetimes and respect datetime_class", [:jdbc] do
48
- @db.create_table!(:fk){timestamp :t; datetime :d}
49
- @db.use_timestamp_timezones = true
50
- t1 = Time.at(1)
51
- @db[:fk].insert(:t => t1, :d => t1)
52
- @db[:fk].map(:t).must_equal [t1]
53
- @db[:fk].map(:d).must_equal [t1]
54
- Sequel.datetime_class = DateTime
55
- t2 = Sequel.string_to_datetime(t1.iso8601)
56
- @db[:fk].map(:t).must_equal [t2]
57
- @db[:fk].map(:d).must_equal [t2]
58
- end
59
-
60
- it "should support sequential primary keys" do
61
- @db.create_table!(:fk) {primary_key :id; text :name}
62
- @db[:fk].insert(:name => 'abc')
63
- @db[:fk].insert(:name => 'def')
64
- @db[:fk].insert(:name => 'ghi')
65
- @db[:fk].order(:name).all.must_equal [
66
- {:id => 1, :name => 'abc'},
67
- {:id => 2, :name => 'def'},
68
- {:id => 3, :name => 'ghi'}
69
- ]
70
- end
71
-
72
- it "should correctly parse the schema" do
73
- @db.create_table!(:fk) {timestamp :t}
74
- @db.schema(:fk, :reload=>true).must_equal [[:t, {:type=>:datetime, :allow_null=>true, :default=>nil, :ruby_default=>nil, :db_type=>"timestamp", :primary_key=>false}]]
75
- end
76
-
77
- it "should handle and return BigDecimal values for numeric columns" do
78
- DB.create_table!(:fk){numeric :d}
79
- d = DB[:fk]
80
- d.insert(:d=>BigDecimal.new('80.0'))
81
- d.insert(:d=>BigDecimal.new('NaN'))
82
- d.insert(:d=>BigDecimal.new('Infinity'))
83
- d.insert(:d=>BigDecimal.new('-Infinity'))
84
- ds = d.all
85
- ds.shift.must_equal(:d=>BigDecimal.new('80.0'))
86
- ds.map{|x| x[:d].to_s}.must_equal %w'NaN Infinity -Infinity'
87
- DB
88
- end
89
- end
90
-
91
- describe "SQLite temporary views" do
92
- before do
93
- @db = DB
94
- @db.drop_view(:items) rescue nil
95
- @db.create_table!(:items){Integer :number}
96
- @db[:items].insert(10)
97
- @db[:items].insert(20)
98
- end
99
- after do
100
- @db.drop_table?(:items)
101
- end
102
-
103
- it "should be supported" do
104
- @db.create_view(:items_view, @db[:items].where(:number=>10), :temp=>true)
105
- @db[:items_view].map(:number).must_equal [10]
106
- @db.disconnect
107
- lambda{@db[:items_view].map(:number)}.must_raise(Sequel::DatabaseError)
108
- end
109
- end
110
-
111
- describe "SQLite VALUES support" do
112
- before do
113
- @db = DB
114
- end
115
-
116
- it "should create a dataset using the VALUES clause via #values" do
117
- @db.values([[1, 2], [3, 4]]).map([:column1, :column2]).must_equal [[1, 2], [3, 4]]
118
- end
119
-
120
- it "should support VALUES with unions" do
121
- @db.values([[1]]).union(@db.values([[3]])).map(&:values).map(&:first).must_equal [1, 3]
122
- end
123
-
124
- it "should support VALUES in CTEs" do
125
- @db[:a].cross_join(:b).with(:a, @db.values([[1, 2]]), :args=>[:c1, :c2]).with(:b, @db.values([[3, 4]]), :args=>[:c3, :c4]).map([:c1, :c2, :c3, :c4]).must_equal [[1, 2, 3, 4]]
126
- end
127
- end if DB.sqlite_version >= 30803
128
-
129
- describe "SQLite type conversion" do
130
- before do
131
- @db = DB
132
- @integer_booleans = @db.integer_booleans
133
- @db.integer_booleans = true
134
- @ds = @db[:items]
135
- @db.drop_table?(:items)
136
- end
137
- after do
138
- @db.integer_booleans = @integer_booleans
139
- Sequel.datetime_class = Time
140
- @db.drop_table?(:items)
141
- end
142
-
143
- it "should handle integers in boolean columns" do
144
- @db.create_table(:items){TrueClass :a}
145
- @db[:items].insert(false)
146
- @db[:items].select_map(:a).must_equal [false]
147
- @db[:items].select_map(Sequel.expr(:a)+:a).must_equal [0]
148
- @db[:items].update(:a=>true)
149
- @db[:items].select_map(:a).must_equal [true]
150
- @db[:items].select_map(Sequel.expr(:a)+:a).must_equal [2]
151
- end
152
-
153
- it "should handle integers/floats/strings/decimals in numeric/decimal columns" do
154
- @db.create_table(:items){Numeric :a}
155
- @db[:items].insert(100)
156
- @db[:items].select_map(:a).must_equal [BigDecimal.new('100')]
157
- @db[:items].get(:a).must_be_kind_of(BigDecimal)
158
-
159
- @db[:items].update(:a=>100.1)
160
- @db[:items].select_map(:a).must_equal [BigDecimal.new('100.1')]
161
- @db[:items].get(:a).must_be_kind_of(BigDecimal)
162
-
163
- @db[:items].update(:a=>'100.1')
164
- @db[:items].select_map(:a).must_equal [BigDecimal.new('100.1')]
165
- @db[:items].get(:a).must_be_kind_of(BigDecimal)
166
-
167
- @db[:items].update(:a=>BigDecimal.new('100.1'))
168
- @db[:items].select_map(:a).must_equal [BigDecimal.new('100.1')]
169
- @db[:items].get(:a).must_be_kind_of(BigDecimal)
170
- end
171
-
172
- it "should handle integer/float date columns as julian date" do
173
- @db.create_table(:items){Date :a}
174
- i = 2455979
175
- @db[:items].insert(i)
176
- @db[:items].first.must_equal(:a=>Date.jd(i))
177
- @db[:items].update(:a=>2455979.1)
178
- @db[:items].first.must_equal(:a=>Date.jd(i))
179
- end
180
-
181
- it "should handle integer/float time columns as seconds" do
182
- @db.create_table(:items){Time :a, :only_time=>true}
183
- @db[:items].insert(3661)
184
- @db[:items].first.must_equal(:a=>Sequel::SQLTime.create(1, 1, 1))
185
- @db[:items].update(:a=>3661.000001)
186
- @db[:items].first.must_equal(:a=>Sequel::SQLTime.create(1, 1, 1, 1))
187
- end
188
-
189
- it "should handle integer datetime columns as unix timestamp" do
190
- @db.create_table(:items){DateTime :a}
191
- i = 1329860756
192
- @db[:items].insert(i)
193
- @db[:items].first.must_equal(:a=>Time.at(i))
194
- Sequel.datetime_class = DateTime
195
- @db[:items].first.must_equal(:a=>DateTime.strptime(i.to_s, '%s'))
196
- end
197
-
198
- it "should handle float datetime columns as julian date" do
199
- @db.create_table(:items){DateTime :a}
200
- i = 2455979.5
201
- @db[:items].insert(i)
202
- @db[:items].first.must_equal(:a=>Time.at(1329825600))
203
- Sequel.datetime_class = DateTime
204
- @db[:items].first.must_equal(:a=>DateTime.jd(2455979.5))
205
- end
206
-
207
- it "should handle integer/float blob columns" do
208
- @db.create_table(:items){File :a}
209
- @db[:items].insert(1)
210
- @db[:items].first.must_equal(:a=>Sequel::SQL::Blob.new('1'))
211
- @db[:items].update(:a=>'1.1')
212
- @db[:items].first.must_equal(:a=>Sequel::SQL::Blob.new(1.1.to_s))
213
- end
214
- end if DB.adapter_scheme == :sqlite
215
-
216
- describe "An SQLite dataset" do
217
- before do
218
- @d = DB.dataset
219
- end
220
-
221
- it "should raise errors if given a regexp pattern match" do
222
- proc{@d.literal(Sequel.expr(:x).like(/a/))}.must_raise(Sequel::InvalidOperation)
223
- proc{@d.literal(~Sequel.expr(:x).like(/a/))}.must_raise(Sequel::InvalidOperation)
224
- proc{@d.literal(Sequel.expr(:x).like(/a/i))}.must_raise(Sequel::InvalidOperation)
225
- proc{@d.literal(~Sequel.expr(:x).like(/a/i))}.must_raise(Sequel::InvalidOperation)
226
- end
227
- end
228
-
229
- describe "SQLite::Dataset#delete" do
230
- before do
231
- DB.create_table! :items do
232
- primary_key :id
233
- String :name
234
- Float :value
235
- end
236
- @d = DB[:items]
237
- @d.delete # remove all records
238
- @d.insert(:name => 'abc', :value => 1.23)
239
- @d.insert(:name => 'def', :value => 4.56)
240
- @d.insert(:name => 'ghi', :value => 7.89)
241
- end
242
- after do
243
- DB.drop_table?(:items)
244
- end
245
-
246
- it "should return the number of records affected when filtered" do
247
- @d.count.must_equal 3
248
- @d.filter{value < 3}.delete.must_equal 1
249
- @d.count.must_equal 2
250
-
251
- @d.filter{value < 3}.delete.must_equal 0
252
- @d.count.must_equal 2
253
- end
254
-
255
- it "should return the number of records affected when unfiltered" do
256
- @d.count.must_equal 3
257
- @d.delete.must_equal 3
258
- @d.count.must_equal 0
259
-
260
- @d.delete.must_equal 0
261
- end
262
- end
263
-
264
- describe "SQLite::Dataset#update" do
265
- before do
266
- DB.create_table! :items do
267
- primary_key :id
268
- String :name
269
- Float :value
270
- end
271
- @d = DB[:items]
272
- @d.delete # remove all records
273
- @d.insert(:name => 'abc', :value => 1.23)
274
- @d.insert(:name => 'def', :value => 4.56)
275
- @d.insert(:name => 'ghi', :value => 7.89)
276
- end
277
-
278
- it "should return the number of records affected" do
279
- @d.filter(:name => 'abc').update(:value => 2).must_equal 1
280
-
281
- @d.update(:value => 10).must_equal 3
282
-
283
- @d.filter(:name => 'xxx').update(:value => 23).must_equal 0
284
- end
285
- end
286
-
287
- describe "SQLite::Dataset#insert_conflict" do
288
- before(:all) do
289
- DB.create_table! :ic_test do
290
- primary_key :id
291
- String :name
292
- end
293
- end
294
-
295
- after(:each) do
296
- DB[:ic_test].delete
297
- end
298
-
299
- after(:all) do
300
- DB.drop_table?(:ic_test)
301
- end
302
-
303
- it "Dataset#insert_ignore and insert_constraint should ignore uniqueness violations" do
304
- DB[:ic_test].insert(:id => 1, :name => "one")
305
- proc {DB[:ic_test].insert(:id => 1, :name => "one")}.must_raise Sequel::ConstraintViolation
306
-
307
- DB[:ic_test].insert_ignore.insert(:id => 1, :name => "one")
308
- DB[:ic_test].all.must_equal([{:id => 1, :name => "one"}])
309
-
310
- DB[:ic_test].insert_conflict(:ignore).insert(:id => 1, :name => "one")
311
- DB[:ic_test].all.must_equal([{:id => 1, :name => "one"}])
312
- end
313
-
314
- it "Dataset#insert_constraint should handle replacement" do
315
- DB[:ic_test].insert(:id => 1, :name => "one")
316
-
317
- DB[:ic_test].insert_conflict(:replace).insert(:id => 1, :name => "two")
318
- DB[:ic_test].all.must_equal([{:id => 1, :name => "two"}])
319
- end
320
- end
321
-
322
- describe "SQLite dataset" do
323
- before do
324
- DB.create_table! :test do
325
- primary_key :id
326
- String :name
327
- Float :value
328
- end
329
- DB.create_table! :items do
330
- primary_key :id
331
- String :name
332
- Float :value
333
- end
334
- @d = DB[:items]
335
- @d.insert(:name => 'abc', :value => 1.23)
336
- @d.insert(:name => 'def', :value => 4.56)
337
- @d.insert(:name => 'ghi', :value => 7.89)
338
- end
339
- after do
340
- DB.drop_table?(:test, :items)
341
- end
342
-
343
- it "should be able to insert from a subquery" do
344
- DB[:test].insert(@d)
345
- DB[:test].count.must_equal 3
346
- DB[:test].select(:name, :value).order(:value).to_a.must_equal \
347
- @d.select(:name, :value).order(:value).to_a
348
- end
349
-
350
- it "should support #explain" do
351
- DB[:test].explain.must_be_kind_of(String)
352
- end
353
-
354
- it "should have #explain work when identifier_output_method is modified" do
355
- DB[:test].with_identifier_output_method(:upcase).explain.must_be_kind_of(String)
356
- end if IDENTIFIER_MANGLING
357
- end
358
-
359
- describe "A SQLite database" do
360
- before do
361
- @db = DB
362
- @db.create_table! :test2 do
363
- text :name
364
- integer :value
365
- end
366
- end
367
- after do
368
- @db.drop_table?(:test, :test2, :test3, :test3_backup0, :test3_backup1, :test3_backup2)
369
- end
370
-
371
- it "should support add_column operations" do
372
- @db.add_column :test2, :xyz, :text
373
-
374
- @db[:test2].columns.must_equal [:name, :value, :xyz]
375
- @db[:test2].insert(:name => 'mmm', :value => 111, :xyz=>'000')
376
- @db[:test2].first.must_equal(:name => 'mmm', :value => 111, :xyz=>'000')
377
- end
378
-
379
- it "should support drop_column operations" do
380
- @db.drop_column :test2, :value
381
- @db[:test2].columns.must_equal [:name]
382
- @db[:test2].insert(:name => 'mmm')
383
- @db[:test2].first.must_equal(:name => 'mmm')
384
- end
385
-
386
- it "should support drop_column operations in a transaction" do
387
- @db.transaction{@db.drop_column :test2, :value}
388
- @db[:test2].columns.must_equal [:name]
389
- @db[:test2].insert(:name => 'mmm')
390
- @db[:test2].first.must_equal(:name => 'mmm')
391
- end
392
-
393
- it "should keep a composite primary key when dropping columns" do
394
- @db.create_table!(:test2){Integer :a; Integer :b; Integer :c; primary_key [:a, :b]}
395
- @db.drop_column :test2, :c
396
- @db[:test2].columns.must_equal [:a, :b]
397
- @db[:test2].insert(:a=>1, :b=>2)
398
- @db[:test2].insert(:a=>2, :b=>3)
399
- proc{@db[:test2].insert(:a=>2, :b=>3)}.must_raise(Sequel::UniqueConstraintViolation, Sequel::ConstraintViolation, Sequel::DatabaseError)
400
- end
401
-
402
- it "should keep column attributes when dropping a column" do
403
- @db.create_table! :test3 do
404
- primary_key :id
405
- text :name
406
- integer :value
407
- end
408
-
409
- # This lame set of additions and deletions are to test that the primary keys
410
- # don't get messed up when we recreate the database.
411
- @db[:test3].insert( :name => "foo", :value => 1)
412
- @db[:test3].insert( :name => "foo", :value => 2)
413
- @db[:test3].insert( :name => "foo", :value => 3)
414
- @db[:test3].filter(:id => 2).delete
415
-
416
- @db.drop_column :test3, :value
417
-
418
- @db['PRAGMA table_info(?)', :test3][:id][:pk].to_i.must_equal 1
419
- @db[:test3].select(:id).all.must_equal [{:id => 1}, {:id => 3}]
420
- end
421
-
422
- it "should keep foreign keys when dropping a column" do
423
- @db.create_table! :test do
424
- primary_key :id
425
- String :name
426
- Integer :value
427
- end
428
- @db.create_table! :test3 do
429
- String :name
430
- Integer :value
431
- foreign_key :test_id, :test, :on_delete => :set_null, :on_update => :cascade
432
- end
433
-
434
- @db[:test3].insert(:name => "abc", :test_id => @db[:test].insert(:name => "foo", :value => 3))
435
- @db[:test3].insert(:name => "def", :test_id => @db[:test].insert(:name => "bar", :value => 4))
436
-
437
- @db.drop_column :test3, :value
438
-
439
- @db[:test].filter(:name => 'bar').delete
440
- @db[:test3][:name => 'def'][:test_id].must_be_nil
441
-
442
- @db[:test].filter(:name => 'foo').update(:id=>100)
443
- @db[:test3][:name => 'abc'][:test_id].must_equal 100
444
- end
445
-
446
- it "should support rename_column operations" do
447
- @db[:test2].delete
448
- @db.add_column :test2, :xyz, :text
449
- @db[:test2].insert(:name => 'mmm', :value => 111, :xyz => 'qqqq')
450
-
451
- @db[:test2].columns.must_equal [:name, :value, :xyz]
452
- @db.rename_column :test2, :xyz, :zyx, :type => :text
453
- @db[:test2].columns.must_equal [:name, :value, :zyx]
454
- @db[:test2].first[:zyx].must_equal 'qqqq'
455
- @db[:test2].count.must_equal 1
456
- end
457
-
458
- it "should preserve defaults when dropping or renaming columns" do
459
- @db.create_table! :test3 do
460
- String :s, :default=>'a'
461
- Integer :i
462
- end
463
-
464
- @db[:test3].insert
465
- @db[:test3].first[:s].must_equal 'a'
466
- @db[:test3].delete
467
- @db.drop_column :test3, :i
468
- @db[:test3].insert
469
- @db[:test3].first[:s].must_equal 'a'
470
- @db[:test3].delete
471
- @db.rename_column :test3, :s, :t
472
- @db[:test3].insert
473
- @db[:test3].first[:t].must_equal 'a'
474
- @db[:test3].delete
475
- end
476
-
477
-
478
- it "should preserve autoincrement after table modification" do
479
- @db.create_table!(:test2) do
480
- primary_key :id
481
- Integer :val, :null => false
482
- end
483
- @db.rename_column(:test2, :val, :value)
484
-
485
- t = @db[:test2]
486
- id1 = t.insert(:value=>1)
487
- t.delete
488
- id2 = t.insert(:value=>1)
489
- id2.must_be :>, id1
490
- end
491
-
492
- it "should handle quoted tables when dropping or renaming columns" do
493
- table_name = "T T"
494
- @db.drop_table?(table_name)
495
- @db.create_table! table_name do
496
- Integer :"s s"
497
- Integer :"i i"
498
- end
499
-
500
- @db.from(table_name).insert(:"s s"=>1, :"i i"=>2)
501
- @db.from(table_name).all.must_equal [{:"s s"=>1, :"i i"=>2}]
502
- @db.drop_column table_name, :"i i"
503
- @db.from(table_name).all.must_equal [{:"s s"=>1}]
504
- @db.rename_column table_name, :"s s", :"t t"
505
- @db.from(table_name).all.must_equal [{:"t t"=>1}]
506
- @db.drop_table?(table_name)
507
- end
508
-
509
- it "should choose a temporary table name that isn't already used when dropping or renaming columns" do
510
- @db.tables.each{|t| @db.drop_table(t) if t.to_s =~ /test3/}
511
- @db.create_table :test3 do
512
- Integer :h
513
- Integer :i
514
- end
515
- @db.create_table :test3_backup0 do
516
- Integer :j
517
- end
518
- @db.create_table :test3_backup1 do
519
- Integer :k
520
- end
521
-
522
- @db[:test3].columns.must_equal [:h, :i]
523
- @db[:test3_backup0].columns.must_equal [:j]
524
- @db[:test3_backup1].columns.must_equal [:k]
525
- @db.drop_column(:test3, :i)
526
- @db[:test3].columns.must_equal [:h]
527
- @db[:test3_backup0].columns.must_equal [:j]
528
- @db[:test3_backup1].columns.must_equal [:k]
529
-
530
- @db.create_table :test3_backup2 do
531
- Integer :l
532
- end
533
-
534
- @db.rename_column(:test3, :h, :i)
535
- @db[:test3].columns.must_equal [:i]
536
- @db[:test3_backup0].columns.must_equal [:j]
537
- @db[:test3_backup1].columns.must_equal [:k]
538
- @db[:test3_backup2].columns.must_equal [:l]
539
- end
540
-
541
- it "should support add_index" do
542
- @db.add_index :test2, :value, :unique => true
543
- @db.add_index :test2, [:name, :value]
544
- end
545
-
546
- it "should support drop_index" do
547
- @db.add_index :test2, :value, :unique => true
548
- @db.drop_index :test2, :value
549
- end
550
-
551
- it "should keep applicable indexes when emulating schema methods" do
552
- @db.create_table!(:test3){Integer :a; Integer :b}
553
- @db.add_index :test3, :a
554
- @db.add_index :test3, :b
555
- @db.add_index :test3, [:b, :a]
556
- @db.drop_column :test3, :b
557
- @db.indexes(:test3)[:test3_a_index].must_equal(:unique=>false, :columns=>[:a])
558
- end
559
-
560
- it "should have support for various #transaction modes" do
561
- @db.transaction(:mode => :immediate){}
562
- @db.transaction(:mode => :exclusive){}
563
- @db.transaction(:mode => :deferred){}
564
- @db.transaction{}
565
-
566
- @db.transaction_mode.must_be_nil
567
- @db.transaction_mode = :immediate
568
- @db.transaction_mode.must_equal :immediate
569
- @db.transaction{}
570
- @db.transaction(:mode => :exclusive){}
571
- proc {@db.transaction_mode = :invalid}.must_raise(Sequel::Error)
572
- @db.transaction_mode.must_equal :immediate
573
- proc {@db.transaction(:mode => :invalid) {}}.must_raise(Sequel::Error)
574
- end
575
-
576
- it "should keep unique constraints when copying tables" do
577
- @db.alter_table(:test2){add_unique_constraint :name}
578
- @db.alter_table(:test2){drop_column :value}
579
- @db[:test2].insert(:name=>'a')
580
- proc{@db[:test2].insert(:name=>'a')}.must_raise(Sequel::ConstraintViolation, Sequel::UniqueConstraintViolation)
581
- end
582
-
583
- it "should not ignore adding new constraints when adding not null constraints" do
584
- @db.alter_table :test2 do
585
- set_column_not_null :value
586
- add_constraint(:value_range1, :value => 3..5)
587
- add_constraint(:value_range2, :value => 0..9)
588
- end
589
-
590
- @db[:test2].insert(:value => 4)
591
- proc{@db[:test2].insert(:value => 1)}.must_raise(Sequel::ConstraintViolation)
592
- proc{@db[:test2].insert(:value => nil)}.must_raise(Sequel::ConstraintViolation)
593
- @db[:test2].select_order_map(:value).must_equal [4]
594
- end
595
-
596
- it "should show unique constraints in Database#indexes" do
597
- @db.alter_table(:test2){add_unique_constraint :name}
598
- @db.indexes(:test2).values.first[:columns].must_equal [:name]
599
- end if DB.sqlite_version >= 30808
600
- end