sequel 4.49.0 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +130 -0
  3. data/README.rdoc +195 -136
  4. data/Rakefile +26 -42
  5. data/bin/sequel +6 -9
  6. data/doc/advanced_associations.rdoc +91 -168
  7. data/doc/association_basics.rdoc +197 -274
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +66 -43
  10. data/doc/code_order.rdoc +1 -8
  11. data/doc/core_extensions.rdoc +81 -56
  12. data/doc/dataset_basics.rdoc +8 -17
  13. data/doc/dataset_filtering.rdoc +81 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +73 -30
  16. data/doc/migration.rdoc +19 -36
  17. data/doc/model_dataset_method_design.rdoc +14 -17
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +10 -10
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +52 -70
  22. data/doc/opening_databases.rdoc +39 -32
  23. data/doc/postgresql.rdoc +48 -38
  24. data/doc/prepared_statements.rdoc +27 -22
  25. data/doc/querying.rdoc +173 -150
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/release_notes/5.1.0.txt +31 -0
  29. data/doc/release_notes/5.2.0.txt +33 -0
  30. data/doc/release_notes/5.3.0.txt +121 -0
  31. data/doc/schema_modification.rdoc +78 -64
  32. data/doc/security.rdoc +97 -88
  33. data/doc/sharding.rdoc +43 -30
  34. data/doc/sql.rdoc +53 -65
  35. data/doc/testing.rdoc +4 -5
  36. data/doc/thread_safety.rdoc +2 -4
  37. data/doc/transactions.rdoc +18 -17
  38. data/doc/validations.rdoc +48 -45
  39. data/doc/virtual_rows.rdoc +87 -115
  40. data/lib/sequel/adapters/ado/access.rb +7 -13
  41. data/lib/sequel/adapters/ado/mssql.rb +2 -9
  42. data/lib/sequel/adapters/ado.rb +9 -25
  43. data/lib/sequel/adapters/amalgalite.rb +3 -18
  44. data/lib/sequel/adapters/ibmdb.rb +9 -45
  45. data/lib/sequel/adapters/jdbc/db2.rb +8 -37
  46. data/lib/sequel/adapters/jdbc/derby.rb +4 -50
  47. data/lib/sequel/adapters/jdbc/h2.rb +6 -26
  48. data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
  49. data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
  50. data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
  51. data/lib/sequel/adapters/jdbc/mysql.rb +11 -15
  52. data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
  53. data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
  54. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
  55. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
  56. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
  57. data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
  58. data/lib/sequel/adapters/jdbc.rb +18 -74
  59. data/lib/sequel/adapters/mock.rb +4 -30
  60. data/lib/sequel/adapters/mysql.rb +7 -44
  61. data/lib/sequel/adapters/mysql2.rb +5 -23
  62. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  63. data/lib/sequel/adapters/odbc/mssql.rb +4 -12
  64. data/lib/sequel/adapters/odbc/oracle.rb +1 -1
  65. data/lib/sequel/adapters/odbc.rb +0 -19
  66. data/lib/sequel/adapters/oracle.rb +8 -13
  67. data/lib/sequel/adapters/postgres.rb +28 -150
  68. data/lib/sequel/adapters/postgresql.rb +1 -1
  69. data/lib/sequel/adapters/shared/access.rb +11 -51
  70. data/lib/sequel/adapters/shared/db2.rb +3 -61
  71. data/lib/sequel/adapters/shared/mssql.rb +21 -157
  72. data/lib/sequel/adapters/shared/mysql.rb +61 -227
  73. data/lib/sequel/adapters/shared/oracle.rb +13 -41
  74. data/lib/sequel/adapters/shared/postgres.rb +58 -264
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
  76. data/lib/sequel/adapters/shared/sqlite.rb +22 -101
  77. data/lib/sequel/adapters/sqlanywhere.rb +4 -23
  78. data/lib/sequel/adapters/sqlite.rb +2 -19
  79. data/lib/sequel/adapters/tinytds.rb +5 -15
  80. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -4
  82. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
  83. data/lib/sequel/adapters/utils/replace.rb +0 -5
  84. data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
  85. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
  86. data/lib/sequel/ast_transformer.rb +3 -94
  87. data/lib/sequel/connection_pool/sharded_single.rb +1 -4
  88. data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
  89. data/lib/sequel/connection_pool/single.rb +0 -2
  90. data/lib/sequel/connection_pool/threaded.rb +94 -110
  91. data/lib/sequel/connection_pool.rb +38 -28
  92. data/lib/sequel/core.rb +42 -101
  93. data/lib/sequel/database/connecting.rb +23 -60
  94. data/lib/sequel/database/dataset.rb +6 -9
  95. data/lib/sequel/database/dataset_defaults.rb +4 -48
  96. data/lib/sequel/database/features.rb +5 -4
  97. data/lib/sequel/database/logging.rb +2 -9
  98. data/lib/sequel/database/misc.rb +36 -55
  99. data/lib/sequel/database/query.rb +8 -13
  100. data/lib/sequel/database/schema_generator.rb +93 -64
  101. data/lib/sequel/database/schema_methods.rb +61 -79
  102. data/lib/sequel/database/transactions.rb +4 -24
  103. data/lib/sequel/database.rb +12 -2
  104. data/lib/sequel/dataset/actions.rb +57 -107
  105. data/lib/sequel/dataset/dataset_module.rb +4 -16
  106. data/lib/sequel/dataset/features.rb +35 -30
  107. data/lib/sequel/dataset/graph.rb +40 -49
  108. data/lib/sequel/dataset/misc.rb +12 -37
  109. data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
  110. data/lib/sequel/dataset/prepared_statements.rb +23 -51
  111. data/lib/sequel/dataset/query.rb +91 -161
  112. data/lib/sequel/dataset/sql.rb +33 -225
  113. data/lib/sequel/dataset.rb +18 -10
  114. data/lib/sequel/deprecated.rb +18 -27
  115. data/lib/sequel/exceptions.rb +1 -17
  116. data/lib/sequel/extensions/_model_pg_row.rb +0 -7
  117. data/lib/sequel/extensions/_pretty_table.rb +1 -3
  118. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  119. data/lib/sequel/extensions/connection_expiration.rb +1 -1
  120. data/lib/sequel/extensions/connection_validator.rb +1 -1
  121. data/lib/sequel/extensions/constraint_validations.rb +11 -11
  122. data/lib/sequel/extensions/core_extensions.rb +39 -49
  123. data/lib/sequel/extensions/core_refinements.rb +39 -45
  124. data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
  125. data/lib/sequel/extensions/date_arithmetic.rb +7 -7
  126. data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
  127. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  128. data/lib/sequel/extensions/eval_inspect.rb +4 -11
  129. data/lib/sequel/extensions/freeze_datasets.rb +1 -69
  130. data/lib/sequel/extensions/from_block.rb +1 -35
  131. data/lib/sequel/extensions/graph_each.rb +2 -2
  132. data/lib/sequel/extensions/identifier_mangling.rb +9 -19
  133. data/lib/sequel/extensions/implicit_subquery.rb +2 -2
  134. data/lib/sequel/extensions/inflector.rb +4 -4
  135. data/lib/sequel/extensions/migration.rb +27 -43
  136. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
  137. data/lib/sequel/extensions/null_dataset.rb +2 -8
  138. data/lib/sequel/extensions/pagination.rb +1 -17
  139. data/lib/sequel/extensions/pg_array.rb +20 -189
  140. data/lib/sequel/extensions/pg_extended_date_support.rb +230 -0
  141. data/lib/sequel/extensions/pg_hstore.rb +11 -50
  142. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
  143. data/lib/sequel/extensions/pg_inet.rb +3 -16
  144. data/lib/sequel/extensions/pg_interval.rb +1 -20
  145. data/lib/sequel/extensions/pg_json.rb +7 -27
  146. data/lib/sequel/extensions/pg_loose_count.rb +1 -1
  147. data/lib/sequel/extensions/pg_range.rb +6 -121
  148. data/lib/sequel/extensions/pg_range_ops.rb +1 -3
  149. data/lib/sequel/extensions/pg_row.rb +5 -77
  150. data/lib/sequel/extensions/pg_row_ops.rb +2 -13
  151. data/lib/sequel/extensions/query.rb +3 -4
  152. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  153. data/lib/sequel/extensions/schema_dumper.rb +13 -13
  154. data/lib/sequel/extensions/select_remove.rb +3 -3
  155. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  156. data/lib/sequel/extensions/sql_comments.rb +2 -2
  157. data/lib/sequel/extensions/string_agg.rb +11 -8
  158. data/lib/sequel/extensions/symbol_aref.rb +6 -20
  159. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  160. data/lib/sequel/model/associations.rb +129 -131
  161. data/lib/sequel/model/base.rb +133 -731
  162. data/lib/sequel/model/default_inflections.rb +1 -1
  163. data/lib/sequel/model/errors.rb +0 -3
  164. data/lib/sequel/model/exceptions.rb +2 -6
  165. data/lib/sequel/model/inflections.rb +1 -26
  166. data/lib/sequel/model/plugins.rb +1 -0
  167. data/lib/sequel/model.rb +27 -62
  168. data/lib/sequel/plugins/active_model.rb +2 -5
  169. data/lib/sequel/plugins/association_dependencies.rb +15 -15
  170. data/lib/sequel/plugins/association_pks.rb +14 -28
  171. data/lib/sequel/plugins/association_proxies.rb +6 -7
  172. data/lib/sequel/plugins/auto_validations.rb +4 -4
  173. data/lib/sequel/plugins/before_after_save.rb +0 -43
  174. data/lib/sequel/plugins/blacklist_security.rb +9 -8
  175. data/lib/sequel/plugins/boolean_readers.rb +3 -3
  176. data/lib/sequel/plugins/boolean_subsets.rb +2 -2
  177. data/lib/sequel/plugins/caching.rb +5 -5
  178. data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
  179. data/lib/sequel/plugins/column_conflicts.rb +2 -2
  180. data/lib/sequel/plugins/column_select.rb +2 -2
  181. data/lib/sequel/plugins/composition.rb +15 -24
  182. data/lib/sequel/plugins/constraint_validations.rb +4 -3
  183. data/lib/sequel/plugins/csv_serializer.rb +13 -20
  184. data/lib/sequel/plugins/dataset_associations.rb +2 -2
  185. data/lib/sequel/plugins/def_dataset_method.rb +5 -5
  186. data/lib/sequel/plugins/defaults_setter.rb +1 -1
  187. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  188. data/lib/sequel/plugins/finder.rb +16 -10
  189. data/lib/sequel/plugins/force_encoding.rb +1 -7
  190. data/lib/sequel/plugins/hook_class_methods.rb +4 -106
  191. data/lib/sequel/plugins/input_transformer.rb +10 -11
  192. data/lib/sequel/plugins/insert_returning_select.rb +1 -9
  193. data/lib/sequel/plugins/instance_filters.rb +5 -5
  194. data/lib/sequel/plugins/instance_hooks.rb +7 -52
  195. data/lib/sequel/plugins/inverted_subsets.rb +3 -1
  196. data/lib/sequel/plugins/json_serializer.rb +19 -19
  197. data/lib/sequel/plugins/lazy_attributes.rb +1 -10
  198. data/lib/sequel/plugins/list.rb +6 -6
  199. data/lib/sequel/plugins/many_through_many.rb +11 -8
  200. data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
  201. data/lib/sequel/plugins/nested_attributes.rb +18 -31
  202. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  203. data/lib/sequel/plugins/pg_array_associations.rb +8 -2
  204. data/lib/sequel/plugins/pg_row.rb +2 -11
  205. data/lib/sequel/plugins/prepared_statements.rb +13 -66
  206. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
  207. data/lib/sequel/plugins/rcte_tree.rb +7 -7
  208. data/lib/sequel/plugins/serialization.rb +15 -33
  209. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  210. data/lib/sequel/plugins/sharding.rb +2 -8
  211. data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
  212. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  213. data/lib/sequel/plugins/static_cache.rb +8 -9
  214. data/lib/sequel/plugins/string_stripper.rb +3 -3
  215. data/lib/sequel/plugins/subclasses.rb +1 -1
  216. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  217. data/lib/sequel/plugins/table_select.rb +2 -2
  218. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  219. data/lib/sequel/plugins/timestamps.rb +6 -7
  220. data/lib/sequel/plugins/touch.rb +4 -8
  221. data/lib/sequel/plugins/tree.rb +3 -3
  222. data/lib/sequel/plugins/typecast_on_load.rb +2 -2
  223. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  224. data/lib/sequel/plugins/update_or_create.rb +3 -3
  225. data/lib/sequel/plugins/update_refresh.rb +3 -3
  226. data/lib/sequel/plugins/uuid.rb +7 -11
  227. data/lib/sequel/plugins/validation_class_methods.rb +10 -9
  228. data/lib/sequel/plugins/validation_contexts.rb +4 -4
  229. data/lib/sequel/plugins/validation_helpers.rb +26 -25
  230. data/lib/sequel/plugins/whitelist_security.rb +13 -9
  231. data/lib/sequel/plugins/xml_serializer.rb +24 -25
  232. data/lib/sequel/sql.rb +145 -276
  233. data/lib/sequel/timezones.rb +8 -23
  234. data/lib/sequel/version.rb +2 -2
  235. data/lib/sequel.rb +1 -1
  236. data/spec/adapter_spec.rb +1 -1
  237. data/spec/adapters/db2_spec.rb +2 -103
  238. data/spec/adapters/mssql_spec.rb +89 -68
  239. data/spec/adapters/mysql_spec.rb +111 -478
  240. data/spec/adapters/oracle_spec.rb +1 -9
  241. data/spec/adapters/postgres_spec.rb +459 -664
  242. data/spec/adapters/spec_helper.rb +12 -31
  243. data/spec/adapters/sqlanywhere_spec.rb +2 -77
  244. data/spec/adapters/sqlite_spec.rb +8 -146
  245. data/spec/bin_spec.rb +11 -16
  246. data/spec/core/connection_pool_spec.rb +173 -74
  247. data/spec/core/database_spec.rb +96 -244
  248. data/spec/core/dataset_spec.rb +99 -414
  249. data/spec/core/deprecated_spec.rb +3 -3
  250. data/spec/core/expression_filters_spec.rb +37 -144
  251. data/spec/core/mock_adapter_spec.rb +241 -4
  252. data/spec/core/object_graph_spec.rb +11 -60
  253. data/spec/core/placeholder_literalizer_spec.rb +1 -14
  254. data/spec/core/schema_generator_spec.rb +51 -40
  255. data/spec/core/schema_spec.rb +88 -77
  256. data/spec/core/spec_helper.rb +6 -24
  257. data/spec/core/version_spec.rb +1 -1
  258. data/spec/core_extensions_spec.rb +7 -83
  259. data/spec/core_model_spec.rb +2 -2
  260. data/spec/deprecation_helper.rb +2 -14
  261. data/spec/extensions/accessed_columns_spec.rb +1 -1
  262. data/spec/extensions/active_model_spec.rb +3 -3
  263. data/spec/extensions/after_initialize_spec.rb +1 -1
  264. data/spec/extensions/arbitrary_servers_spec.rb +2 -2
  265. data/spec/extensions/association_dependencies_spec.rb +1 -1
  266. data/spec/extensions/association_pks_spec.rb +30 -92
  267. data/spec/extensions/association_proxies_spec.rb +1 -1
  268. data/spec/extensions/auto_literal_strings_spec.rb +1 -12
  269. data/spec/extensions/auto_validations_spec.rb +1 -1
  270. data/spec/extensions/blacklist_security_spec.rb +1 -1
  271. data/spec/extensions/blank_spec.rb +1 -1
  272. data/spec/extensions/boolean_readers_spec.rb +1 -1
  273. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  274. data/spec/extensions/caching_spec.rb +1 -1
  275. data/spec/extensions/class_table_inheritance_spec.rb +53 -1118
  276. data/spec/extensions/column_conflicts_spec.rb +1 -1
  277. data/spec/extensions/column_select_spec.rb +4 -4
  278. data/spec/extensions/columns_introspection_spec.rb +1 -1
  279. data/spec/extensions/columns_updated_spec.rb +1 -1
  280. data/spec/extensions/composition_spec.rb +8 -30
  281. data/spec/extensions/connection_expiration_spec.rb +3 -3
  282. data/spec/extensions/connection_validator_spec.rb +3 -3
  283. data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
  284. data/spec/extensions/constraint_validations_spec.rb +1 -1
  285. data/spec/extensions/core_refinements_spec.rb +1 -3
  286. data/spec/extensions/csv_serializer_spec.rb +4 -9
  287. data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
  288. data/spec/extensions/dataset_associations_spec.rb +2 -1
  289. data/spec/extensions/dataset_source_alias_spec.rb +1 -1
  290. data/spec/extensions/date_arithmetic_spec.rb +3 -3
  291. data/spec/extensions/def_dataset_method_spec.rb +1 -1
  292. data/spec/extensions/defaults_setter_spec.rb +2 -2
  293. data/spec/extensions/delay_add_association_spec.rb +8 -9
  294. data/spec/extensions/dirty_spec.rb +1 -1
  295. data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
  296. data/spec/extensions/eager_each_spec.rb +2 -2
  297. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  298. data/spec/extensions/error_splitter_spec.rb +1 -1
  299. data/spec/extensions/error_sql_spec.rb +1 -1
  300. data/spec/extensions/eval_inspect_spec.rb +1 -1
  301. data/spec/extensions/finder_spec.rb +1 -1
  302. data/spec/extensions/force_encoding_spec.rb +2 -5
  303. data/spec/extensions/freeze_datasets_spec.rb +1 -1
  304. data/spec/extensions/graph_each_spec.rb +5 -5
  305. data/spec/extensions/hook_class_methods_spec.rb +1 -194
  306. data/spec/extensions/identifier_mangling_spec.rb +17 -170
  307. data/spec/extensions/implicit_subquery_spec.rb +1 -5
  308. data/spec/extensions/inflector_spec.rb +1 -1
  309. data/spec/extensions/input_transformer_spec.rb +7 -2
  310. data/spec/extensions/insert_returning_select_spec.rb +1 -1
  311. data/spec/extensions/instance_filters_spec.rb +1 -1
  312. data/spec/extensions/instance_hooks_spec.rb +1 -95
  313. data/spec/extensions/inverted_subsets_spec.rb +1 -1
  314. data/spec/extensions/json_serializer_spec.rb +1 -1
  315. data/spec/extensions/lazy_attributes_spec.rb +1 -7
  316. data/spec/extensions/list_spec.rb +5 -6
  317. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  318. data/spec/extensions/many_through_many_spec.rb +25 -33
  319. data/spec/extensions/migration_spec.rb +12 -2
  320. data/spec/extensions/modification_detection_spec.rb +1 -1
  321. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  322. data/spec/extensions/named_timezones_spec.rb +3 -3
  323. data/spec/extensions/nested_attributes_spec.rb +1 -29
  324. data/spec/extensions/null_dataset_spec.rb +1 -11
  325. data/spec/extensions/optimistic_locking_spec.rb +2 -2
  326. data/spec/extensions/pagination_spec.rb +1 -1
  327. data/spec/extensions/pg_array_associations_spec.rb +22 -26
  328. data/spec/extensions/pg_array_ops_spec.rb +1 -1
  329. data/spec/extensions/pg_array_spec.rb +3 -48
  330. data/spec/extensions/pg_enum_spec.rb +1 -1
  331. data/spec/extensions/pg_extended_date_support_spec.rb +122 -0
  332. data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
  333. data/spec/extensions/pg_hstore_spec.rb +22 -31
  334. data/spec/extensions/pg_inet_ops_spec.rb +1 -1
  335. data/spec/extensions/pg_inet_spec.rb +1 -14
  336. data/spec/extensions/pg_interval_spec.rb +3 -13
  337. data/spec/extensions/pg_json_ops_spec.rb +1 -1
  338. data/spec/extensions/pg_json_spec.rb +1 -13
  339. data/spec/extensions/pg_loose_count_spec.rb +1 -1
  340. data/spec/extensions/pg_range_ops_spec.rb +1 -1
  341. data/spec/extensions/pg_range_spec.rb +3 -88
  342. data/spec/extensions/pg_row_ops_spec.rb +1 -1
  343. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  344. data/spec/extensions/pg_row_spec.rb +1 -44
  345. data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
  346. data/spec/extensions/prepared_statements_safe_spec.rb +7 -7
  347. data/spec/extensions/prepared_statements_spec.rb +13 -48
  348. data/spec/extensions/pretty_table_spec.rb +40 -9
  349. data/spec/extensions/query_spec.rb +1 -12
  350. data/spec/extensions/rcte_tree_spec.rb +23 -34
  351. data/spec/extensions/round_timestamps_spec.rb +1 -5
  352. data/spec/extensions/s_spec.rb +1 -1
  353. data/spec/extensions/schema_caching_spec.rb +1 -1
  354. data/spec/extensions/schema_dumper_spec.rb +43 -32
  355. data/spec/extensions/select_remove_spec.rb +1 -1
  356. data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
  357. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  358. data/spec/extensions/serialization_spec.rb +5 -17
  359. data/spec/extensions/server_block_spec.rb +1 -1
  360. data/spec/extensions/server_logging_spec.rb +2 -2
  361. data/spec/extensions/sharding_spec.rb +1 -1
  362. data/spec/extensions/shared_caching_spec.rb +1 -28
  363. data/spec/extensions/single_table_inheritance_spec.rb +2 -5
  364. data/spec/extensions/singular_table_names_spec.rb +1 -1
  365. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  366. data/spec/extensions/spec_helper.rb +5 -27
  367. data/spec/extensions/split_array_nil_spec.rb +1 -1
  368. data/spec/extensions/split_values_spec.rb +1 -1
  369. data/spec/extensions/sql_comments_spec.rb +1 -1
  370. data/spec/extensions/sql_expr_spec.rb +1 -1
  371. data/spec/extensions/static_cache_spec.rb +1 -1
  372. data/spec/extensions/string_agg_spec.rb +2 -2
  373. data/spec/extensions/string_date_time_spec.rb +1 -1
  374. data/spec/extensions/string_stripper_spec.rb +1 -1
  375. data/spec/extensions/subclasses_spec.rb +1 -1
  376. data/spec/extensions/subset_conditions_spec.rb +1 -1
  377. data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
  378. data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
  379. data/spec/extensions/synchronize_sql_spec.rb +124 -0
  380. data/spec/extensions/table_select_spec.rb +4 -4
  381. data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
  382. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  383. data/spec/extensions/timestamps_spec.rb +5 -7
  384. data/spec/extensions/to_dot_spec.rb +1 -1
  385. data/spec/extensions/touch_spec.rb +1 -1
  386. data/spec/extensions/tree_spec.rb +1 -1
  387. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  388. data/spec/extensions/unlimited_update_spec.rb +1 -1
  389. data/spec/extensions/update_or_create_spec.rb +12 -16
  390. data/spec/extensions/update_primary_key_spec.rb +4 -3
  391. data/spec/extensions/update_refresh_spec.rb +1 -1
  392. data/spec/extensions/uuid_spec.rb +10 -13
  393. data/spec/extensions/validate_associated_spec.rb +1 -1
  394. data/spec/extensions/validation_class_methods_spec.rb +3 -3
  395. data/spec/extensions/validation_contexts_spec.rb +1 -1
  396. data/spec/extensions/validation_helpers_spec.rb +10 -44
  397. data/spec/extensions/whitelist_security_spec.rb +5 -5
  398. data/spec/extensions/xml_serializer_spec.rb +8 -13
  399. data/spec/guards_helper.rb +2 -1
  400. data/spec/integration/associations_test.rb +1 -23
  401. data/spec/integration/database_test.rb +7 -7
  402. data/spec/integration/dataset_test.rb +12 -47
  403. data/spec/integration/eager_loader_test.rb +1 -1
  404. data/spec/integration/migrator_test.rb +1 -1
  405. data/spec/integration/model_test.rb +4 -82
  406. data/spec/integration/plugin_test.rb +7 -23
  407. data/spec/integration/prepared_statement_test.rb +8 -88
  408. data/spec/integration/schema_test.rb +10 -10
  409. data/spec/integration/spec_helper.rb +17 -21
  410. data/spec/integration/timezone_test.rb +5 -5
  411. data/spec/integration/transaction_test.rb +3 -55
  412. data/spec/integration/type_test.rb +9 -9
  413. data/spec/model/association_reflection_spec.rb +24 -9
  414. data/spec/model/associations_spec.rb +124 -303
  415. data/spec/model/base_spec.rb +43 -137
  416. data/spec/model/class_dataset_methods_spec.rb +2 -20
  417. data/spec/model/dataset_methods_spec.rb +1 -20
  418. data/spec/model/eager_loading_spec.rb +48 -17
  419. data/spec/model/hooks_spec.rb +5 -300
  420. data/spec/model/inflector_spec.rb +1 -1
  421. data/spec/model/model_spec.rb +29 -339
  422. data/spec/model/plugins_spec.rb +2 -16
  423. data/spec/model/record_spec.rb +33 -129
  424. data/spec/model/spec_helper.rb +5 -15
  425. data/spec/model/validations_spec.rb +1 -1
  426. data/spec/sequel_warning.rb +1 -12
  427. metadata +19 -65
  428. data/doc/active_record.rdoc +0 -927
  429. data/lib/sequel/adapters/cubrid.rb +0 -160
  430. data/lib/sequel/adapters/do/mysql.rb +0 -69
  431. data/lib/sequel/adapters/do/postgres.rb +0 -46
  432. data/lib/sequel/adapters/do/sqlite3.rb +0 -41
  433. data/lib/sequel/adapters/do.rb +0 -166
  434. data/lib/sequel/adapters/jdbc/as400.rb +0 -92
  435. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
  436. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
  437. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
  438. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
  439. data/lib/sequel/adapters/odbc/progress.rb +0 -12
  440. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  441. data/lib/sequel/adapters/shared/firebird.rb +0 -261
  442. data/lib/sequel/adapters/shared/informix.rb +0 -63
  443. data/lib/sequel/adapters/shared/progress.rb +0 -40
  444. data/lib/sequel/adapters/swift/mysql.rb +0 -50
  445. data/lib/sequel/adapters/swift/postgres.rb +0 -49
  446. data/lib/sequel/adapters/swift/sqlite.rb +0 -48
  447. data/lib/sequel/adapters/swift.rb +0 -169
  448. data/lib/sequel/adapters/utils/pg_types.rb +0 -4
  449. data/lib/sequel/dataset/mutation.rb +0 -98
  450. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
  451. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
  452. data/lib/sequel/extensions/filter_having.rb +0 -65
  453. data/lib/sequel/extensions/hash_aliases.rb +0 -51
  454. data/lib/sequel/extensions/meta_def.rb +0 -37
  455. data/lib/sequel/extensions/query_literals.rb +0 -86
  456. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
  457. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
  458. data/lib/sequel/extensions/set_overrides.rb +0 -82
  459. data/lib/sequel/no_core_ext.rb +0 -4
  460. data/lib/sequel/plugins/association_autoreloading.rb +0 -11
  461. data/lib/sequel/plugins/identifier_columns.rb +0 -49
  462. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
  463. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
  464. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
  465. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
  466. data/lib/sequel/plugins/schema.rb +0 -84
  467. data/lib/sequel/plugins/scissors.rb +0 -37
  468. data/spec/core/dataset_mutation_spec.rb +0 -253
  469. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
  470. data/spec/extensions/before_after_save_spec.rb +0 -40
  471. data/spec/extensions/filter_having_spec.rb +0 -42
  472. data/spec/extensions/from_block_spec.rb +0 -21
  473. data/spec/extensions/hash_aliases_spec.rb +0 -26
  474. data/spec/extensions/identifier_columns_spec.rb +0 -19
  475. data/spec/extensions/meta_def_spec.rb +0 -35
  476. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
  477. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
  478. data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
  479. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
  480. data/spec/extensions/query_literals_spec.rb +0 -185
  481. data/spec/extensions/schema_spec.rb +0 -123
  482. data/spec/extensions/scissors_spec.rb +0 -27
  483. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
  484. data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -1,105 +1,37 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- Sequel.require %w'replace split_alter_table unmodified_identifiers', 'adapters/utils'
3
+ require_relative '../utils/replace'
4
+ require_relative '../utils/split_alter_table'
5
+ require_relative '../utils/unmodified_identifiers'
4
6
 
5
7
  module Sequel
6
8
  module MySQL
7
9
  Sequel::Database.set_shared_adapter_scheme(:mysql, self)
8
10
 
9
11
  def self.mock_adapter_setup(db)
10
- db.instance_eval do
12
+ db.instance_exec do
11
13
  @server_version = 50617
12
14
  end
13
15
  end
14
16
 
15
- # SEQUEL5: Remove
16
- @convert_tinyint_to_bool = true
17
- @default_charset = nil
18
- @default_collate = nil
19
- @default_engine = nil
20
- class << self
21
- def convert_tinyint_to_bool
22
- Sequel::Deprecation.deprecate("Sequel::MySQL.convert_tinyint_to_bool", "Call this method on the Database instance")
23
- @convert_tinyint_to_bool
24
- end
25
- def convert_tinyint_to_bool=(v)
26
- Sequel::Deprecation.deprecate("Sequel::MySQL.convert_tinyint_to_bool=", "Call this method on the Database instance")
27
- @convert_tinyint_to_bool = v
28
- end
29
-
30
- def default_charset
31
- Sequel::Deprecation.deprecate("Sequel::MySQL.default_charset", "Call this method on the Database instance")
32
- @default_charset
33
- end
34
- def default_charset=(v)
35
- Sequel::Deprecation.deprecate("Sequel::MySQL.default_charset=", "Call this method on the Database instance")
36
- @default_charset = v
37
- end
38
-
39
- def default_collate
40
- Sequel::Deprecation.deprecate("Sequel::MySQL.default_collate", "Call this method on the Database instance")
41
- @default_collate
42
- end
43
- def default_collate=(v)
44
- Sequel::Deprecation.deprecate("Sequel::MySQL.default_collate=", "Call this method on the Database instance")
45
- @default_collate = v
46
- end
47
-
48
- def default_engine
49
- Sequel::Deprecation.deprecate("Sequel::MySQL.default_engine", "Call this method on the Database instance")
50
- @default_engine
51
- end
52
- def default_engine=(v)
53
- Sequel::Deprecation.deprecate("Sequel::MySQL.default_engine=", "Call this method on the Database instance")
54
- @default_engine = v
55
- end
56
- end
57
-
58
- # Methods shared by Database instances that connect to MySQL,
59
- # currently supported by the native and JDBC adapters.
60
17
  module DatabaseMethods
61
18
  include UnmodifiedIdentifiers::DatabaseMethods
62
19
  include Sequel::Database::SplitAlterTable
63
20
 
64
- AUTO_INCREMENT = 'AUTO_INCREMENT'.freeze
65
- Sequel::Deprecation.deprecate_constant(self, :AUTO_INCREMENT)
66
- PRIMARY = 'PRIMARY'.freeze
67
- Sequel::Deprecation.deprecate_constant(self, :PRIMARY)
68
- MYSQL_TIMESTAMP_RE = /\ACURRENT_(?:DATE|TIMESTAMP)?\z/
69
- Sequel::Deprecation.deprecate_constant(self, :MYSQL_TIMESTAMP_RE)
70
-
71
- CAST_TYPES = {String=>:CHAR, Integer=>:SIGNED, Time=>:DATETIME, DateTime=>:DATETIME, Numeric=>:DECIMAL, BigDecimal=>:DECIMAL, File=>:BINARY}#.freeze # SEQUEL5
72
- COLUMN_DEFINITION_ORDER = [:collate, :null, :default, :unique, :primary_key, :auto_increment, :references]#.freeze # SEQUEL5
73
-
21
+ CAST_TYPES = {String=>:CHAR, Integer=>:SIGNED, Time=>:DATETIME, DateTime=>:DATETIME, Numeric=>:DECIMAL, BigDecimal=>:DECIMAL, File=>:BINARY}.freeze
22
+ COLUMN_DEFINITION_ORDER = [:collate, :null, :default, :unique, :primary_key, :auto_increment, :references].freeze
74
23
 
75
24
  # Set the default charset used for CREATE TABLE. You can pass the
76
25
  # :charset option to create_table to override this setting.
77
- #attr_accessor :default_charset # SEQUEL5
26
+ attr_accessor :default_charset
78
27
 
79
28
  # Set the default collation used for CREATE TABLE. You can pass the
80
29
  # :collate option to create_table to override this setting.
81
- #attr_accessor :default_collate # SEQUEL5
30
+ attr_accessor :default_collate
82
31
 
83
32
  # Set the default engine used for CREATE TABLE. You can pass the
84
33
  # :engine option to create_table to override this setting.
85
- #attr_accessor :default_engine # SEQUEL5
86
-
87
- # SEQUEL5: Remove
88
- attr_writer :default_charset
89
- def default_charset
90
- v = @default_charset
91
- v.nil? ? Sequel::MySQL.instance_variable_get(:@default_charset) : v
92
- end
93
- attr_writer :default_collate
94
- def default_collate
95
- v = @default_collate
96
- v.nil? ? Sequel::MySQL.instance_variable_get(:@default_collate) : v
97
- end
98
- attr_writer :default_engine
99
- def default_engine
100
- v = @default_engine
101
- v.nil? ? Sequel::MySQL.instance_variable_get(:@default_engine) : v
102
- end
34
+ attr_accessor :default_engine
103
35
 
104
36
  # MySQL's cast rules are restrictive in that you can't just cast to any possible
105
37
  # database type.
@@ -107,13 +39,10 @@ module Sequel
107
39
  CAST_TYPES[type] || super
108
40
  end
109
41
 
110
- # Commit an existing prepared transaction with the given transaction
111
- # identifier string.
112
42
  def commit_prepared_transaction(transaction_id, opts=OPTS)
113
43
  run("XA COMMIT #{literal(transaction_id)}", opts)
114
44
  end
115
45
 
116
- # MySQL uses the :mysql database type
117
46
  def database_type
118
47
  :mysql
119
48
  end
@@ -145,6 +74,7 @@ module Sequel
145
74
 
146
75
  def freeze
147
76
  server_version
77
+ mariadb?
148
78
  supports_timestamp_usecs?
149
79
  super
150
80
  end
@@ -163,7 +93,6 @@ module Sequel
163
93
  indexes = {}
164
94
  remove_indexes = []
165
95
  m = output_identifier_meth
166
- im = input_identifier_meth
167
96
  schema, table = schema_and_table(table)
168
97
 
169
98
  table = Sequel::SQL::Identifier.new(table)
@@ -184,16 +113,20 @@ module Sequel
184
113
  indexes.reject{|k,v| remove_indexes.include?(k)}
185
114
  end
186
115
 
187
- # Rollback an existing prepared transaction with the given transaction
188
- # identifier string.
189
116
  def rollback_prepared_transaction(transaction_id, opts=OPTS)
190
117
  run("XA ROLLBACK #{literal(transaction_id)}", opts)
191
118
  end
192
119
 
120
+ # Whether the database is MariaDB and not MySQL
121
+ def mariadb?
122
+ return @is_mariadb if defined?(@is_mariadb)
123
+ @is_mariadb = !(fetch('SELECT version()').single_value! !~ /mariadb/i)
124
+ end
125
+
193
126
  # Get version of MySQL server, used for determined capabilities.
194
127
  def server_version
195
128
  @server_version ||= begin
196
- m = /(\d+)\.(\d+)\.(\d+)/.match(get(SQL::Function.new(:version)))
129
+ m = /(\d+)\.(\d+)\.(\d+)/.match(fetch('SELECT version()').single_value!)
197
130
  (m[1].to_i * 10000) + (m[2].to_i * 100) + m[3].to_i
198
131
  end
199
132
  end
@@ -241,16 +174,6 @@ module Sequel
241
174
  full_tables('BASE TABLE', opts)
242
175
  end
243
176
 
244
- # Changes the database in use by issuing a USE statement. I would be
245
- # very careful if I used this.
246
- def use(db_name)
247
- Sequel::Deprecation.deprecate("Database#use", "Create a new Sequel::Database instance instead of using Database#use")
248
- disconnect
249
- @opts[:database] = db_name if self << "USE #{db_name}"
250
- @schemas = {}
251
- self
252
- end
253
-
254
177
  # Return an array of symbols specifying view names in the current database.
255
178
  #
256
179
  # Options:
@@ -321,10 +244,13 @@ module Sequel
321
244
  "DROP FOREIGN KEY #{quote_identifier(name)}"
322
245
  when :unique
323
246
  "DROP INDEX #{quote_identifier(op[:name])}"
247
+ when :check, nil
248
+ if supports_check_constraints?
249
+ "DROP CONSTRAINT #{quote_identifier(op[:name])}"
250
+ end
324
251
  end
325
252
  end
326
253
 
327
- # MySQL server requires table names when dropping indexes.
328
254
  def alter_table_sql(table, op)
329
255
  case op[:op]
330
256
  when :drop_index
@@ -350,6 +276,11 @@ module Sequel
350
276
  super(default, type)
351
277
  end
352
278
 
279
+ def column_schema_to_ruby_default(default, type)
280
+ return Sequel::CURRENT_DATE if mariadb? && server_version >= 100200 && default == 'curdate()'
281
+ super
282
+ end
283
+
353
284
  # Don't allow combining adding foreign key operations with other
354
285
  # operations, since in some cases adding a foreign key constraint in
355
286
  # the same query as other operations results in MySQL error 150.
@@ -379,7 +310,6 @@ module Sequel
379
310
  sqls
380
311
  end
381
312
 
382
- # Use MySQL specific AUTO_INCREMENT text.
383
313
  def auto_increment_sql
384
314
  'AUTO_INCREMENT'
385
315
  end
@@ -400,7 +330,6 @@ module Sequel
400
330
  end
401
331
  end
402
332
 
403
- # The order of the column definition, as an array of symbols.
404
333
  def column_definition_order
405
334
  COLUMN_DEFINITION_ORDER
406
335
  end
@@ -477,6 +406,7 @@ module Sequel
477
406
  /foreign key constraint fails/ => ForeignKeyConstraintViolation,
478
407
  /cannot be null/ => NotNullConstraintViolation,
479
408
  /Deadlock found when trying to get lock; try restarting transaction/ => SerializationFailure,
409
+ /CONSTRAINT .+ failed for/ => CheckConstraintViolation,
480
410
  }.freeze
481
411
  def database_error_regexps
482
412
  DATABASE_ERROR_REGEXPS
@@ -488,7 +418,6 @@ module Sequel
488
418
  metadata_dataset.with_sql('SHOW FULL TABLES').server(opts[:server]).map{|r| m.call(r.values.first) if r.delete(:Table_type) == type}.compact
489
419
  end
490
420
 
491
- # Handle MySQL specific index SQL syntax
492
421
  def index_definition_sql(table_name, index)
493
422
  index_name = quote_identifier(index[:name] || default_index_name(table_name, index[:columns]))
494
423
  raise Error, "Partial indexes are not supported for this database" if index[:where] && !supports_partial_indexes?
@@ -520,7 +449,6 @@ module Sequel
520
449
  end
521
450
  end
522
451
 
523
- # Recognize MySQL set type.
524
452
  def schema_column_type(db_type)
525
453
  case db_type
526
454
  when /\Aset/io
@@ -559,6 +487,11 @@ module Sequel
559
487
  server_version >= 50600 && (op[:op] == :drop_index || (op[:op] == :drop_constraint && op[:type] == :unique))
560
488
  end
561
489
 
490
+ # Whether the database supports CHECK constraints
491
+ def supports_check_constraints?
492
+ mariadb? && server_version >= 100200
493
+ end
494
+
562
495
  # MySQL can combine multiple alter table ops into a single query.
563
496
  def supports_combining_alter_table_ops?
564
497
  true
@@ -629,112 +562,17 @@ module Sequel
629
562
 
630
563
  # Dataset methods shared by datasets that use MySQL databases.
631
564
  module DatasetMethods
632
- BOOL_TRUE = '1'.freeze
633
- Sequel::Deprecation.deprecate_constant(self, :BOOL_TRUE)
634
- BOOL_FALSE = '0'.freeze
635
- Sequel::Deprecation.deprecate_constant(self, :BOOL_FALSE)
636
- COMMA_SEPARATOR = ', '.freeze
637
- Sequel::Deprecation.deprecate_constant(self, :COMMA_SEPARATOR)
638
- FOR_SHARE = ' LOCK IN SHARE MODE'.freeze
639
- Sequel::Deprecation.deprecate_constant(self, :FOR_SHARE)
640
- SQL_CALC_FOUND_ROWS = ' SQL_CALC_FOUND_ROWS'.freeze
641
- Sequel::Deprecation.deprecate_constant(self, :SQL_CALC_FOUND_ROWS)
642
- APOS = "'".freeze
643
- Sequel::Deprecation.deprecate_constant(self, :APOS)
644
- APOS_RE = /'/.freeze
645
- Sequel::Deprecation.deprecate_constant(self, :APOS_RE)
646
- DOUBLE_APOS = "''".freeze
647
- Sequel::Deprecation.deprecate_constant(self, :DOUBLE_APOS)
648
- SPACE = ' '.freeze
649
- Sequel::Deprecation.deprecate_constant(self, :SPACE)
650
- PAREN_CLOSE = ')'.freeze
651
- Sequel::Deprecation.deprecate_constant(self, :PAREN_CLOSE)
652
- PAREN_OPEN = '('.freeze
653
- Sequel::Deprecation.deprecate_constant(self, :PAREN_OPEN)
654
- NOT_SPACE = 'NOT '.freeze
655
- Sequel::Deprecation.deprecate_constant(self, :NOT_SPACE)
656
- FROM = ' FROM '.freeze
657
- Sequel::Deprecation.deprecate_constant(self, :FROM)
658
- COMMA = ', '.freeze
659
- Sequel::Deprecation.deprecate_constant(self, :COMMA)
660
- LIMIT = " LIMIT ".freeze
661
- Sequel::Deprecation.deprecate_constant(self, :LIMIT)
662
- GROUP_BY = " GROUP BY ".freeze
663
- Sequel::Deprecation.deprecate_constant(self, :GROUP_BY)
664
- ESCAPE = " ESCAPE ".freeze
665
- Sequel::Deprecation.deprecate_constant(self, :ESCAPE)
666
- BACKSLASH = "\\".freeze
667
- Sequel::Deprecation.deprecate_constant(self, :BACKSLASH)
668
- REGEXP = 'REGEXP'.freeze
669
- Sequel::Deprecation.deprecate_constant(self, :REGEXP)
670
- LIKE = 'LIKE'.freeze
671
- Sequel::Deprecation.deprecate_constant(self, :LIKE)
672
- BINARY = 'BINARY '.freeze
673
- Sequel::Deprecation.deprecate_constant(self, :BINARY)
674
- CONCAT = "CONCAT".freeze
675
- Sequel::Deprecation.deprecate_constant(self, :CONCAT)
676
- CAST_BITCOMP_OPEN = "CAST(~".freeze
677
- Sequel::Deprecation.deprecate_constant(self, :CAST_BITCOMP_OPEN)
678
- CAST_BITCOMP_CLOSE = " AS SIGNED INTEGER)".freeze
679
- Sequel::Deprecation.deprecate_constant(self, :CAST_BITCOMP_CLOSE)
680
- STRAIGHT_JOIN = 'STRAIGHT_JOIN'.freeze
681
- Sequel::Deprecation.deprecate_constant(self, :STRAIGHT_JOIN)
682
- NATURAL_LEFT_JOIN = 'NATURAL LEFT JOIN'.freeze
683
- Sequel::Deprecation.deprecate_constant(self, :NATURAL_LEFT_JOIN)
684
- BACKTICK = '`'.freeze
685
- Sequel::Deprecation.deprecate_constant(self, :BACKTICK)
686
- BACKTICK_RE = /`/.freeze
687
- Sequel::Deprecation.deprecate_constant(self, :BACKTICK_RE)
688
- DOUBLE_BACKTICK = '``'.freeze
689
- Sequel::Deprecation.deprecate_constant(self, :DOUBLE_BACKTICK)
690
- EMPTY_COLUMNS = " ()".freeze
691
- Sequel::Deprecation.deprecate_constant(self, :EMPTY_COLUMNS)
692
- EMPTY_VALUES = " VALUES ()".freeze
693
- Sequel::Deprecation.deprecate_constant(self, :EMPTY_VALUES)
694
- IGNORE = " IGNORE".freeze
695
- Sequel::Deprecation.deprecate_constant(self, :IGNORE)
696
- ON_DUPLICATE_KEY_UPDATE = " ON DUPLICATE KEY UPDATE ".freeze
697
- Sequel::Deprecation.deprecate_constant(self, :ON_DUPLICATE_KEY_UPDATE)
698
- EQ_VALUES = '=VALUES('.freeze
699
- Sequel::Deprecation.deprecate_constant(self, :EQ_VALUES)
700
- EQ = '='.freeze
701
- Sequel::Deprecation.deprecate_constant(self, :EQ)
702
- WITH_ROLLUP = ' WITH ROLLUP'.freeze
703
- Sequel::Deprecation.deprecate_constant(self, :WITH_ROLLUP)
704
- EXPLAIN = 'EXPLAIN '.freeze
705
- Sequel::Deprecation.deprecate_constant(self, :EXPLAIN)
706
- EXPLAIN_EXTENDED = 'EXPLAIN EXTENDED '.freeze
707
- Sequel::Deprecation.deprecate_constant(self, :EXPLAIN_EXTENDED)
708
- BACKSLASH_RE = /\\/.freeze
709
- Sequel::Deprecation.deprecate_constant(self, :BACKSLASH_RE)
710
- QUAD_BACKSLASH = "\\\\\\\\".freeze
711
- Sequel::Deprecation.deprecate_constant(self, :QUAD_BACKSLASH)
712
- BLOB_START = "0x".freeze
713
- Sequel::Deprecation.deprecate_constant(self, :BLOB_START)
714
- EMPTY_BLOB = "''".freeze
715
- Sequel::Deprecation.deprecate_constant(self, :EMPTY_BLOB)
716
- HSTAR = "H*".freeze
717
- Sequel::Deprecation.deprecate_constant(self, :HSTAR)
718
- CURRENT_TIMESTAMP_56 = 'CURRENT_TIMESTAMP(6)'.freeze
719
- Sequel::Deprecation.deprecate_constant(self, :CURRENT_TIMESTAMP_56)
720
- ONLY_OFFSET = ",18446744073709551615".freeze
721
- Sequel::Deprecation.deprecate_constant(self, :ONLY_OFFSET)
722
- NON_SQL_OPTIONS = (Dataset::NON_SQL_OPTIONS + [:insert_ignore, :update_ignore, :on_duplicate_key_update]).freeze
723
- Sequel::Deprecation.deprecate_constant(self, :NON_SQL_OPTIONS)
724
-
725
565
  MATCH_AGAINST = ["MATCH ".freeze, " AGAINST (".freeze, ")".freeze].freeze
726
566
  MATCH_AGAINST_BOOLEAN = ["MATCH ".freeze, " AGAINST (".freeze, " IN BOOLEAN MODE)".freeze].freeze
727
567
 
728
568
  Dataset.def_sql_method(self, :delete, %w'delete from where order limit')
729
569
  Dataset.def_sql_method(self, :insert, %w'insert ignore into columns values on_duplicate_key_update')
730
- Dataset.def_sql_method(self, :select, %w'select distinct calc_found_rows columns from join where group having compounds order limit lock')
570
+ Dataset.def_sql_method(self, :select, %w'with select distinct calc_found_rows columns from join where group having compounds order limit lock')
731
571
  Dataset.def_sql_method(self, :update, %w'update ignore table set where order limit')
732
572
 
733
573
  include Sequel::Dataset::Replace
734
574
  include UnmodifiedIdentifiers::DatasetMethods
735
575
 
736
- # MySQL specific syntax for LIKE/REGEXP searches, as well as
737
- # string concatenation.
738
576
  def complex_expression_sql_append(sql, op, args)
739
577
  case op
740
578
  when :IN, :"NOT IN"
@@ -802,10 +640,10 @@ module Sequel
802
640
  # Sets up the select methods to delete from if deleting from a
803
641
  # joined dataset:
804
642
  #
805
- # DB[:a].join(:b, :a_id=>:id).delete
643
+ # DB[:a].join(:b, a_id: :id).delete
806
644
  # # DELETE a FROM a INNER JOIN b ON (b.a_id = a.id)
807
645
  #
808
- # DB[:a].join(:b, :a_id=>:id).delete_from(:a, :b).delete
646
+ # DB[:a].join(:b, a_id: :id).delete_from(:a, :b).delete
809
647
  # # DELETE a, b FROM a INNER JOIN b ON (b.a_id = a.id)
810
648
  def delete_from(*tables)
811
649
  clone(:delete_from=>tables)
@@ -838,26 +676,10 @@ module Sequel
838
676
  SQL::PlaceholderLiteralString.new((opts[:boolean] ? MATCH_AGAINST_BOOLEAN : MATCH_AGAINST), [Array(cols), terms])
839
677
  end
840
678
 
841
- # Transforms an CROSS JOIN to an INNER JOIN if the expr is not nil.
842
- # Raises an error on use of :full_outer type, since MySQL doesn't support it.
843
- def join_table(type, table, expr=nil, opts=OPTS, &block)
844
- if (type == :cross) && !expr.nil?
845
- Sequel::Deprecation.deprecate(":cross join type with conditions being converted to INNER JOIN on MySQL", "Use :inner join type instead")
846
- type = :inner
847
- end
848
- raise(Sequel::Error, "MySQL doesn't support FULL OUTER JOIN or NATURAL FULL JOIN") if type == :full_outer || type == :natural_full
849
- super(type, table, expr, opts, &block)
850
- end
851
-
852
- # Transforms :natural_inner to NATURAL LEFT JOIN and straight to
853
- # STRAIGHT_JOIN.
679
+ # Transforms :straight to STRAIGHT_JOIN.
854
680
  def join_type_sql(join_type)
855
- case join_type
856
- when :straight
681
+ if join_type == :straight
857
682
  'STRAIGHT_JOIN'
858
- when :natural_inner
859
- Sequel::Deprecation.deprecate(":natural_inner join type being converted to NATURAL LEFT JOIN on MySQL", "Use :natural_left join type for NATURAL LEFT JOIN, or :natural join type for NATURAL JOIN")
860
- 'NATURAL LEFT JOIN'
861
683
  else
862
684
  super
863
685
  end
@@ -868,7 +690,7 @@ module Sequel
868
690
  # inserting rows that violate the unique key restriction.
869
691
  #
870
692
  # dataset.insert_ignore.multi_insert(
871
- # [{:name => 'a', :value => 1}, {:name => 'b', :value => 2}]
693
+ # [{name: 'a', value: 1}, {name: 'b', value: 2}]
872
694
  # )
873
695
  # # INSERT IGNORE INTO tablename (name, value) VALUES (a, 1), (b, 2)
874
696
  def insert_ignore
@@ -886,21 +708,21 @@ module Sequel
886
708
  # inserting rows that violate the unique key restriction.
887
709
  #
888
710
  # dataset.on_duplicate_key_update.multi_insert(
889
- # [{:name => 'a', :value => 1}, {:name => 'b', :value => 2}]
711
+ # [{name: 'a', value: 1}, {name: 'b', value: 2}]
890
712
  # )
891
713
  # # INSERT INTO tablename (name, value) VALUES (a, 1), (b, 2)
892
714
  # # ON DUPLICATE KEY UPDATE name=VALUES(name), value=VALUES(value)
893
715
  #
894
716
  # dataset.on_duplicate_key_update(:value).multi_insert(
895
- # [{:name => 'a', :value => 1}, {:name => 'b', :value => 2}]
717
+ # [{name: 'a', value: 1}, {name: 'b', value: 2}]
896
718
  # )
897
719
  # # INSERT INTO tablename (name, value) VALUES (a, 1), (b, 2)
898
720
  # # ON DUPLICATE KEY UPDATE value=VALUES(value)
899
721
  #
900
722
  # dataset.on_duplicate_key_update(
901
- # :value => Sequel.lit('value + VALUES(value)')
723
+ # value: Sequel.lit('value + VALUES(value)')
902
724
  # ).multi_insert(
903
- # [{:name => 'a', :value => 1}, {:name => 'b', :value => 2}]
725
+ # [{name: 'a', value: 1}, {name: 'b', value: 2}]
904
726
  # )
905
727
  # # INSERT INTO tablename (name, value) VALUES (a, 1), (b, 2)
906
728
  # # ON DUPLICATE KEY UPDATE value=value + VALUES(value)
@@ -913,6 +735,10 @@ module Sequel
913
735
  sql << '`' << c.to_s.gsub('`', '``') << '`'
914
736
  end
915
737
 
738
+ def supports_cte?(type=:select)
739
+ type == :select && db.mariadb? && db.server_version >= 100200
740
+ end
741
+
916
742
  # MySQL does not support derived column lists
917
743
  def supports_derived_column_lists?
918
744
  false
@@ -945,7 +771,7 @@ module Sequel
945
771
  end
946
772
 
947
773
  # MySQL's DISTINCT ON emulation using GROUP BY does not respect the
948
- # queries ORDER BY clause.
774
+ # query's ORDER BY clause.
949
775
  def supports_ordered_distinct_on?
950
776
  false
951
777
  end
@@ -955,18 +781,21 @@ module Sequel
955
781
  true
956
782
  end
957
783
 
958
- # MySQL does support fractional timestamps in literal timestamps, but it
959
- # ignores them. Also, using them seems to cause problems on 1.9. Since
960
- # they are ignored anyway, not using them is probably best.
784
+ # Check the database setting for whether fractional timestamps
785
+ # are suppported.
961
786
  def supports_timestamp_usecs?
962
787
  db.supports_timestamp_usecs?
963
788
  end
964
-
789
+
790
+ def supports_window_functions?
791
+ db.mariadb? && db.server_version >= 100200
792
+ end
793
+
965
794
  # Sets up the update methods to use UPDATE IGNORE.
966
795
  # Useful if you have a unique key and want to just skip
967
796
  # updating rows that violate the unique key restriction.
968
797
  #
969
- # dataset.update_ignore.update({:name => 'a', :value => 1})
798
+ # dataset.update_ignore.update(name: 'a', value: 1)
970
799
  # # UPDATE IGNORE tablename SET name = 'a', value = 1
971
800
  def update_ignore
972
801
  clone(:update_ignore=>true)
@@ -1105,7 +934,7 @@ module Sequel
1105
934
  '1'
1106
935
  end
1107
936
 
1108
- # MySQL supports multiple rows in INSERT.
937
+ # MySQL supports multiple rows in VALUES in INSERT.
1109
938
  def multi_insert_sql_strategy
1110
939
  :values
1111
940
  end
@@ -1130,6 +959,11 @@ module Sequel
1130
959
  sql << ' SQL_CALC_FOUND_ROWS' if opts[:calc_found_rows]
1131
960
  end
1132
961
 
962
+ # Use WITH RECURSIVE instead of WITH if any of the CTEs is recursive
963
+ def select_with_sql_base
964
+ opts[:with].any?{|w| w[:recursive]} ? "WITH RECURSIVE " : super
965
+ end
966
+
1133
967
  # MySQL uses WITH ROLLUP syntax.
1134
968
  def uses_with_rollup?
1135
969
  true
@@ -1,24 +1,19 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- Sequel.require 'adapters/utils/emulate_offset_with_row_number'
3
+ require_relative '../utils/emulate_offset_with_row_number'
4
4
 
5
5
  module Sequel
6
6
  module Oracle
7
7
  Sequel::Database.set_shared_adapter_scheme(:oracle, self)
8
8
 
9
9
  def self.mock_adapter_setup(db)
10
- db.instance_eval do
10
+ db.instance_exec do
11
11
  @server_version = 11000000
12
12
  @primary_key_sequences = {}
13
13
  end
14
14
  end
15
15
 
16
16
  module DatabaseMethods
17
- TEMPORARY = 'GLOBAL TEMPORARY '.freeze
18
- Sequel::Deprecation.deprecate_constant(self, :TEMPORARY)
19
- AUTOINCREMENT = ''.freeze
20
- Sequel::Deprecation.deprecate_constant(self, :AUTOINCREMENT)
21
-
22
17
  attr_accessor :autosequence
23
18
 
24
19
  def create_sequence(name, opts=OPTS)
@@ -37,7 +32,6 @@ module Sequel
37
32
  self << drop_sequence_sql(name)
38
33
  end
39
34
 
40
- # Oracle uses the :oracle database type
41
35
  def database_type
42
36
  :oracle
43
37
  end
@@ -88,7 +82,7 @@ module Sequel
88
82
  false
89
83
  end
90
84
 
91
- IGNORE_OWNERS = %w'APEX_040000 CTXSYS EXFSYS MDSYS OLAPSYS ORDDATA ORDSYS SYS SYSTEM XDB XDBMETADATA XDBPM XFILES WMSYS'#.freeze # SEQUEL5
85
+ IGNORE_OWNERS = %w'APEX_040000 CTXSYS EXFSYS MDSYS OLAPSYS ORDDATA ORDSYS SYS SYSTEM XDB XDBMETADATA XDBPM XFILES WMSYS'.freeze
92
86
 
93
87
  def tables(opts=OPTS)
94
88
  m = output_identifier_meth
@@ -146,7 +140,6 @@ module Sequel
146
140
 
147
141
  private
148
142
 
149
- # Handle Oracle specific ALTER TABLE SQL
150
143
  def alter_table_sql(table, op)
151
144
  case op[:op]
152
145
  when :add_column
@@ -253,7 +246,7 @@ module Sequel
253
246
  TRANSACTION_ISOLATION_LEVELS = {:uncommitted=>'READ COMMITTED'.freeze,
254
247
  :committed=>'READ COMMITTED'.freeze,
255
248
  :repeatable=>'SERIALIZABLE'.freeze,
256
- :serializable=>'SERIALIZABLE'.freeze}#.freeze # SEQUEL5
249
+ :serializable=>'SERIALIZABLE'.freeze}.freeze
257
250
  # Oracle doesn't support READ UNCOMMITTED OR REPEATABLE READ transaction
258
251
  # isolation levels, so upgrade to the next highest level in those cases.
259
252
  def set_transaction_isolation_sql(level)
@@ -322,31 +315,6 @@ module Sequel
322
315
  ROW_NUMBER_EXPRESSION = LiteralString.new('ROWNUM').freeze
323
316
  BITAND_PROC = lambda{|a, b| Sequel.lit(["CAST(BITAND(", ", ", ") AS INTEGER)"], a, b)}
324
317
 
325
- SPACE = ' '.freeze
326
- Sequel::Deprecation.deprecate_constant(self, :SPACE)
327
- APOS = "'".freeze
328
- Sequel::Deprecation.deprecate_constant(self, :APOS)
329
- APOS_RE = /'/.freeze
330
- Sequel::Deprecation.deprecate_constant(self, :APOS_RE)
331
- DOUBLE_APOS = "''".freeze
332
- Sequel::Deprecation.deprecate_constant(self, :DOUBLE_APOS)
333
- FROM = ' FROM '.freeze
334
- Sequel::Deprecation.deprecate_constant(self, :FROM)
335
- TIMESTAMP_FORMAT = "TIMESTAMP '%Y-%m-%d %H:%M:%S%N %z'".freeze
336
- Sequel::Deprecation.deprecate_constant(self, :TIMESTAMP_FORMAT)
337
- TIMESTAMP_OFFSET_FORMAT = "%+03i:%02i".freeze
338
- Sequel::Deprecation.deprecate_constant(self, :TIMESTAMP_OFFSET_FORMAT)
339
- BOOL_FALSE = "'N'".freeze
340
- Sequel::Deprecation.deprecate_constant(self, :BOOL_FALSE)
341
- BOOL_TRUE = "'Y'".freeze
342
- Sequel::Deprecation.deprecate_constant(self, :BOOL_TRUE)
343
- HSTAR = "H*".freeze
344
- Sequel::Deprecation.deprecate_constant(self, :HSTAR)
345
- DUAL = ' FROM DUAL'.freeze
346
- Sequel::Deprecation.deprecate_constant(self, :DUAL)
347
- SKIP_LOCKED = " SKIP LOCKED".freeze
348
- Sequel::Deprecation.deprecate_constant(self, :SKIP_LOCKED)
349
-
350
318
  include(Module.new do
351
319
  Dataset.def_sql_method(self, :select, %w'with select distinct columns from join where group having compounds order limit lock')
352
320
  end)
@@ -418,7 +386,8 @@ module Sequel
418
386
  clone(:sequence=>s)
419
387
  end
420
388
 
421
- # Handle LIMIT by using a unlimited subselect filtered with ROWNUM.
389
+ # Handle LIMIT by using a unlimited subselect filtered with ROWNUM,
390
+ # unless Oracle 12 is used.
422
391
  def select_sql
423
392
  return super if @opts[:sql]
424
393
  return super if supports_fetch_next_rows?
@@ -467,6 +436,7 @@ module Sequel
467
436
  sql << " ROWS ONLY"
468
437
  end
469
438
  end
439
+
470
440
  # Oracle requires recursive CTEs to have column aliases.
471
441
  def recursive_cte_requires_column_aliases?
472
442
  true
@@ -481,7 +451,8 @@ module Sequel
481
451
  false
482
452
  end
483
453
 
484
- # Oracle supports FETCH NEXT ROWS since 12c
454
+ # Oracle supports FETCH NEXT ROWS since 12c, but it doesn't work when
455
+ # locking or when skipping locked rows.
485
456
  def supports_fetch_next_rows?
486
457
  server_version >= 12000000 && !(@opts[:lock] || @opts[:skip_locked])
487
458
  end
@@ -551,7 +522,7 @@ module Sequel
551
522
  db.server_version(@opts[:server])
552
523
  end
553
524
 
554
- # Oracle supports pattern matching via regular expressions
525
+ # Oracle 10+ supports pattern matching via regular expressions
555
526
  def supports_regexp?
556
527
  server_version >= 10010002
557
528
  end
@@ -565,7 +536,8 @@ module Sequel
565
536
  end
566
537
 
567
538
  # Oracle doesn't support the use of AS when aliasing a dataset. It doesn't require
568
- # the use of AS anywhere, so this disables it in all cases.
539
+ # the use of AS anywhere, so this disables it in all cases. Oracle also does not support
540
+ # derived column lists in aliases.
569
541
  def as_sql_append(sql, aliaz, column_aliases=nil)
570
542
  raise Error, "oracle does not support derived column lists" if column_aliases
571
543
  sql << ' '
@@ -581,7 +553,7 @@ module Sequel
581
553
  ' FROM DUAL'
582
554
  end
583
555
 
584
- # There is no function on Microsoft SQL Server that does character length
556
+ # There is no function on Oracle that does character length
585
557
  # and respects trailing spaces (datalength respects trailing spaces, but
586
558
  # counts bytes instead of characters). Use a hack to work around the
587
559
  # trailing spaces issue.