sequel 4.36.0 → 5.61.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 (760) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +548 -5749
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +265 -159
  5. data/bin/sequel +34 -12
  6. data/doc/advanced_associations.rdoc +228 -187
  7. data/doc/association_basics.rdoc +281 -291
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +86 -51
  10. data/doc/code_order.rdoc +25 -19
  11. data/doc/core_extensions.rdoc +104 -63
  12. data/doc/dataset_basics.rdoc +12 -21
  13. data/doc/dataset_filtering.rdoc +99 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/fork_safety.rdoc +84 -0
  16. data/doc/mass_assignment.rdoc +74 -31
  17. data/doc/migration.rdoc +59 -51
  18. data/doc/model_dataset_method_design.rdoc +129 -0
  19. data/doc/model_hooks.rdoc +15 -25
  20. data/doc/model_plugins.rdoc +12 -12
  21. data/doc/mssql_stored_procedures.rdoc +3 -3
  22. data/doc/object_model.rdoc +58 -68
  23. data/doc/opening_databases.rdoc +85 -95
  24. data/doc/postgresql.rdoc +263 -38
  25. data/doc/prepared_statements.rdoc +29 -24
  26. data/doc/querying.rdoc +189 -167
  27. data/doc/reflection.rdoc +5 -6
  28. data/doc/release_notes/5.0.0.txt +159 -0
  29. data/doc/release_notes/5.1.0.txt +31 -0
  30. data/doc/release_notes/5.10.0.txt +84 -0
  31. data/doc/release_notes/5.11.0.txt +83 -0
  32. data/doc/release_notes/5.12.0.txt +141 -0
  33. data/doc/release_notes/5.13.0.txt +27 -0
  34. data/doc/release_notes/5.14.0.txt +63 -0
  35. data/doc/release_notes/5.15.0.txt +39 -0
  36. data/doc/release_notes/5.16.0.txt +110 -0
  37. data/doc/release_notes/5.17.0.txt +31 -0
  38. data/doc/release_notes/5.18.0.txt +69 -0
  39. data/doc/release_notes/5.19.0.txt +28 -0
  40. data/doc/release_notes/5.2.0.txt +33 -0
  41. data/doc/release_notes/5.20.0.txt +89 -0
  42. data/doc/release_notes/5.21.0.txt +87 -0
  43. data/doc/release_notes/5.22.0.txt +48 -0
  44. data/doc/release_notes/5.23.0.txt +56 -0
  45. data/doc/release_notes/5.24.0.txt +56 -0
  46. data/doc/release_notes/5.25.0.txt +32 -0
  47. data/doc/release_notes/5.26.0.txt +35 -0
  48. data/doc/release_notes/5.27.0.txt +21 -0
  49. data/doc/release_notes/5.28.0.txt +16 -0
  50. data/doc/release_notes/5.29.0.txt +22 -0
  51. data/doc/release_notes/5.3.0.txt +121 -0
  52. data/doc/release_notes/5.30.0.txt +20 -0
  53. data/doc/release_notes/5.31.0.txt +148 -0
  54. data/doc/release_notes/5.32.0.txt +46 -0
  55. data/doc/release_notes/5.33.0.txt +24 -0
  56. data/doc/release_notes/5.34.0.txt +40 -0
  57. data/doc/release_notes/5.35.0.txt +56 -0
  58. data/doc/release_notes/5.36.0.txt +60 -0
  59. data/doc/release_notes/5.37.0.txt +30 -0
  60. data/doc/release_notes/5.38.0.txt +28 -0
  61. data/doc/release_notes/5.39.0.txt +19 -0
  62. data/doc/release_notes/5.4.0.txt +80 -0
  63. data/doc/release_notes/5.40.0.txt +40 -0
  64. data/doc/release_notes/5.41.0.txt +25 -0
  65. data/doc/release_notes/5.42.0.txt +136 -0
  66. data/doc/release_notes/5.43.0.txt +98 -0
  67. data/doc/release_notes/5.44.0.txt +32 -0
  68. data/doc/release_notes/5.45.0.txt +34 -0
  69. data/doc/release_notes/5.46.0.txt +87 -0
  70. data/doc/release_notes/5.47.0.txt +59 -0
  71. data/doc/release_notes/5.48.0.txt +14 -0
  72. data/doc/release_notes/5.49.0.txt +59 -0
  73. data/doc/release_notes/5.5.0.txt +61 -0
  74. data/doc/release_notes/5.50.0.txt +78 -0
  75. data/doc/release_notes/5.51.0.txt +47 -0
  76. data/doc/release_notes/5.52.0.txt +87 -0
  77. data/doc/release_notes/5.53.0.txt +23 -0
  78. data/doc/release_notes/5.54.0.txt +27 -0
  79. data/doc/release_notes/5.55.0.txt +21 -0
  80. data/doc/release_notes/5.56.0.txt +51 -0
  81. data/doc/release_notes/5.57.0.txt +23 -0
  82. data/doc/release_notes/5.58.0.txt +31 -0
  83. data/doc/release_notes/5.59.0.txt +73 -0
  84. data/doc/release_notes/5.6.0.txt +31 -0
  85. data/doc/release_notes/5.60.0.txt +22 -0
  86. data/doc/release_notes/5.61.0.txt +43 -0
  87. data/doc/release_notes/5.7.0.txt +108 -0
  88. data/doc/release_notes/5.8.0.txt +170 -0
  89. data/doc/release_notes/5.9.0.txt +99 -0
  90. data/doc/schema_modification.rdoc +95 -75
  91. data/doc/security.rdoc +109 -80
  92. data/doc/sharding.rdoc +74 -47
  93. data/doc/sql.rdoc +147 -122
  94. data/doc/testing.rdoc +43 -20
  95. data/doc/thread_safety.rdoc +2 -4
  96. data/doc/transactions.rdoc +97 -18
  97. data/doc/validations.rdoc +52 -50
  98. data/doc/virtual_rows.rdoc +90 -109
  99. data/lib/sequel/adapters/ado/access.rb +15 -17
  100. data/lib/sequel/adapters/ado/mssql.rb +6 -15
  101. data/lib/sequel/adapters/ado.rb +150 -20
  102. data/lib/sequel/adapters/amalgalite.rb +11 -23
  103. data/lib/sequel/adapters/ibmdb.rb +47 -55
  104. data/lib/sequel/adapters/jdbc/db2.rb +29 -39
  105. data/lib/sequel/adapters/jdbc/derby.rb +58 -54
  106. data/lib/sequel/adapters/jdbc/h2.rb +93 -35
  107. data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
  108. data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
  109. data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
  110. data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
  111. data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
  112. data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
  113. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
  114. data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
  115. data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
  116. data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
  117. data/lib/sequel/adapters/jdbc.rb +145 -130
  118. data/lib/sequel/adapters/mock.rb +100 -111
  119. data/lib/sequel/adapters/mysql.rb +114 -122
  120. data/lib/sequel/adapters/mysql2.rb +147 -63
  121. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  122. data/lib/sequel/adapters/odbc/mssql.rb +8 -14
  123. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  124. data/lib/sequel/adapters/odbc.rb +20 -25
  125. data/lib/sequel/adapters/oracle.rb +50 -56
  126. data/lib/sequel/adapters/postgres.rb +305 -327
  127. data/lib/sequel/adapters/postgresql.rb +1 -1
  128. data/lib/sequel/adapters/shared/access.rb +74 -78
  129. data/lib/sequel/adapters/shared/db2.rb +118 -71
  130. data/lib/sequel/adapters/shared/mssql.rb +301 -220
  131. data/lib/sequel/adapters/shared/mysql.rb +299 -217
  132. data/lib/sequel/adapters/shared/oracle.rb +226 -65
  133. data/lib/sequel/adapters/shared/postgres.rb +935 -395
  134. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
  135. data/lib/sequel/adapters/shared/sqlite.rb +447 -173
  136. data/lib/sequel/adapters/sqlanywhere.rb +48 -35
  137. data/lib/sequel/adapters/sqlite.rb +156 -111
  138. data/lib/sequel/adapters/tinytds.rb +30 -38
  139. data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
  140. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
  141. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
  142. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  143. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  144. data/lib/sequel/adapters/utils/replace.rb +1 -4
  145. data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
  146. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  147. data/lib/sequel/ast_transformer.rb +17 -89
  148. data/lib/sequel/connection_pool/sharded_single.rb +18 -15
  149. data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
  150. data/lib/sequel/connection_pool/single.rb +18 -13
  151. data/lib/sequel/connection_pool/threaded.rb +121 -120
  152. data/lib/sequel/connection_pool.rb +48 -29
  153. data/lib/sequel/core.rb +351 -301
  154. data/lib/sequel/database/connecting.rb +69 -57
  155. data/lib/sequel/database/dataset.rb +13 -5
  156. data/lib/sequel/database/dataset_defaults.rb +18 -102
  157. data/lib/sequel/database/features.rb +18 -4
  158. data/lib/sequel/database/logging.rb +12 -11
  159. data/lib/sequel/database/misc.rb +180 -122
  160. data/lib/sequel/database/query.rb +47 -27
  161. data/lib/sequel/database/schema_generator.rb +178 -84
  162. data/lib/sequel/database/schema_methods.rb +172 -97
  163. data/lib/sequel/database/transactions.rb +205 -44
  164. data/lib/sequel/database.rb +17 -2
  165. data/lib/sequel/dataset/actions.rb +339 -155
  166. data/lib/sequel/dataset/dataset_module.rb +46 -0
  167. data/lib/sequel/dataset/features.rb +90 -35
  168. data/lib/sequel/dataset/graph.rb +80 -58
  169. data/lib/sequel/dataset/misc.rb +137 -47
  170. data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
  171. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  172. data/lib/sequel/dataset/query.rb +530 -222
  173. data/lib/sequel/dataset/sql.rb +590 -368
  174. data/lib/sequel/dataset.rb +26 -16
  175. data/lib/sequel/deprecated.rb +12 -2
  176. data/lib/sequel/exceptions.rb +46 -16
  177. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  178. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  179. data/lib/sequel/extensions/_pretty_table.rb +2 -5
  180. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  181. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  182. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  183. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  184. data/lib/sequel/extensions/blank.rb +8 -0
  185. data/lib/sequel/extensions/caller_logging.rb +79 -0
  186. data/lib/sequel/extensions/columns_introspection.rb +4 -3
  187. data/lib/sequel/extensions/connection_expiration.rb +20 -10
  188. data/lib/sequel/extensions/connection_validator.rb +11 -10
  189. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  190. data/lib/sequel/extensions/constraint_validations.rb +62 -39
  191. data/lib/sequel/extensions/core_extensions.rb +42 -48
  192. data/lib/sequel/extensions/core_refinements.rb +80 -59
  193. data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
  194. data/lib/sequel/extensions/date_arithmetic.rb +98 -39
  195. data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
  196. data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
  197. data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
  198. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  199. data/lib/sequel/extensions/escaped_like.rb +100 -0
  200. data/lib/sequel/extensions/eval_inspect.rb +12 -15
  201. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  202. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  203. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  204. data/lib/sequel/extensions/from_block.rb +1 -34
  205. data/lib/sequel/extensions/graph_each.rb +4 -4
  206. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  207. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  208. data/lib/sequel/extensions/index_caching.rb +109 -0
  209. data/lib/sequel/extensions/inflector.rb +13 -5
  210. data/lib/sequel/extensions/integer64.rb +32 -0
  211. data/lib/sequel/extensions/is_distinct_from.rb +141 -0
  212. data/lib/sequel/extensions/looser_typecasting.rb +17 -8
  213. data/lib/sequel/extensions/migration.rb +119 -78
  214. data/lib/sequel/extensions/named_timezones.rb +88 -23
  215. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
  216. data/lib/sequel/extensions/null_dataset.rb +8 -8
  217. data/lib/sequel/extensions/pagination.rb +32 -29
  218. data/lib/sequel/extensions/pg_array.rb +221 -287
  219. data/lib/sequel/extensions/pg_array_ops.rb +17 -9
  220. data/lib/sequel/extensions/pg_enum.rb +63 -23
  221. data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
  222. data/lib/sequel/extensions/pg_hstore.rb +45 -54
  223. data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
  224. data/lib/sequel/extensions/pg_inet.rb +31 -12
  225. data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
  226. data/lib/sequel/extensions/pg_interval.rb +56 -29
  227. data/lib/sequel/extensions/pg_json.rb +417 -140
  228. data/lib/sequel/extensions/pg_json_ops.rb +270 -18
  229. data/lib/sequel/extensions/pg_loose_count.rb +4 -2
  230. data/lib/sequel/extensions/pg_multirange.rb +372 -0
  231. data/lib/sequel/extensions/pg_range.rb +131 -191
  232. data/lib/sequel/extensions/pg_range_ops.rb +42 -13
  233. data/lib/sequel/extensions/pg_row.rb +48 -81
  234. data/lib/sequel/extensions/pg_row_ops.rb +33 -14
  235. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  236. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  237. data/lib/sequel/extensions/query.rb +9 -7
  238. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  239. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  240. data/lib/sequel/extensions/s.rb +60 -0
  241. data/lib/sequel/extensions/schema_caching.rb +10 -1
  242. data/lib/sequel/extensions/schema_dumper.rb +71 -48
  243. data/lib/sequel/extensions/select_remove.rb +4 -4
  244. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  245. data/lib/sequel/extensions/server_block.rb +51 -27
  246. data/lib/sequel/extensions/split_array_nil.rb +4 -4
  247. data/lib/sequel/extensions/sql_comments.rb +119 -7
  248. data/lib/sequel/extensions/sql_expr.rb +2 -1
  249. data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
  250. data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
  251. data/lib/sequel/extensions/string_agg.rb +11 -8
  252. data/lib/sequel/extensions/string_date_time.rb +19 -23
  253. data/lib/sequel/extensions/symbol_aref.rb +55 -0
  254. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  255. data/lib/sequel/extensions/symbol_as.rb +23 -0
  256. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  257. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  258. data/lib/sequel/extensions/to_dot.rb +10 -4
  259. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  260. data/lib/sequel/model/associations.rb +1006 -284
  261. data/lib/sequel/model/base.rb +560 -805
  262. data/lib/sequel/model/dataset_module.rb +11 -10
  263. data/lib/sequel/model/default_inflections.rb +1 -1
  264. data/lib/sequel/model/errors.rb +10 -3
  265. data/lib/sequel/model/exceptions.rb +8 -10
  266. data/lib/sequel/model/inflections.rb +7 -20
  267. data/lib/sequel/model/plugins.rb +114 -0
  268. data/lib/sequel/model.rb +32 -82
  269. data/lib/sequel/plugins/active_model.rb +30 -14
  270. data/lib/sequel/plugins/after_initialize.rb +1 -1
  271. data/lib/sequel/plugins/association_dependencies.rb +25 -18
  272. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  273. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  274. data/lib/sequel/plugins/association_pks.rb +147 -70
  275. data/lib/sequel/plugins/association_proxies.rb +33 -9
  276. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  277. data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
  278. data/lib/sequel/plugins/auto_validations.rb +95 -28
  279. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  280. data/lib/sequel/plugins/before_after_save.rb +0 -42
  281. data/lib/sequel/plugins/blacklist_security.rb +21 -12
  282. data/lib/sequel/plugins/boolean_readers.rb +5 -5
  283. data/lib/sequel/plugins/boolean_subsets.rb +13 -8
  284. data/lib/sequel/plugins/caching.rb +25 -16
  285. data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
  286. data/lib/sequel/plugins/column_conflicts.rb +16 -3
  287. data/lib/sequel/plugins/column_encryption.rb +728 -0
  288. data/lib/sequel/plugins/column_select.rb +7 -5
  289. data/lib/sequel/plugins/columns_updated.rb +42 -0
  290. data/lib/sequel/plugins/composition.rb +42 -26
  291. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  292. data/lib/sequel/plugins/constraint_validations.rb +20 -14
  293. data/lib/sequel/plugins/csv_serializer.rb +56 -35
  294. data/lib/sequel/plugins/dataset_associations.rb +40 -17
  295. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  296. data/lib/sequel/plugins/defaults_setter.rb +65 -10
  297. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  298. data/lib/sequel/plugins/dirty.rb +62 -24
  299. data/lib/sequel/plugins/eager_each.rb +3 -3
  300. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  301. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  302. data/lib/sequel/plugins/enum.rb +124 -0
  303. data/lib/sequel/plugins/error_splitter.rb +17 -12
  304. data/lib/sequel/plugins/finder.rb +246 -0
  305. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  306. data/lib/sequel/plugins/force_encoding.rb +7 -12
  307. data/lib/sequel/plugins/hook_class_methods.rb +37 -54
  308. data/lib/sequel/plugins/input_transformer.rb +18 -10
  309. data/lib/sequel/plugins/insert_conflict.rb +76 -0
  310. data/lib/sequel/plugins/insert_returning_select.rb +2 -2
  311. data/lib/sequel/plugins/instance_filters.rb +10 -8
  312. data/lib/sequel/plugins/instance_hooks.rb +34 -17
  313. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  314. data/lib/sequel/plugins/inverted_subsets.rb +22 -13
  315. data/lib/sequel/plugins/json_serializer.rb +124 -64
  316. data/lib/sequel/plugins/lazy_attributes.rb +21 -14
  317. data/lib/sequel/plugins/list.rb +35 -21
  318. data/lib/sequel/plugins/many_through_many.rb +134 -21
  319. data/lib/sequel/plugins/modification_detection.rb +15 -5
  320. data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
  321. data/lib/sequel/plugins/nested_attributes.rb +61 -31
  322. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  323. data/lib/sequel/plugins/pg_array_associations.rb +103 -53
  324. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
  325. data/lib/sequel/plugins/pg_row.rb +5 -51
  326. data/lib/sequel/plugins/prepared_statements.rb +60 -72
  327. data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
  328. data/lib/sequel/plugins/rcte_tree.rb +68 -82
  329. data/lib/sequel/plugins/require_valid_schema.rb +67 -0
  330. data/lib/sequel/plugins/serialization.rb +43 -46
  331. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
  332. data/lib/sequel/plugins/sharding.rb +15 -10
  333. data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
  334. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  335. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  336. data/lib/sequel/plugins/split_values.rb +11 -6
  337. data/lib/sequel/plugins/sql_comments.rb +189 -0
  338. data/lib/sequel/plugins/static_cache.rb +77 -53
  339. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  340. data/lib/sequel/plugins/string_stripper.rb +3 -3
  341. data/lib/sequel/plugins/subclasses.rb +43 -10
  342. data/lib/sequel/plugins/subset_conditions.rb +15 -5
  343. data/lib/sequel/plugins/table_select.rb +2 -2
  344. data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
  345. data/lib/sequel/plugins/throw_failures.rb +110 -0
  346. data/lib/sequel/plugins/timestamps.rb +20 -8
  347. data/lib/sequel/plugins/touch.rb +19 -8
  348. data/lib/sequel/plugins/tree.rb +62 -32
  349. data/lib/sequel/plugins/typecast_on_load.rb +12 -4
  350. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  351. data/lib/sequel/plugins/unused_associations.rb +521 -0
  352. data/lib/sequel/plugins/update_or_create.rb +4 -4
  353. data/lib/sequel/plugins/update_primary_key.rb +1 -1
  354. data/lib/sequel/plugins/update_refresh.rb +26 -15
  355. data/lib/sequel/plugins/uuid.rb +7 -11
  356. data/lib/sequel/plugins/validate_associated.rb +18 -0
  357. data/lib/sequel/plugins/validation_class_methods.rb +38 -19
  358. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  359. data/lib/sequel/plugins/validation_helpers.rb +57 -41
  360. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  361. data/lib/sequel/plugins/xml_serializer.rb +30 -31
  362. data/lib/sequel/sql.rb +471 -331
  363. data/lib/sequel/timezones.rb +78 -47
  364. data/lib/sequel/version.rb +7 -2
  365. data/lib/sequel.rb +1 -1
  366. metadata +217 -521
  367. data/Rakefile +0 -164
  368. data/doc/active_record.rdoc +0 -928
  369. data/doc/release_notes/1.0.txt +0 -38
  370. data/doc/release_notes/1.1.txt +0 -143
  371. data/doc/release_notes/1.3.txt +0 -101
  372. data/doc/release_notes/1.4.0.txt +0 -53
  373. data/doc/release_notes/1.5.0.txt +0 -155
  374. data/doc/release_notes/2.0.0.txt +0 -298
  375. data/doc/release_notes/2.1.0.txt +0 -271
  376. data/doc/release_notes/2.10.0.txt +0 -328
  377. data/doc/release_notes/2.11.0.txt +0 -215
  378. data/doc/release_notes/2.12.0.txt +0 -534
  379. data/doc/release_notes/2.2.0.txt +0 -253
  380. data/doc/release_notes/2.3.0.txt +0 -88
  381. data/doc/release_notes/2.4.0.txt +0 -106
  382. data/doc/release_notes/2.5.0.txt +0 -137
  383. data/doc/release_notes/2.6.0.txt +0 -157
  384. data/doc/release_notes/2.7.0.txt +0 -166
  385. data/doc/release_notes/2.8.0.txt +0 -171
  386. data/doc/release_notes/2.9.0.txt +0 -97
  387. data/doc/release_notes/3.0.0.txt +0 -221
  388. data/doc/release_notes/3.1.0.txt +0 -406
  389. data/doc/release_notes/3.10.0.txt +0 -286
  390. data/doc/release_notes/3.11.0.txt +0 -254
  391. data/doc/release_notes/3.12.0.txt +0 -304
  392. data/doc/release_notes/3.13.0.txt +0 -210
  393. data/doc/release_notes/3.14.0.txt +0 -118
  394. data/doc/release_notes/3.15.0.txt +0 -78
  395. data/doc/release_notes/3.16.0.txt +0 -45
  396. data/doc/release_notes/3.17.0.txt +0 -58
  397. data/doc/release_notes/3.18.0.txt +0 -120
  398. data/doc/release_notes/3.19.0.txt +0 -67
  399. data/doc/release_notes/3.2.0.txt +0 -268
  400. data/doc/release_notes/3.20.0.txt +0 -41
  401. data/doc/release_notes/3.21.0.txt +0 -87
  402. data/doc/release_notes/3.22.0.txt +0 -39
  403. data/doc/release_notes/3.23.0.txt +0 -172
  404. data/doc/release_notes/3.24.0.txt +0 -420
  405. data/doc/release_notes/3.25.0.txt +0 -88
  406. data/doc/release_notes/3.26.0.txt +0 -88
  407. data/doc/release_notes/3.27.0.txt +0 -82
  408. data/doc/release_notes/3.28.0.txt +0 -304
  409. data/doc/release_notes/3.29.0.txt +0 -459
  410. data/doc/release_notes/3.3.0.txt +0 -192
  411. data/doc/release_notes/3.30.0.txt +0 -135
  412. data/doc/release_notes/3.31.0.txt +0 -146
  413. data/doc/release_notes/3.32.0.txt +0 -202
  414. data/doc/release_notes/3.33.0.txt +0 -157
  415. data/doc/release_notes/3.34.0.txt +0 -671
  416. data/doc/release_notes/3.35.0.txt +0 -144
  417. data/doc/release_notes/3.36.0.txt +0 -245
  418. data/doc/release_notes/3.37.0.txt +0 -338
  419. data/doc/release_notes/3.38.0.txt +0 -234
  420. data/doc/release_notes/3.39.0.txt +0 -237
  421. data/doc/release_notes/3.4.0.txt +0 -325
  422. data/doc/release_notes/3.40.0.txt +0 -73
  423. data/doc/release_notes/3.41.0.txt +0 -155
  424. data/doc/release_notes/3.42.0.txt +0 -74
  425. data/doc/release_notes/3.43.0.txt +0 -105
  426. data/doc/release_notes/3.44.0.txt +0 -152
  427. data/doc/release_notes/3.45.0.txt +0 -179
  428. data/doc/release_notes/3.46.0.txt +0 -122
  429. data/doc/release_notes/3.47.0.txt +0 -270
  430. data/doc/release_notes/3.48.0.txt +0 -477
  431. data/doc/release_notes/3.5.0.txt +0 -510
  432. data/doc/release_notes/3.6.0.txt +0 -366
  433. data/doc/release_notes/3.7.0.txt +0 -179
  434. data/doc/release_notes/3.8.0.txt +0 -151
  435. data/doc/release_notes/3.9.0.txt +0 -233
  436. data/doc/release_notes/4.0.0.txt +0 -262
  437. data/doc/release_notes/4.1.0.txt +0 -85
  438. data/doc/release_notes/4.10.0.txt +0 -226
  439. data/doc/release_notes/4.11.0.txt +0 -147
  440. data/doc/release_notes/4.12.0.txt +0 -105
  441. data/doc/release_notes/4.13.0.txt +0 -169
  442. data/doc/release_notes/4.14.0.txt +0 -68
  443. data/doc/release_notes/4.15.0.txt +0 -56
  444. data/doc/release_notes/4.16.0.txt +0 -36
  445. data/doc/release_notes/4.17.0.txt +0 -38
  446. data/doc/release_notes/4.18.0.txt +0 -36
  447. data/doc/release_notes/4.19.0.txt +0 -45
  448. data/doc/release_notes/4.2.0.txt +0 -129
  449. data/doc/release_notes/4.20.0.txt +0 -79
  450. data/doc/release_notes/4.21.0.txt +0 -94
  451. data/doc/release_notes/4.22.0.txt +0 -72
  452. data/doc/release_notes/4.23.0.txt +0 -65
  453. data/doc/release_notes/4.24.0.txt +0 -99
  454. data/doc/release_notes/4.25.0.txt +0 -181
  455. data/doc/release_notes/4.26.0.txt +0 -44
  456. data/doc/release_notes/4.27.0.txt +0 -78
  457. data/doc/release_notes/4.28.0.txt +0 -57
  458. data/doc/release_notes/4.29.0.txt +0 -41
  459. data/doc/release_notes/4.3.0.txt +0 -40
  460. data/doc/release_notes/4.30.0.txt +0 -37
  461. data/doc/release_notes/4.31.0.txt +0 -57
  462. data/doc/release_notes/4.32.0.txt +0 -132
  463. data/doc/release_notes/4.33.0.txt +0 -88
  464. data/doc/release_notes/4.34.0.txt +0 -86
  465. data/doc/release_notes/4.35.0.txt +0 -130
  466. data/doc/release_notes/4.36.0.txt +0 -116
  467. data/doc/release_notes/4.4.0.txt +0 -92
  468. data/doc/release_notes/4.5.0.txt +0 -34
  469. data/doc/release_notes/4.6.0.txt +0 -30
  470. data/doc/release_notes/4.7.0.txt +0 -103
  471. data/doc/release_notes/4.8.0.txt +0 -175
  472. data/doc/release_notes/4.9.0.txt +0 -190
  473. data/lib/sequel/adapters/cubrid.rb +0 -144
  474. data/lib/sequel/adapters/do/mysql.rb +0 -66
  475. data/lib/sequel/adapters/do/postgres.rb +0 -44
  476. data/lib/sequel/adapters/do/sqlite3.rb +0 -42
  477. data/lib/sequel/adapters/do.rb +0 -158
  478. data/lib/sequel/adapters/jdbc/as400.rb +0 -84
  479. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
  480. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
  481. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
  482. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
  483. data/lib/sequel/adapters/odbc/progress.rb +0 -10
  484. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  485. data/lib/sequel/adapters/shared/firebird.rb +0 -247
  486. data/lib/sequel/adapters/shared/informix.rb +0 -54
  487. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
  488. data/lib/sequel/adapters/shared/progress.rb +0 -40
  489. data/lib/sequel/adapters/swift/mysql.rb +0 -49
  490. data/lib/sequel/adapters/swift/postgres.rb +0 -47
  491. data/lib/sequel/adapters/swift/sqlite.rb +0 -49
  492. data/lib/sequel/adapters/swift.rb +0 -160
  493. data/lib/sequel/adapters/utils/pg_types.rb +0 -70
  494. data/lib/sequel/dataset/mutation.rb +0 -111
  495. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
  496. data/lib/sequel/extensions/filter_having.rb +0 -63
  497. data/lib/sequel/extensions/hash_aliases.rb +0 -49
  498. data/lib/sequel/extensions/meta_def.rb +0 -35
  499. data/lib/sequel/extensions/query_literals.rb +0 -84
  500. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
  501. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
  502. data/lib/sequel/extensions/set_overrides.rb +0 -76
  503. data/lib/sequel/no_core_ext.rb +0 -3
  504. data/lib/sequel/plugins/association_autoreloading.rb +0 -9
  505. data/lib/sequel/plugins/identifier_columns.rb +0 -47
  506. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
  507. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
  508. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
  509. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
  510. data/lib/sequel/plugins/schema.rb +0 -82
  511. data/lib/sequel/plugins/scissors.rb +0 -35
  512. data/spec/adapter_spec.rb +0 -4
  513. data/spec/adapters/db2_spec.rb +0 -160
  514. data/spec/adapters/firebird_spec.rb +0 -411
  515. data/spec/adapters/informix_spec.rb +0 -100
  516. data/spec/adapters/mssql_spec.rb +0 -733
  517. data/spec/adapters/mysql_spec.rb +0 -1319
  518. data/spec/adapters/oracle_spec.rb +0 -313
  519. data/spec/adapters/postgres_spec.rb +0 -3790
  520. data/spec/adapters/spec_helper.rb +0 -49
  521. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  522. data/spec/adapters/sqlite_spec.rb +0 -688
  523. data/spec/bin_spec.rb +0 -258
  524. data/spec/core/connection_pool_spec.rb +0 -1045
  525. data/spec/core/database_spec.rb +0 -2636
  526. data/spec/core/dataset_spec.rb +0 -5175
  527. data/spec/core/deprecated_spec.rb +0 -70
  528. data/spec/core/expression_filters_spec.rb +0 -1247
  529. data/spec/core/mock_adapter_spec.rb +0 -464
  530. data/spec/core/object_graph_spec.rb +0 -303
  531. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  532. data/spec/core/schema_generator_spec.rb +0 -203
  533. data/spec/core/schema_spec.rb +0 -1676
  534. data/spec/core/spec_helper.rb +0 -34
  535. data/spec/core/version_spec.rb +0 -7
  536. data/spec/core_extensions_spec.rb +0 -699
  537. data/spec/core_model_spec.rb +0 -2
  538. data/spec/core_spec.rb +0 -1
  539. data/spec/extensions/accessed_columns_spec.rb +0 -51
  540. data/spec/extensions/active_model_spec.rb +0 -85
  541. data/spec/extensions/after_initialize_spec.rb +0 -24
  542. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  543. data/spec/extensions/association_dependencies_spec.rb +0 -117
  544. data/spec/extensions/association_pks_spec.rb +0 -405
  545. data/spec/extensions/association_proxies_spec.rb +0 -86
  546. data/spec/extensions/auto_validations_spec.rb +0 -192
  547. data/spec/extensions/before_after_save_spec.rb +0 -40
  548. data/spec/extensions/blacklist_security_spec.rb +0 -88
  549. data/spec/extensions/blank_spec.rb +0 -69
  550. data/spec/extensions/boolean_readers_spec.rb +0 -93
  551. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  552. data/spec/extensions/caching_spec.rb +0 -270
  553. data/spec/extensions/class_table_inheritance_spec.rb +0 -444
  554. data/spec/extensions/column_conflicts_spec.rb +0 -60
  555. data/spec/extensions/column_select_spec.rb +0 -108
  556. data/spec/extensions/columns_introspection_spec.rb +0 -91
  557. data/spec/extensions/composition_spec.rb +0 -242
  558. data/spec/extensions/connection_expiration_spec.rb +0 -121
  559. data/spec/extensions/connection_validator_spec.rb +0 -127
  560. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
  561. data/spec/extensions/constraint_validations_spec.rb +0 -389
  562. data/spec/extensions/core_refinements_spec.rb +0 -519
  563. data/spec/extensions/csv_serializer_spec.rb +0 -180
  564. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  565. data/spec/extensions/dataset_associations_spec.rb +0 -343
  566. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  567. data/spec/extensions/date_arithmetic_spec.rb +0 -167
  568. data/spec/extensions/defaults_setter_spec.rb +0 -102
  569. data/spec/extensions/delay_add_association_spec.rb +0 -74
  570. data/spec/extensions/dirty_spec.rb +0 -180
  571. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
  572. data/spec/extensions/eager_each_spec.rb +0 -66
  573. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  574. data/spec/extensions/error_splitter_spec.rb +0 -18
  575. data/spec/extensions/error_sql_spec.rb +0 -20
  576. data/spec/extensions/eval_inspect_spec.rb +0 -73
  577. data/spec/extensions/filter_having_spec.rb +0 -40
  578. data/spec/extensions/force_encoding_spec.rb +0 -114
  579. data/spec/extensions/from_block_spec.rb +0 -21
  580. data/spec/extensions/graph_each_spec.rb +0 -119
  581. data/spec/extensions/hash_aliases_spec.rb +0 -24
  582. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  583. data/spec/extensions/identifier_columns_spec.rb +0 -17
  584. data/spec/extensions/inflector_spec.rb +0 -183
  585. data/spec/extensions/input_transformer_spec.rb +0 -54
  586. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  587. data/spec/extensions/instance_filters_spec.rb +0 -79
  588. data/spec/extensions/instance_hooks_spec.rb +0 -276
  589. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  590. data/spec/extensions/json_serializer_spec.rb +0 -304
  591. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  592. data/spec/extensions/list_spec.rb +0 -278
  593. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  594. data/spec/extensions/many_through_many_spec.rb +0 -2172
  595. data/spec/extensions/meta_def_spec.rb +0 -21
  596. data/spec/extensions/migration_spec.rb +0 -728
  597. data/spec/extensions/modification_detection_spec.rb +0 -80
  598. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  599. data/spec/extensions/named_timezones_spec.rb +0 -108
  600. data/spec/extensions/nested_attributes_spec.rb +0 -697
  601. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -65
  602. data/spec/extensions/null_dataset_spec.rb +0 -85
  603. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  604. data/spec/extensions/pagination_spec.rb +0 -118
  605. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  606. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  607. data/spec/extensions/pg_array_spec.rb +0 -390
  608. data/spec/extensions/pg_enum_spec.rb +0 -92
  609. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  610. data/spec/extensions/pg_hstore_spec.rb +0 -206
  611. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  612. data/spec/extensions/pg_inet_spec.rb +0 -52
  613. data/spec/extensions/pg_interval_spec.rb +0 -76
  614. data/spec/extensions/pg_json_ops_spec.rb +0 -275
  615. data/spec/extensions/pg_json_spec.rb +0 -218
  616. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  617. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  618. data/spec/extensions/pg_range_spec.rb +0 -473
  619. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  620. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  621. data/spec/extensions/pg_row_spec.rb +0 -360
  622. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  623. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  624. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  625. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  626. data/spec/extensions/prepared_statements_spec.rb +0 -103
  627. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  628. data/spec/extensions/pretty_table_spec.rb +0 -92
  629. data/spec/extensions/query_literals_spec.rb +0 -183
  630. data/spec/extensions/query_spec.rb +0 -102
  631. data/spec/extensions/rcte_tree_spec.rb +0 -392
  632. data/spec/extensions/round_timestamps_spec.rb +0 -43
  633. data/spec/extensions/schema_caching_spec.rb +0 -41
  634. data/spec/extensions/schema_dumper_spec.rb +0 -814
  635. data/spec/extensions/schema_spec.rb +0 -117
  636. data/spec/extensions/scissors_spec.rb +0 -26
  637. data/spec/extensions/select_remove_spec.rb +0 -38
  638. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  639. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  640. data/spec/extensions/serialization_spec.rb +0 -362
  641. data/spec/extensions/server_block_spec.rb +0 -90
  642. data/spec/extensions/server_logging_spec.rb +0 -45
  643. data/spec/extensions/set_overrides_spec.rb +0 -61
  644. data/spec/extensions/sharding_spec.rb +0 -198
  645. data/spec/extensions/shared_caching_spec.rb +0 -175
  646. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  647. data/spec/extensions/singular_table_names_spec.rb +0 -22
  648. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  649. data/spec/extensions/spec_helper.rb +0 -71
  650. data/spec/extensions/split_array_nil_spec.rb +0 -24
  651. data/spec/extensions/split_values_spec.rb +0 -22
  652. data/spec/extensions/sql_comments_spec.rb +0 -27
  653. data/spec/extensions/sql_expr_spec.rb +0 -60
  654. data/spec/extensions/static_cache_spec.rb +0 -361
  655. data/spec/extensions/string_agg_spec.rb +0 -85
  656. data/spec/extensions/string_date_time_spec.rb +0 -95
  657. data/spec/extensions/string_stripper_spec.rb +0 -68
  658. data/spec/extensions/subclasses_spec.rb +0 -66
  659. data/spec/extensions/subset_conditions_spec.rb +0 -38
  660. data/spec/extensions/table_select_spec.rb +0 -71
  661. data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
  662. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  663. data/spec/extensions/timestamps_spec.rb +0 -175
  664. data/spec/extensions/to_dot_spec.rb +0 -154
  665. data/spec/extensions/touch_spec.rb +0 -203
  666. data/spec/extensions/tree_spec.rb +0 -274
  667. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  668. data/spec/extensions/unlimited_update_spec.rb +0 -20
  669. data/spec/extensions/update_or_create_spec.rb +0 -87
  670. data/spec/extensions/update_primary_key_spec.rb +0 -100
  671. data/spec/extensions/update_refresh_spec.rb +0 -53
  672. data/spec/extensions/uuid_spec.rb +0 -106
  673. data/spec/extensions/validate_associated_spec.rb +0 -52
  674. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  675. data/spec/extensions/validation_helpers_spec.rb +0 -554
  676. data/spec/extensions/xml_serializer_spec.rb +0 -207
  677. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  678. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  679. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  680. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  681. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  682. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  683. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  684. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  685. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  686. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  687. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  688. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  689. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  690. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  691. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  692. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  693. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  694. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  695. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  696. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  697. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  698. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  699. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  700. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  701. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  702. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  703. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  704. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  705. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  706. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  707. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  708. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  709. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  710. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  711. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  712. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  713. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  714. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  715. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  716. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  717. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  718. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  719. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  720. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  721. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  722. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  723. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  724. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  725. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  726. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  727. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  728. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  729. data/spec/guards_helper.rb +0 -55
  730. data/spec/integration/associations_test.rb +0 -2506
  731. data/spec/integration/database_test.rb +0 -113
  732. data/spec/integration/dataset_test.rb +0 -1858
  733. data/spec/integration/eager_loader_test.rb +0 -687
  734. data/spec/integration/migrator_test.rb +0 -262
  735. data/spec/integration/model_test.rb +0 -230
  736. data/spec/integration/plugin_test.rb +0 -2297
  737. data/spec/integration/prepared_statement_test.rb +0 -467
  738. data/spec/integration/schema_test.rb +0 -815
  739. data/spec/integration/spec_helper.rb +0 -56
  740. data/spec/integration/timezone_test.rb +0 -86
  741. data/spec/integration/transaction_test.rb +0 -406
  742. data/spec/integration/type_test.rb +0 -133
  743. data/spec/model/association_reflection_spec.rb +0 -565
  744. data/spec/model/associations_spec.rb +0 -4589
  745. data/spec/model/base_spec.rb +0 -759
  746. data/spec/model/class_dataset_methods_spec.rb +0 -150
  747. data/spec/model/dataset_methods_spec.rb +0 -149
  748. data/spec/model/eager_loading_spec.rb +0 -2197
  749. data/spec/model/hooks_spec.rb +0 -604
  750. data/spec/model/inflector_spec.rb +0 -26
  751. data/spec/model/model_spec.rb +0 -1097
  752. data/spec/model/plugins_spec.rb +0 -299
  753. data/spec/model/record_spec.rb +0 -2162
  754. data/spec/model/spec_helper.rb +0 -46
  755. data/spec/model/validations_spec.rb +0 -193
  756. data/spec/model_no_assoc_spec.rb +0 -1
  757. data/spec/model_spec.rb +0 -1
  758. data/spec/plugin_spec.rb +0 -1
  759. data/spec/sequel_coverage.rb +0 -15
  760. data/spec/spec_config.rb +0 -10
@@ -32,7 +32,7 @@
32
32
  #
33
33
  # So if you want to insert an array into an integer[] database column:
34
34
  #
35
- # DB[:table].insert(:column=>Sequel.pg_array([1, 2, 3]))
35
+ # DB[:table].insert(column: Sequel.pg_array([1, 2, 3]))
36
36
  #
37
37
  # To use this extension, first load it into your Sequel::Database instance:
38
38
  #
@@ -45,12 +45,10 @@
45
45
  # all scalar types that the native postgres adapter handles. It
46
46
  # also makes it easy to add support for other array types. In
47
47
  # general, you just need to make sure that the scalar type is
48
- # handled and has the appropriate converter installed in
49
- # Sequel::Postgres::PG_TYPES or the Database instance's
50
- # conversion_procs usingthe appropriate type OID. For user defined
48
+ # handled and has the appropriate converter installed. For user defined
51
49
  # types, you can do this via:
52
50
  #
53
- # DB.conversion_procs[scalar_type_oid] = lambda{|string| }
51
+ # DB.add_conversion_proc(scalar_type_oid){|string| }
54
52
  #
55
53
  # Then you can call
56
54
  # Sequel::Postgres::PGArray::DatabaseMethods#register_array_type
@@ -60,18 +58,6 @@
60
58
  #
61
59
  # DB.register_array_type('foo')
62
60
  #
63
- # You can also register array types on a global basis using
64
- # Sequel::Postgres::PGArray.register. In this case, you'll have
65
- # to specify the type oids:
66
- #
67
- # Sequel::Postgres::PG_TYPES[1234] = lambda{|string| }
68
- # Sequel::Postgres::PGArray.register('foo', :oid=>4321, :scalar_oid=>1234)
69
- #
70
- # Both Sequel::Postgres::PGArray::DatabaseMethods#register_array_type
71
- # and Sequel::Postgres::PGArray.register support many options to
72
- # customize the array type handling. See the Sequel::Postgres::PGArray.register
73
- # method documentation.
74
- #
75
61
  # While this extension can parse PostgreSQL arrays with explicit bounds, it
76
62
  # currently ignores explicit bounds, so such values do not round
77
63
  # trip.
@@ -79,13 +65,12 @@
79
65
  # If you want an easy way to call PostgreSQL array functions and
80
66
  # operators, look into the pg_array_ops extension.
81
67
  #
82
- # This extension requires the strscan and delegate libraries.
68
+ # This extension requires the delegate library, and the strscan library
69
+ # sequel_pg has not been loaded.
83
70
  #
84
71
  # Related module: Sequel::Postgres::PGArray
85
72
 
86
73
  require 'delegate'
87
- require 'strscan'
88
- Sequel.require 'adapters/utils/pg_types'
89
74
 
90
75
  module Sequel
91
76
  module Postgres
@@ -93,122 +78,64 @@ module Sequel
93
78
  class PGArray < DelegateClass(Array)
94
79
  include Sequel::SQL::AliasMethods
95
80
 
96
- ARRAY = "ARRAY".freeze
97
- DOUBLE_COLON = '::'.freeze
98
- EMPTY_ARRAY = "'{}'".freeze
99
- EMPTY_BRACKET = '[]'.freeze
100
- OPEN_BRACKET = '['.freeze
101
- CLOSE_BRACKET = ']'.freeze
102
- COMMA = ','.freeze
103
- BACKSLASH = '\\'.freeze
104
- EMPTY_STRING = ''.freeze
105
- OPEN_BRACE = '{'.freeze
106
- CLOSE_BRACE = '}'.freeze
107
- NULL = 'NULL'.freeze
108
- QUOTE = '"'.freeze
109
-
110
- # Global hash of database array type name strings to symbols (e.g. 'double precision' => :float),
111
- # used by the schema parsing for array types registered globally.
112
- ARRAY_TYPES = {}
113
-
114
- # Registers an array type that the extension should handle. Makes a Database instance that
115
- # has been extended with DatabaseMethods recognize the array type given and set up the
116
- # appropriate typecasting. Also sets up automatic typecasting for the native postgres
117
- # adapter, so that on retrieval, the values are automatically converted to PGArray instances.
118
- # The db_type argument should be the exact database type used (as returned by the PostgreSQL
119
- # format_type database function). Accepts the following options:
120
- #
121
- # :array_type :: The type to automatically cast the array to when literalizing the array.
122
- # Usually the same as db_type.
123
- # :converter :: A callable object (e.g. Proc), that is called with each element of the array
124
- # (usually a string), and should return the appropriate typecasted object.
125
- # :oid :: The PostgreSQL OID for the array type. This is used by the Sequel postgres adapter
126
- # to set up automatic type conversion on retrieval from the database.
127
- # :scalar_oid :: Should be the PostgreSQL OID for the scalar version of this array type. If given,
128
- # automatically sets the :converter option by looking for scalar conversion
129
- # proc.
130
- # :scalar_typecast :: Should be a symbol indicating the typecast method that should be called on
131
- # each element of the array, when a plain array is passed into a database
132
- # typecast method. For example, for an array of integers, this could be set to
133
- # :integer, so that the typecast_value_integer method is called on all of the
134
- # array elements. Defaults to :type_symbol option.
135
- # :type_procs :: A hash mapping oids to conversion procs, used for looking up the :scalar_oid and
136
- # value and setting the :oid value. Defaults to the global Sequel::Postgres::PG_TYPES.
137
- # :type_symbol :: The base of the schema type symbol for this type. For example, if you provide
138
- # :integer, Sequel will recognize this type as :integer_array during schema parsing.
139
- # Defaults to the db_type argument.
140
- # :typecast_method_map :: The map in which to place the database type string to type symbol mapping.
141
- # Defaults to ARRAY_TYPES.
142
- # :typecast_methods_module :: If given, a module object to add the typecasting method to. Defaults
143
- # to DatabaseMethods.
144
- #
145
- # If a block is given, it is treated as the :converter option.
146
- def self.register(db_type, opts=OPTS, &block)
147
- db_type = db_type.to_s
148
- type = (opts[:type_symbol] || db_type).to_sym
149
- type_procs = opts[:type_procs] || PG_TYPES
150
- mod = opts[:typecast_methods_module] || DatabaseMethods
151
- typecast_method_map = opts[:typecast_method_map] || ARRAY_TYPES
152
-
153
- if converter = opts[:converter]
154
- raise Error, "can't provide both a block and :converter option to register" if block
155
- else
156
- converter = block
157
- end
158
-
159
- if soid = opts[:scalar_oid]
160
- raise Error, "can't provide both a converter and :scalar_oid option to register" if converter
161
- converter = type_procs[soid]
162
- end
163
-
164
- array_type = (opts[:array_type] || db_type).to_s.dup.freeze
165
- creator = Creator.new(array_type, converter)
166
-
167
- typecast_method_map[db_type] = :"#{type}_array"
168
-
169
- define_array_typecast_method(mod, type, creator, opts.fetch(:scalar_typecast, type))
170
-
171
- if oid = opts[:oid]
172
- type_procs[oid] = creator
173
- end
174
-
175
- nil
176
- end
177
-
178
- # Define a private array typecasting method in the given module for the given type that uses
179
- # the creator argument to do the type conversion.
180
- def self.define_array_typecast_method(mod, type, creator, scalar_typecast)
181
- mod.class_eval do
182
- meth = :"typecast_value_#{type}_array"
183
- scalar_typecast_method = :"typecast_value_#{scalar_typecast}"
184
- define_method(meth){|v| typecast_value_pg_array(v, creator, scalar_typecast_method)}
185
- private meth
186
- end
187
- end
188
- private_class_method :define_array_typecast_method
189
-
190
81
  module DatabaseMethods
191
- APOS = "'".freeze
192
- DOUBLE_APOS = "''".freeze
193
- ESCAPE_RE = /("|\\)/.freeze
194
- ESCAPE_REPLACEMENT = '\\\\\1'.freeze
195
82
  BLOB_RANGE = 1...-1
196
83
 
197
84
  # Create the local hash of database type strings to schema type symbols,
198
85
  # used for array types local to this database.
199
86
  def self.extended(db)
200
- db.instance_eval do
87
+ db.instance_exec do
201
88
  @pg_array_schema_types ||= {}
202
- procs = conversion_procs
203
- procs[1115] = Creator.new("timestamp without time zone", procs[1114])
204
- procs[1185] = Creator.new("timestamp with time zone", procs[1184])
205
- copy_conversion_procs([143, 791, 1000, 1001, 1003, 1005, 1006, 1007, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1021, 1022, 1028, 1182, 1183, 1231, 1270, 1561, 1563, 2951])
89
+ register_array_type('timestamp without time zone', :oid=>1115, :scalar_oid=>1114, :type_symbol=>:datetime)
90
+ register_array_type('timestamp with time zone', :oid=>1185, :scalar_oid=>1184, :type_symbol=>:datetime_timezone, :scalar_typecast=>:datetime)
91
+
92
+ register_array_type('text', :oid=>1009, :scalar_oid=>25, :type_symbol=>:string)
93
+ register_array_type('integer', :oid=>1007, :scalar_oid=>23)
94
+ register_array_type('bigint', :oid=>1016, :scalar_oid=>20, :scalar_typecast=>:integer)
95
+ register_array_type('numeric', :oid=>1231, :scalar_oid=>1700, :type_symbol=>:decimal)
96
+ register_array_type('double precision', :oid=>1022, :scalar_oid=>701, :type_symbol=>:float)
97
+
98
+ register_array_type('boolean', :oid=>1000, :scalar_oid=>16)
99
+ register_array_type('bytea', :oid=>1001, :scalar_oid=>17, :type_symbol=>:blob)
100
+ register_array_type('date', :oid=>1182, :scalar_oid=>1082)
101
+ register_array_type('time without time zone', :oid=>1183, :scalar_oid=>1083, :type_symbol=>:time)
102
+ register_array_type('time with time zone', :oid=>1270, :scalar_oid=>1266, :type_symbol=>:time_timezone, :scalar_typecast=>:time)
103
+
104
+ register_array_type('smallint', :oid=>1005, :scalar_oid=>21, :scalar_typecast=>:integer)
105
+ register_array_type('oid', :oid=>1028, :scalar_oid=>26, :scalar_typecast=>:integer)
106
+ register_array_type('real', :oid=>1021, :scalar_oid=>700, :scalar_typecast=>:float)
107
+ register_array_type('character', :oid=>1014, :converter=>nil, :array_type=>:text, :scalar_typecast=>:string)
108
+ register_array_type('character varying', :oid=>1015, :converter=>nil, :scalar_typecast=>:string, :type_symbol=>:varchar)
109
+
110
+ register_array_type('xml', :oid=>143, :scalar_oid=>142)
111
+ register_array_type('money', :oid=>791, :scalar_oid=>790)
112
+ register_array_type('bit', :oid=>1561, :scalar_oid=>1560)
113
+ register_array_type('bit varying', :oid=>1563, :scalar_oid=>1562, :type_symbol=>:varbit)
114
+ register_array_type('uuid', :oid=>2951, :scalar_oid=>2950)
115
+
116
+ register_array_type('xid', :oid=>1011, :scalar_oid=>28)
117
+ register_array_type('cid', :oid=>1012, :scalar_oid=>29)
118
+
119
+ register_array_type('name', :oid=>1003, :scalar_oid=>19)
120
+ register_array_type('tid', :oid=>1010, :scalar_oid=>27)
121
+ register_array_type('int2vector', :oid=>1006, :scalar_oid=>22)
122
+ register_array_type('oidvector', :oid=>1013, :scalar_oid=>30)
123
+
206
124
  [:string_array, :integer_array, :decimal_array, :float_array, :boolean_array, :blob_array, :date_array, :time_array, :datetime_array].each do |v|
207
125
  @schema_type_classes[v] = PGArray
208
126
  end
209
127
  end
210
128
  end
211
129
 
130
+ def add_named_conversion_proc(name, &block)
131
+ ret = super
132
+ name = name.to_s if name.is_a?(Symbol)
133
+ from(:pg_type).where(:typname=>name).select_map([:oid, :typarray]).each do |scalar_oid, array_oid|
134
+ register_array_type(name, :oid=>array_oid.to_i, :scalar_oid=>scalar_oid.to_i)
135
+ end
136
+ ret
137
+ end
138
+
212
139
  # Handle arrays in bound variables
213
140
  def bound_variable_arg(arg, conn)
214
141
  case arg
@@ -221,25 +148,76 @@ module Sequel
221
148
  end
222
149
  end
223
150
 
224
- # Register a database specific array type. This can be used to support
225
- # different array types per Database. Use of this method does not
226
- # affect global state, unlike PGArray.register. See PGArray.register for
227
- # possible options.
151
+ # Freeze the pg array schema types to prevent adding new ones.
152
+ def freeze
153
+ @pg_array_schema_types.freeze
154
+ super
155
+ end
156
+
157
+ # Register a database specific array type. Options:
158
+ #
159
+ # :array_type :: The type to automatically cast the array to when literalizing the array.
160
+ # Usually the same as db_type.
161
+ # :converter :: A callable object (e.g. Proc), that is called with each element of the array
162
+ # (usually a string), and should return the appropriate typecasted object.
163
+ # :oid :: The PostgreSQL OID for the array type. This is used by the Sequel postgres adapter
164
+ # to set up automatic type conversion on retrieval from the database.
165
+ # :scalar_oid :: Should be the PostgreSQL OID for the scalar version of this array type. If given,
166
+ # automatically sets the :converter option by looking for scalar conversion
167
+ # proc.
168
+ # :scalar_typecast :: Should be a symbol indicating the typecast method that should be called on
169
+ # each element of the array, when a plain array is passed into a database
170
+ # typecast method. For example, for an array of integers, this could be set to
171
+ # :integer, so that the typecast_value_integer method is called on all of the
172
+ # array elements. Defaults to :type_symbol option.
173
+ # :type_symbol :: The base of the schema type symbol for this type. For example, if you provide
174
+ # :integer, Sequel will recognize this type as :integer_array during schema parsing.
175
+ # Defaults to the db_type argument.
176
+ #
177
+ # If a block is given, it is treated as the :converter option.
228
178
  def register_array_type(db_type, opts=OPTS, &block)
229
- opts = {:type_procs=>conversion_procs, :typecast_method_map=>@pg_array_schema_types, :typecast_methods_module=>(class << self; self; end)}.merge!(opts)
230
- unless (opts.has_key?(:scalar_oid) || block) && opts.has_key?(:oid)
179
+ oid = opts[:oid]
180
+ soid = opts[:scalar_oid]
181
+
182
+ if has_converter = opts.has_key?(:converter)
183
+ raise Error, "can't provide both a block and :converter option to register_array_type" if block
184
+ converter = opts[:converter]
185
+ else
186
+ has_converter = true if block
187
+ converter = block
188
+ end
189
+
190
+ unless (soid || has_converter) && oid
231
191
  array_oid, scalar_oid = from(:pg_type).where(:typname=>db_type.to_s).get([:typarray, :oid])
232
- opts[:scalar_oid] = scalar_oid unless opts.has_key?(:scalar_oid) || block
233
- opts[:oid] = array_oid unless opts.has_key?(:oid)
192
+ soid ||= scalar_oid unless has_converter
193
+ oid ||= array_oid
234
194
  end
235
- PGArray.register(db_type, opts, &block)
236
- @schema_type_classes[:"#{opts[:type_symbol] || db_type}_array"] = PGArray
237
- conversion_procs_updated
238
- end
239
195
 
240
- # Return PGArray if this type matches any supported array type.
241
- def schema_type_class(type)
242
- super || (ARRAY_TYPES.each_value{|v| return PGArray if type == v}; nil)
196
+ db_type = db_type.to_s
197
+ type = (opts[:type_symbol] || db_type).to_sym
198
+ typecast_method_map = @pg_array_schema_types
199
+
200
+ if soid
201
+ raise Error, "can't provide both a converter and :scalar_oid option to register" if has_converter
202
+ converter = conversion_procs[soid]
203
+ end
204
+
205
+ array_type = (opts[:array_type] || db_type).to_s.dup.freeze
206
+ creator = Creator.new(array_type, converter)
207
+ add_conversion_proc(oid, creator)
208
+
209
+ typecast_method_map[db_type] = :"#{type}_array"
210
+
211
+ singleton_class.class_eval do
212
+ meth = :"typecast_value_#{type}_array"
213
+ scalar_typecast_method = :"typecast_value_#{opts.fetch(:scalar_typecast, type)}"
214
+ define_method(meth){|v| typecast_value_pg_array(v, creator, scalar_typecast_method)}
215
+ private meth
216
+ alias_method(meth, meth)
217
+ end
218
+
219
+ @schema_type_classes[:"#{type}_array"] = PGArray
220
+ nil
243
221
  end
244
222
 
245
223
  private
@@ -248,46 +226,23 @@ module Sequel
248
226
  def bound_variable_array(a)
249
227
  case a
250
228
  when Array
251
- "{#{a.map{|i| bound_variable_array(i)}.join(COMMA)}}"
229
+ "{#{a.map{|i| bound_variable_array(i)}.join(',')}}"
252
230
  when Sequel::SQL::Blob
253
- "\"#{literal(a)[BLOB_RANGE].gsub(DOUBLE_APOS, APOS).gsub(ESCAPE_RE, ESCAPE_REPLACEMENT)}\""
231
+ "\"#{literal(a)[BLOB_RANGE].gsub("''", "'").gsub(/("|\\)/, '\\\\\1')}\""
254
232
  when Sequel::LiteralString
255
233
  a
256
234
  when String
257
- "\"#{a.gsub(ESCAPE_RE, ESCAPE_REPLACEMENT)}\""
235
+ "\"#{a.gsub(/("|\\)/, '\\\\\1')}\""
258
236
  else
259
237
  literal(a)
260
238
  end
261
239
  end
262
240
 
263
- # Automatically handle array types for the given named types.
264
- def convert_named_procs_to_procs(named_procs)
265
- h = super
266
- unless h.empty?
267
- from(:pg_type).where(:oid=>h.keys).select_map([:typname, :oid, :typarray]).each do |name, scalar_oid, array_oid|
268
- register_array_type(name, :type_procs=>h, :oid=>array_oid.to_i, :scalar_oid=>scalar_oid.to_i)
269
- end
270
- end
271
- h
272
- end
273
-
274
- # Manually override the typecasting for timestamp array types so that
275
- # they use the database's timezone instead of the global Sequel
276
- # timezone.
277
- def get_conversion_procs
278
- procs = super
279
-
280
- procs[1115] = Creator.new("timestamp without time zone", procs[1114])
281
- procs[1185] = Creator.new("timestamp with time zone", procs[1184])
282
-
283
- procs
284
- end
285
-
286
241
  # Look into both the current database's array schema types and the global
287
242
  # array schema types to get the type symbol for the given database type
288
243
  # string.
289
244
  def pg_array_schema_type(type)
290
- @pg_array_schema_types[type] || ARRAY_TYPES[type]
245
+ @pg_array_schema_types[type]
291
246
  end
292
247
 
293
248
  # Make the column type detection handle registered array types.
@@ -299,6 +254,17 @@ module Sequel
299
254
  end
300
255
  end
301
256
 
257
+ # Set the :callable_default value if the default value is recognized as an empty array.
258
+ def schema_post_process(_)
259
+ super.each do |a|
260
+ h = a[1]
261
+ if h[:default] =~ /\A(?:'\{\}'|ARRAY\[\])::([\w ]+)\[\]\z/
262
+ type = $1.freeze
263
+ h[:callable_default] = lambda{Sequel.pg_array([], type)}
264
+ end
265
+ end
266
+ end
267
+
302
268
  # Convert ruby arrays to PostgreSQL arrays when used as default values.
303
269
  def column_definition_default_sql(sql, column)
304
270
  if (d = column[:default]) && d.is_a?(Array) && !Sequel.condition_specifier?(d)
@@ -335,97 +301,101 @@ module Sequel
335
301
  end
336
302
  end
337
303
 
338
- # PostgreSQL array parser that handles PostgreSQL array output format.
339
- # Note that does not handle all forms out input that PostgreSQL will
340
- # accept, and it will not raise an error for all forms of invalid input.
341
- class Parser < StringScanner
342
- UNQUOTED_RE = /[{}",]|[^{}",]+/
343
- QUOTED_RE = /["\\]|[^"\\]+/
344
- NULL_RE = /NULL",/
345
- OPEN_RE = /((\[\d+:\d+\])+=)?\{/
346
-
347
- # Set the source for the input, and any converter callable
348
- # to call with objects to be created. For nested parsers
349
- # the source may contain text after the end current parse,
350
- # which will be ignored.
351
- def initialize(source, converter=nil)
352
- super(source)
353
- @converter = converter
354
- @stack = [[]]
355
- @recorded = String.new
356
- end
304
+ unless Sequel::Postgres.respond_to?(:parse_pg_array)
305
+ require 'strscan'
306
+
307
+ # PostgreSQL array parser that handles PostgreSQL array output format.
308
+ # Note that does not handle all forms out input that PostgreSQL will
309
+ # accept, and it will not raise an error for all forms of invalid input.
310
+ class Parser < StringScanner
311
+ # Set the source for the input, and any converter callable
312
+ # to call with objects to be created. For nested parsers
313
+ # the source may contain text after the end current parse,
314
+ # which will be ignored.
315
+ def initialize(source, converter=nil)
316
+ super(source)
317
+ @converter = converter
318
+ @stack = [[]]
319
+ @encoding = string.encoding
320
+ @recorded = String.new.force_encoding(@encoding)
321
+ end
357
322
 
358
- # Take the buffer of recorded characters and add it to the array
359
- # of entries, and use a new buffer for recorded characters.
360
- def new_entry(include_empty=false)
361
- if !@recorded.empty? || include_empty
362
- entry = @recorded
363
- if entry == NULL && !include_empty
364
- entry = nil
365
- elsif @converter
366
- entry = @converter.call(entry)
323
+ # Take the buffer of recorded characters and add it to the array
324
+ # of entries, and use a new buffer for recorded characters.
325
+ def new_entry(include_empty=false)
326
+ if !@recorded.empty? || include_empty
327
+ entry = @recorded
328
+ if entry == 'NULL' && !include_empty
329
+ entry = nil
330
+ elsif @converter
331
+ entry = @converter.call(entry)
332
+ end
333
+ @stack.last.push(entry)
334
+ @recorded = String.new.force_encoding(@encoding)
367
335
  end
368
- @stack.last.push(entry)
369
- @recorded = String.new
370
336
  end
371
- end
372
337
 
373
- # Parse the input character by character, returning an array
374
- # of parsed (and potentially converted) objects.
375
- def parse
376
- raise Sequel::Error, "invalid array, empty string" if eos?
377
- raise Sequel::Error, "invalid array, doesn't start with {" unless scan(OPEN_RE)
378
-
379
- while !eos?
380
- char = scan(UNQUOTED_RE)
381
- if char == COMMA
382
- # Comma outside quoted string indicates end of current entry
383
- new_entry
384
- elsif char == QUOTE
385
- raise Sequel::Error, "invalid array, opening quote with existing recorded data" unless @recorded.empty?
386
- while true
387
- char = scan(QUOTED_RE)
388
- if char == BACKSLASH
389
- @recorded << getch
390
- elsif char == QUOTE
391
- n = peek(1)
392
- raise Sequel::Error, "invalid array, closing quote not followed by comma or closing brace" unless n == COMMA || n == CLOSE_BRACE
393
- break
338
+ # Parse the input character by character, returning an array
339
+ # of parsed (and potentially converted) objects.
340
+ def parse
341
+ raise Sequel::Error, "invalid array, empty string" if eos?
342
+ raise Sequel::Error, "invalid array, doesn't start with {" unless scan(/((\[\d+:\d+\])+=)?\{/)
343
+
344
+ # :nocov:
345
+ while !eos?
346
+ # :nocov:
347
+ char = scan(/[{}",]|[^{}",]+/)
348
+ if char == ','
349
+ # Comma outside quoted string indicates end of current entry
350
+ new_entry
351
+ elsif char == '"'
352
+ raise Sequel::Error, "invalid array, opening quote with existing recorded data" unless @recorded.empty?
353
+ # :nocov:
354
+ while true
355
+ # :nocov:
356
+ char = scan(/["\\]|[^"\\]+/)
357
+ if char == '\\'
358
+ @recorded << getch
359
+ elsif char == '"'
360
+ n = peek(1)
361
+ raise Sequel::Error, "invalid array, closing quote not followed by comma or closing brace" unless n == ',' || n == '}'
362
+ break
363
+ else
364
+ @recorded << char
365
+ end
366
+ end
367
+ new_entry(true)
368
+ elsif char == '{'
369
+ raise Sequel::Error, "invalid array, opening brace with existing recorded data" unless @recorded.empty?
370
+
371
+ # Start of new array, add it to the stack
372
+ new = []
373
+ @stack.last << new
374
+ @stack << new
375
+ elsif char == '}'
376
+ # End of current array, add current entry to the current array
377
+ new_entry
378
+
379
+ if @stack.length == 1
380
+ raise Sequel::Error, "array parsing finished without parsing entire string" unless eos?
381
+
382
+ # Top level of array, parsing should be over.
383
+ # Pop current array off stack and return it as result
384
+ return @stack.pop
394
385
  else
395
- @recorded << char
386
+ # Nested array, pop current array off stack
387
+ @stack.pop
396
388
  end
397
- end
398
- new_entry(true)
399
- elsif char == OPEN_BRACE
400
- raise Sequel::Error, "invalid array, opening brace with existing recorded data" unless @recorded.empty?
401
-
402
- # Start of new array, add it to the stack
403
- new = []
404
- @stack.last << new
405
- @stack << new
406
- elsif char == CLOSE_BRACE
407
- # End of current array, add current entry to the current array
408
- new_entry
409
-
410
- if @stack.length == 1
411
- raise Sequel::Error, "array parsing finished without parsing entire string" unless eos?
412
-
413
- # Top level of array, parsing should be over.
414
- # Pop current array off stack and return it as result
415
- return @stack.pop
416
389
  else
417
- # Nested array, pop current array off stack
418
- @stack.pop
390
+ # Add the character to the recorded character buffer.
391
+ @recorded << char
419
392
  end
420
- else
421
- # Add the character to the recorded character buffer.
422
- @recorded << char
423
393
  end
424
- end
425
394
 
426
- raise Sequel::Error, "array parsing finished with array unclosed"
395
+ raise Sequel::Error, "array parsing finished with array unclosed"
396
+ end
427
397
  end
428
- end unless Sequel::Postgres.respond_to?(:parse_pg_array)
398
+ end
429
399
 
430
400
  # Callable object that takes the input string and parses it using Parser.
431
401
  class Creator
@@ -477,13 +447,13 @@ module Sequel
477
447
  def sql_literal_append(ds, sql)
478
448
  at = array_type
479
449
  if empty? && at
480
- sql << EMPTY_ARRAY
450
+ sql << "'{}'"
481
451
  else
482
- sql << ARRAY
452
+ sql << "ARRAY"
483
453
  _literal_append(sql, ds, to_a)
484
454
  end
485
455
  if at
486
- sql << DOUBLE_COLON << at.to_s << EMPTY_BRACKET
456
+ sql << '::' << at.to_s << '[]'
487
457
  end
488
458
  end
489
459
 
@@ -493,9 +463,9 @@ module Sequel
493
463
  # arrays, surrounding each with [] and interspersing
494
464
  # entries with ,.
495
465
  def _literal_append(sql, ds, array)
496
- sql << OPEN_BRACKET
466
+ sql << '['
497
467
  comma = false
498
- commas = COMMA
468
+ commas = ','
499
469
  array.each do |i|
500
470
  sql << commas if comma
501
471
  if i.is_a?(Array)
@@ -505,44 +475,8 @@ module Sequel
505
475
  end
506
476
  comma = true
507
477
  end
508
- sql << CLOSE_BRACKET
478
+ sql << ']'
509
479
  end
510
-
511
- # Register all array types that this extension handles by default.
512
-
513
- register('text', :oid=>1009, :scalar_oid=>25, :type_symbol=>:string)
514
- register('integer', :oid=>1007, :scalar_oid=>23)
515
- register('bigint', :oid=>1016, :scalar_oid=>20, :scalar_typecast=>:integer)
516
- register('numeric', :oid=>1231, :scalar_oid=>1700, :type_symbol=>:decimal)
517
- register('double precision', :oid=>1022, :scalar_oid=>701, :type_symbol=>:float)
518
-
519
- register('boolean', :oid=>1000, :scalar_oid=>16)
520
- register('bytea', :oid=>1001, :scalar_oid=>17, :type_symbol=>:blob)
521
- register('date', :oid=>1182, :scalar_oid=>1082)
522
- register('time without time zone', :oid=>1183, :scalar_oid=>1083, :type_symbol=>:time)
523
- register('timestamp without time zone', :oid=>1115, :scalar_oid=>1114, :type_symbol=>:datetime)
524
- register('time with time zone', :oid=>1270, :scalar_oid=>1083, :type_symbol=>:time_timezone, :scalar_typecast=>:time)
525
- register('timestamp with time zone', :oid=>1185, :scalar_oid=>1184, :type_symbol=>:datetime_timezone, :scalar_typecast=>:datetime)
526
-
527
- register('smallint', :oid=>1005, :scalar_oid=>21, :scalar_typecast=>:integer)
528
- register('oid', :oid=>1028, :scalar_oid=>26, :scalar_typecast=>:integer)
529
- register('real', :oid=>1021, :scalar_oid=>700, :scalar_typecast=>:float)
530
- register('character', :oid=>1014, :array_type=>:text, :scalar_typecast=>:string)
531
- register('character varying', :oid=>1015, :scalar_typecast=>:string, :type_symbol=>:varchar)
532
-
533
- register('xml', :oid=>143, :scalar_oid=>142)
534
- register('money', :oid=>791, :scalar_oid=>790)
535
- register('bit', :oid=>1561, :scalar_oid=>1560)
536
- register('bit varying', :oid=>1563, :scalar_oid=>1562, :type_symbol=>:varbit)
537
- register('uuid', :oid=>2951, :scalar_oid=>2950)
538
-
539
- register('xid', :oid=>1011, :scalar_oid=>28)
540
- register('cid', :oid=>1012, :scalar_oid=>29)
541
-
542
- register('name', :oid=>1003, :scalar_oid=>19)
543
- register('tid', :oid=>1010, :scalar_oid=>27)
544
- register('int2vector', :oid=>1006, :scalar_oid=>22)
545
- register('oidvector', :oid=>1013, :scalar_oid=>30)
546
480
  end
547
481
  end
548
482