sequel 5.82.0 → 5.84.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +4 -4
  2. data/bin/sequel +9 -17
  3. data/lib/sequel/adapters/jdbc/derby.rb +1 -1
  4. data/lib/sequel/adapters/shared/db2.rb +1 -1
  5. data/lib/sequel/adapters/shared/mssql.rb +14 -2
  6. data/lib/sequel/adapters/shared/postgres.rb +42 -4
  7. data/lib/sequel/adapters/shared/sqlite.rb +3 -1
  8. data/lib/sequel/database/connecting.rb +1 -4
  9. data/lib/sequel/database/misc.rb +27 -7
  10. data/lib/sequel/database/schema_methods.rb +17 -1
  11. data/lib/sequel/dataset/sql.rb +13 -0
  12. data/lib/sequel/extensions/pg_json_ops.rb +328 -1
  13. data/lib/sequel/extensions/stdio_logger.rb +48 -0
  14. data/lib/sequel/extensions/string_agg.rb +15 -2
  15. data/lib/sequel/plugins/defaults_setter.rb +16 -4
  16. data/lib/sequel/plugins/optimistic_locking.rb +2 -0
  17. data/lib/sequel/sql.rb +8 -5
  18. data/lib/sequel/version.rb +1 -1
  19. metadata +4 -235
  20. data/CHANGELOG +0 -1377
  21. data/README.rdoc +0 -936
  22. data/doc/advanced_associations.rdoc +0 -884
  23. data/doc/association_basics.rdoc +0 -1859
  24. data/doc/bin_sequel.rdoc +0 -146
  25. data/doc/cheat_sheet.rdoc +0 -255
  26. data/doc/code_order.rdoc +0 -104
  27. data/doc/core_extensions.rdoc +0 -405
  28. data/doc/dataset_basics.rdoc +0 -96
  29. data/doc/dataset_filtering.rdoc +0 -222
  30. data/doc/extensions.rdoc +0 -77
  31. data/doc/fork_safety.rdoc +0 -84
  32. data/doc/mass_assignment.rdoc +0 -98
  33. data/doc/migration.rdoc +0 -660
  34. data/doc/model_dataset_method_design.rdoc +0 -129
  35. data/doc/model_hooks.rdoc +0 -254
  36. data/doc/model_plugins.rdoc +0 -270
  37. data/doc/mssql_stored_procedures.rdoc +0 -43
  38. data/doc/object_model.rdoc +0 -563
  39. data/doc/opening_databases.rdoc +0 -439
  40. data/doc/postgresql.rdoc +0 -611
  41. data/doc/prepared_statements.rdoc +0 -144
  42. data/doc/querying.rdoc +0 -1070
  43. data/doc/reflection.rdoc +0 -120
  44. data/doc/release_notes/5.0.0.txt +0 -159
  45. data/doc/release_notes/5.1.0.txt +0 -31
  46. data/doc/release_notes/5.10.0.txt +0 -84
  47. data/doc/release_notes/5.11.0.txt +0 -83
  48. data/doc/release_notes/5.12.0.txt +0 -141
  49. data/doc/release_notes/5.13.0.txt +0 -27
  50. data/doc/release_notes/5.14.0.txt +0 -63
  51. data/doc/release_notes/5.15.0.txt +0 -39
  52. data/doc/release_notes/5.16.0.txt +0 -110
  53. data/doc/release_notes/5.17.0.txt +0 -31
  54. data/doc/release_notes/5.18.0.txt +0 -69
  55. data/doc/release_notes/5.19.0.txt +0 -28
  56. data/doc/release_notes/5.2.0.txt +0 -33
  57. data/doc/release_notes/5.20.0.txt +0 -89
  58. data/doc/release_notes/5.21.0.txt +0 -87
  59. data/doc/release_notes/5.22.0.txt +0 -48
  60. data/doc/release_notes/5.23.0.txt +0 -56
  61. data/doc/release_notes/5.24.0.txt +0 -56
  62. data/doc/release_notes/5.25.0.txt +0 -32
  63. data/doc/release_notes/5.26.0.txt +0 -35
  64. data/doc/release_notes/5.27.0.txt +0 -21
  65. data/doc/release_notes/5.28.0.txt +0 -16
  66. data/doc/release_notes/5.29.0.txt +0 -22
  67. data/doc/release_notes/5.3.0.txt +0 -121
  68. data/doc/release_notes/5.30.0.txt +0 -20
  69. data/doc/release_notes/5.31.0.txt +0 -148
  70. data/doc/release_notes/5.32.0.txt +0 -46
  71. data/doc/release_notes/5.33.0.txt +0 -24
  72. data/doc/release_notes/5.34.0.txt +0 -40
  73. data/doc/release_notes/5.35.0.txt +0 -56
  74. data/doc/release_notes/5.36.0.txt +0 -60
  75. data/doc/release_notes/5.37.0.txt +0 -30
  76. data/doc/release_notes/5.38.0.txt +0 -28
  77. data/doc/release_notes/5.39.0.txt +0 -19
  78. data/doc/release_notes/5.4.0.txt +0 -80
  79. data/doc/release_notes/5.40.0.txt +0 -40
  80. data/doc/release_notes/5.41.0.txt +0 -25
  81. data/doc/release_notes/5.42.0.txt +0 -136
  82. data/doc/release_notes/5.43.0.txt +0 -98
  83. data/doc/release_notes/5.44.0.txt +0 -32
  84. data/doc/release_notes/5.45.0.txt +0 -34
  85. data/doc/release_notes/5.46.0.txt +0 -87
  86. data/doc/release_notes/5.47.0.txt +0 -59
  87. data/doc/release_notes/5.48.0.txt +0 -14
  88. data/doc/release_notes/5.49.0.txt +0 -59
  89. data/doc/release_notes/5.5.0.txt +0 -61
  90. data/doc/release_notes/5.50.0.txt +0 -78
  91. data/doc/release_notes/5.51.0.txt +0 -47
  92. data/doc/release_notes/5.52.0.txt +0 -87
  93. data/doc/release_notes/5.53.0.txt +0 -23
  94. data/doc/release_notes/5.54.0.txt +0 -27
  95. data/doc/release_notes/5.55.0.txt +0 -21
  96. data/doc/release_notes/5.56.0.txt +0 -51
  97. data/doc/release_notes/5.57.0.txt +0 -23
  98. data/doc/release_notes/5.58.0.txt +0 -31
  99. data/doc/release_notes/5.59.0.txt +0 -73
  100. data/doc/release_notes/5.6.0.txt +0 -31
  101. data/doc/release_notes/5.60.0.txt +0 -22
  102. data/doc/release_notes/5.61.0.txt +0 -43
  103. data/doc/release_notes/5.62.0.txt +0 -132
  104. data/doc/release_notes/5.63.0.txt +0 -33
  105. data/doc/release_notes/5.64.0.txt +0 -50
  106. data/doc/release_notes/5.65.0.txt +0 -21
  107. data/doc/release_notes/5.66.0.txt +0 -24
  108. data/doc/release_notes/5.67.0.txt +0 -32
  109. data/doc/release_notes/5.68.0.txt +0 -61
  110. data/doc/release_notes/5.69.0.txt +0 -26
  111. data/doc/release_notes/5.7.0.txt +0 -108
  112. data/doc/release_notes/5.70.0.txt +0 -35
  113. data/doc/release_notes/5.71.0.txt +0 -21
  114. data/doc/release_notes/5.72.0.txt +0 -33
  115. data/doc/release_notes/5.73.0.txt +0 -66
  116. data/doc/release_notes/5.74.0.txt +0 -45
  117. data/doc/release_notes/5.75.0.txt +0 -35
  118. data/doc/release_notes/5.76.0.txt +0 -86
  119. data/doc/release_notes/5.77.0.txt +0 -63
  120. data/doc/release_notes/5.78.0.txt +0 -67
  121. data/doc/release_notes/5.79.0.txt +0 -28
  122. data/doc/release_notes/5.8.0.txt +0 -170
  123. data/doc/release_notes/5.80.0.txt +0 -40
  124. data/doc/release_notes/5.81.0.txt +0 -31
  125. data/doc/release_notes/5.82.0.txt +0 -61
  126. data/doc/release_notes/5.9.0.txt +0 -99
  127. data/doc/schema_modification.rdoc +0 -679
  128. data/doc/security.rdoc +0 -443
  129. data/doc/sharding.rdoc +0 -286
  130. data/doc/sql.rdoc +0 -648
  131. data/doc/testing.rdoc +0 -204
  132. data/doc/thread_safety.rdoc +0 -15
  133. data/doc/transactions.rdoc +0 -250
  134. data/doc/validations.rdoc +0 -558
  135. data/doc/virtual_rows.rdoc +0 -265
data/doc/reflection.rdoc DELETED
@@ -1,120 +0,0 @@
1
- = Reflection
2
-
3
- Sequel supports reflection information in multiple ways.
4
-
5
- == Adapter in Use
6
-
7
- You can get the adapter in use using Database#adapter_scheme:
8
-
9
- DB.adapter_scheme # :postgres, :jdbc, :odbc
10
-
11
- == Database Connected To
12
-
13
- In some cases, the adapter scheme will be the same as the database to which you are connecting. However, many adapters support multiple databases. You can use the Database#database_type method to get the type of database to which you are connecting:
14
-
15
- DB.database_type # :postgres, :h2, :mssql
16
-
17
- == Tables in the Database
18
-
19
- Database#tables gives an array of table name symbols:
20
-
21
- DB.tables # [:table1, :table2, :table3, ...]
22
-
23
- == Views in the Database
24
-
25
- Database#views and gives an array of view name symbols:
26
-
27
- DB.views # [:view1, :view2, :view3, ...]
28
-
29
- == Indexes on a table
30
-
31
- Database#indexes takes a table name gives a hash of index information. Keys are index names, values are subhashes with the keys :columns and :unique :
32
-
33
- DB.indexes(:table1) # {:index1=>{:columns=>[:column1], :unique=>false}, :index2=>{:columns=>[:column2, :column3], :unique=>true}}
34
-
35
- Index information generally does not include partial indexes, functional indexes, or indexes on the primary key of the table.
36
-
37
- == Foreign Key Information for a Table
38
-
39
- Database#foreign_key_list takes a table name and gives an array of hashes of foreign key information:
40
-
41
- DB.foreign_key_list(:table1) # [{:columns=>[:column1], :table=>:referenced_table, :key=>[:referenced_column1]}]
42
-
43
- At least the following entries will be present in the hash:
44
-
45
- :columns :: An array of columns in the given table
46
- :table :: The table referenced by the columns
47
- :key :: An array of columns referenced (in the table specified by :table), but can be nil on certain adapters
48
- if the primary key is referenced.
49
-
50
- The hash may also contain entries for:
51
-
52
- :deferrable :: Whether the constraint is deferrable
53
- :name :: The name of the constraint
54
- :on_delete :: The action to take ON DELETE
55
- :on_update :: The action to take ON UPDATE
56
-
57
- == Column Information for a Table
58
-
59
- Database#schema takes a table symbol and returns column information in an array with each element being an array with two elements. The first elements of the subarray is a column symbol, and the second element is a hash of information about that column. The hash should include the following keys:
60
-
61
- :allow_null :: Whether NULL/nil is an allowed value for this column. Used by the Sequel::Model typecasting code.
62
- :db_type :: The type of column the database provided, as a string. Used by the schema_dumper plugin for a more specific type translation.
63
- :default :: The default value of the column, as either a string or nil. Uses a database specific format. Used by the schema_dumper plugin for converting to a ruby value.
64
- :primary_key :: Whether this column is one of the primary key columns for the table. Used by the Sequel::Model code to determine primary key columns.
65
- :ruby_default :: The default value of the column as a ruby object, or nil if there is no default or the default could not be successfully parsed into a ruby object.
66
- :type :: The type of column, as a symbol (e.g. :string). Used by the Sequel::Model typecasting code.
67
-
68
- Example:
69
-
70
- DB.schema(:table) # [[:column1, {:allow_null=>true, :db_type=>'varchar(255)', :default=>'blah', :primary_key=>false, :type=>:string}], ...]
71
-
72
- == Column Information for a Model
73
-
74
- Model#db_schema returns pretty much the same information, except it returns it as a hash with column keys instead of an array of two element arrays.
75
-
76
- Model.db_schema # {:column1=>{:allow_null=>true, :db_type=>'varchar(255)', :default=>'blah', :primary_key=>false, :type=>:string}, ...}
77
-
78
- == Columns used by a dataset/model
79
-
80
- Dataset#columns returns the columns of the current dataset as an array of symbols:
81
-
82
- DB[:table].columns # [:column1, :column2, :column3, ...]
83
-
84
- Dataset#columns! does the same thing, except it ignores any cached value. In general, the cached value should never be incorrect, unless the database schema is changed after the dataset is created.
85
-
86
- DB[:table].columns! # [:column1, :column2, :column3, ...]
87
-
88
- Model.columns does the same thing as Dataset#columns, using the model's dataset:
89
-
90
- Model.columns # [:column1, :column2, :column3, ...]
91
-
92
- == Associations Defined
93
-
94
- Sequel::Model offers complete introspection capability for all associations.
95
-
96
- You can get an array of association symbols with Model.associations:
97
-
98
- Model.associations # [:association1, :association2, ...]
99
-
100
- You can get the association reflection for a single association via the Model.association_reflection. Association reflections are subclasses of hash:
101
-
102
- Model.association_reflection(:association1) # #<Sequel::Model::Associations::ManyToOneAssociationReflection Model.many_to_one :association1>
103
-
104
- You can get an array of all association reflections via Model.all_association_reflections:
105
-
106
- Model.all_association_reflections # [#<Sequel::Model::Associations::ManyToOneAssociationReflection Model.many_to_one :association1>, ...]
107
-
108
- Finally, you can get a hash of association reflections via Model.association_reflections:
109
-
110
- Model.association_reflections # {:association1=>#<Sequel::Model::Associations::ManyToOneAssociationReflection Model.many_to_one :association1>, ...}
111
-
112
- == Validations Defined
113
-
114
- When using the validation_class_methods plugin, you can use the validation_reflections class method to get a hash with validation reflection information. This returns a hash keyed on the column name symbol:
115
-
116
- Model.validation_reflections[:column] # => [[:presence, {}], [:length, {:maximum=>255, :message=>'is just too long'}]]
117
-
118
- Similarly, when using the constraint_validations plugin, you can use the constraint_validation_reflections class method:
119
-
120
- Model.constraint_validation_reflections[:column] # => [[:presence, {}], [:max_length, {:argument=>255, :message=>'is just too long'}]]
@@ -1,159 +0,0 @@
1
- = Major Changes
2
-
3
- * Datasets are now frozen by default. Since Sequel's inception,
4
- datasets have used a method-chaining API that returned modified
5
- copies, but previously they still supported direct mutation. Now,
6
- datasets are always frozen and cannot be mutated. This allows many
7
- additional default optimizations related to caching, and provides
8
- greater thread safety.
9
-
10
- ds = DB[:table]
11
-
12
- # Before
13
- ds.row_proc = lambda{|h| h}
14
-
15
- # Now
16
- ds = ds.with_row_proc(lambda{|h| h})
17
-
18
- * Symbol splitting to create qualified and/or aliased identifiers is
19
- now disabled by default. While symbol splitting allowed for shorter
20
- code, it was not obvious and caused significant issues when using
21
- column names with embedded double or triple underscores. Sequel now
22
- offers many ways to create qualified and/or aliased identifiers.
23
-
24
- # Before
25
- :table__column # "table"."column"
26
-
27
- # Now
28
- :table__column # "table__column"
29
- Sequel[:table][:column] # "table"."column"
30
-
31
- # To get back historical behavior
32
- Sequel.split_symbols = true
33
-
34
- * Sequel no longer allows the use of plain ruby strings as SQL code
35
- fragments in the dataset filtering methods, as that makes it
36
- easier to introduce SQL injection vulnerabilities. You can use
37
- Sequel.lit to create literal strings (SQL code fragments), which
38
- makes it easier to do security auditing of applications using
39
- Sequel.
40
-
41
- # Before
42
- DB[:table].where("column = 1").all
43
-
44
- # Now
45
- DB[:table].where(Sequel.lit("column = 1")).all
46
- # or better
47
- DB[:table].where(column: 1).all
48
-
49
- # To get back historical behavior
50
- DB.extension :auto_literal_strings
51
-
52
- = Backwards Compatibility
53
-
54
- * All adapters, extensions, plugins, features, and constants
55
- deprecated in 4.49.0 have been removed. Before upgrading to Sequel
56
- 5.0.0, upgrade to 4.49.0 and fix all deprecation warnings.
57
-
58
- * Support for ruby 1.8.7 has been dropped, the minimum ruby version is
59
- now 1.9.2.
60
-
61
- * The {before,after,around}_validation hooks are now always called
62
- when saving, even if the validate: false option is used. This
63
- allows you to use the before_validation hook to make changes
64
- to the model instance that are required before validation and
65
- before saving even if not validating.
66
-
67
- * Getting column values for newly created model instances after
68
- insertion now happens before after_create is called, instead of
69
- after.
70
-
71
- * Sequel now immediately attempts to the connect to the database
72
- when a Database instance is created, in order to fail fast if the
73
- connection parameters are invalid.
74
-
75
- * The validates_unique method in the validation_helpers plugin
76
- now only checks for uniqueness by default if the record is new or
77
- one of the related columns has been modified by default.
78
-
79
- * Database schema modification methods and schema generator methods
80
- now return nil instead of some internal value.
81
-
82
- * Many cases where Sequel used Kernel#send internally have been
83
- switched to Kernel#public_send so they only call public methods.
84
-
85
- * Model association hooks are now nil instead of empty arrays by
86
- default.
87
-
88
- * Internal uses of instance_eval with a block have been changed to
89
- instance_exec. This allows them to be used with lambdas that
90
- take no arguments.
91
-
92
- * Most internal constants are now frozen, unless there is a
93
- requirement that they be modified at runtime.
94
-
95
- * The Model @was_new instance variable is now no longer set when
96
- saving new model instances.
97
-
98
- * The private Sequel::Postgres::PGArray::Parser#new_entry_buffer
99
- method in the pg_array extension has been removed.
100
-
101
- * Modifying Model.input_transformer_order in the input_transformer
102
- plugin no longer has an effect.
103
-
104
- = New Features
105
-
106
- * Database#add_index :if_not_exists option is now supported on
107
- PostgreSQL 9.5+.
108
-
109
- * SQL::Subscript#expression has been added to retrieve the
110
- expression that is subscripted.
111
-
112
- = Other Improvements
113
-
114
- * Threaded connection pools no longer block while new connections
115
- are being made. Previously, attempting to establish a new
116
- connection blocked all connection pool activity until the new
117
- connection was made.
118
-
119
- * Many minor performance improvements have been made.
120
-
121
- * The class_table_inheritance plugin now raises an error during
122
- Model#update if a query does not modify a single row, just as
123
- the default Model#update does.
124
-
125
- * ConnectionPool#size is now thread-safe in both threaded
126
- connection pools. Internal callers that already have the
127
- connection pool mutex should switch to using #_size (a new
128
- private method).
129
-
130
- * Registration of new serialization formats in the serialization
131
- plugin is now thread-safe.
132
-
133
- * If transactional schema modifications are not supported, a
134
- savepoint will not automatically be created when adding
135
- indexes for new tables inside transactions. This fixes issues
136
- when making schema changes inside transactions on MySQL.
137
-
138
- * Attempting to create a prepared statement using a dataset that
139
- uses a delayed evaluation now raises an error, because the
140
- prepared statement would not respect the delayed evaluation.
141
-
142
- * The bin/sequel -M option now uses base 10. Previously, it
143
- used the Kernel#Integer default, which was base 8 if there was
144
- a preceding 0.
145
-
146
- = Deprecated Features
147
-
148
- These deprecated features will be removed in Sequel 5.1.0.
149
-
150
- * Model.allowed_columns in the base plugin is now deprecated. Use
151
- the whitelist_security plugin if you want to call it.
152
-
153
- * Model use_after_commit_rollback class and instance accessors are
154
- now deprecated.
155
-
156
- * Defining the Model#_before_validation method is now deprecated.
157
- You can change to using before_validation.
158
-
159
- * The private Model.plugin_module_defined? method is now deprecated.
@@ -1,31 +0,0 @@
1
- = Improvements
2
-
3
- * Database#copy_into in the jdbc/postgresql adapter now works
4
- correctly when using multibyte characters in strings.
5
-
6
- * The alter_table add_foreign_key method is now reversible when the
7
- :foreign_key_constraint_name option is used.
8
-
9
- * The jdbc/h2 and jdbc/hsqldb adapters now respect the
10
- :foreign_key_constraint_name option.
11
-
12
- * Calling Model.freeze on an already frozen model no longer raises
13
- an error.
14
-
15
- * An unnecessary database query is now avoided when loading the
16
- pg_inet extension when the pg_array extension is already loaded.
17
-
18
- * A better exception message is now used when migrating with an
19
- empty migration directory.
20
-
21
- = Backwards Compatibility
22
-
23
- * Model.allowed_columns has been removed. Use the whitelist_security
24
- plugin if you want to call it.
25
-
26
- * Model use_after_commit_rollback class and instance accessors have
27
- been removed.
28
-
29
- * Support for the Model#_before_validation method has been removed.
30
-
31
- * The private Model.plugin_module_defined? method has been removed.
@@ -1,84 +0,0 @@
1
- = New Features
2
-
3
- * Ruby 2.6+ endless ranges are now supported as condition specifier
4
- values, using a >= operator for them:
5
-
6
- DB[:t].where(c: 1...)
7
- # SELECT * FROM t WHERE (c >= 1)
8
-
9
- * Ruby 2.6+ endless ranges are now supported in the pg_range
10
- extension:
11
-
12
- DB[:t].where(id: 1).update(r: 1...)
13
- # UPDATE t SET r = '[1,)' WHERE (id = 1)
14
-
15
- * The :include option when creating indexes is now supported on
16
- PostgreSQL 11, specifying additional columns to include in the index
17
- without indexing them. This is useful to allow index only scans in
18
- additional cases.
19
-
20
- * The :tablespace option is now supported when creating tables,
21
- indexes, and materialized views on PostgreSQL.
22
-
23
- * The list plugin now supports a :top option, which can be used to
24
- specify the top of the list. The default value for the top of the
25
- list is 1, but using this option you can make the top of the list be
26
- 0.
27
-
28
- = Other Improvements
29
-
30
- * In the pg_array_associations plugin, filtering by associations for
31
- many_to_pg_array associations now works correctly on PostgreSQL 11.
32
- Previously it did not work on PostgreSQL 11 due to new restrictions
33
- on using set returning functions in the the SELECT list.
34
-
35
- * When setting the value of a column to the same value the column
36
- already has, for a new model object that has not yet been persisted,
37
- where the column is used as the foreign key for at least one
38
- many_to_one association, do not clear any related associations from
39
- the associations cache.
40
-
41
- * In the pg_array extension, if there are separate conversion procs for
42
- timetz and time types, the conversion proc for the timetz[] type now
43
- correctly uses the conversion proc for the timetz type to convert
44
- scalar values, instead of the conversion proc for the time type.
45
-
46
- * Empty arrays and hashes are now correctly handled in
47
- Dataset#{first,where_all,where_each,where_single_value} when a
48
- cached placeholder literalizer is used.
49
-
50
- * In the tree plugin, Model#{ancestors,descendants,self_and_siblings}
51
- now work correctly when custom parent/children association names
52
- are used.
53
-
54
- * The inner loop of the postgres adapter row fetching code is now
55
- 2-3% faster.
56
-
57
- * When using the postgres adapter with pg-0.18+, set a
58
- type_map_for_queries for the connection to allow it to handle input
59
- type casts for Integer, Float, TrueClass, and FalseClass values
60
- without allocating strings.
61
-
62
- * SQLTime.parse (and therefore Sequel.string_to_time) now respects the
63
- SQLTime.date and Sequel.application_timezone settings.
64
-
65
- * The jdbc/postgresql adapter now correctly parses timetz types.
66
-
67
- * On JRuby 9.2.0.0, when handling BC timestamps without timezones in
68
- the pg_extended_date_support extension, assume local time and not
69
- UTC time if the database timezone is not specified and
70
- Sequel.datetime_class is Time.
71
-
72
- * Errors indicating that a MySQL database is in read-only mode are
73
- now treated as disconnect errors in the mysql and mysql2 adapters,
74
- for better behavior in failover scenarios.
75
-
76
- * Sequel::Model datasets now support the use of IN/NOT IN operators
77
- where the second argument for the operator (the right hand side) is
78
- a set returning function. Previously, the Sequel::Model code
79
- assumed the right hand side of an IN/NOT IN operator was a datasets
80
- or array, since those are the only values where Sequel will
81
- automatically create such an operator.
82
-
83
- * Sequel no longer loads the strscan library in the pg_array extension
84
- if it is not necessary because the parser from sequel_pg is used.
@@ -1,83 +0,0 @@
1
- = New Features
2
-
3
- * Sequel now supports more window frame specification types when
4
- using window functions. You can now provide the window frame
5
- specification as a hash, and Sequel will format the correct
6
- SQL. Specifically, this adds support for RANGE and GROUPS,
7
- numeric offsets, and EXCLUDE on a database that supports it
8
- (e.g. PostgreSQL 11+). Examples:
9
-
10
- DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3,
11
- :frame=>{:type=>:range, :start=>1, :end=>1})}
12
- # SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3
13
- # RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM albums
14
-
15
- DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3,
16
- :frame=>{:type=>:groups, :start=>[2, :preceding], :end=>[1, :preceding]})}
17
- # SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3
18
- # GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING) FROM albums
19
-
20
- DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3,
21
- :frame=>{:type=>:range, :start=>:preceding, :exclude=>:current})}
22
- # SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3
23
- # RANGE UNBOUNDED PRECEDING EXCLUDE CURRENT ROW) FROM albums
24
-
25
- * The SQLite 3.24+ ON CONFLICT clause to INSERT is now supported.
26
- This support is very similar to the PostgreSQL support for the
27
- same feature, also known as UPSERT (UPDATE if the row already
28
- exists, INSERT if it does not). This support is different than
29
- the previous support for INSERT ON CONFLICT REPLACE (also known as
30
- INSERT OR REPLACE), but it uses the same method name in order to
31
- be compatible with the PostgreSQL support. The new syntax requires
32
- passing a hash to Dataset#insert_conflict. Examples:
33
-
34
- DB[:table].insert_conflict({}).insert(a: 1, b: 2)
35
- # INSERT INTO TABLE (a, b) VALUES (1, 2)
36
- # ON CONFLICT DO NOTHING
37
-
38
- DB[:table].insert_conflict(target: :a).insert(a: 1, b: 2)
39
- # INSERT INTO TABLE (a, b) VALUES (1, 2)
40
- # ON CONFLICT (a) DO NOTHING
41
-
42
- DB[:table].insert_conflict(target: :a,
43
- conflict_where: {c: true}).insert(a: 1, b: 2)
44
- # INSERT INTO TABLE (a, b) VALUES (1, 2)
45
- # ON CONFLICT (a) WHERE (c IS TRUE) DO NOTHING
46
-
47
- DB[:table].insert_conflict(target: :a,
48
- update: {b: Sequel[:excluded][:b]}).insert(a: 1, b: 2)
49
- # INSERT INTO TABLE (a, b) VALUES (1, 2)
50
- # ON CONFLICT (a) DO UPDATE SET b = excluded.b
51
-
52
- DB[:table].insert_conflict(target: :a,
53
- update: {b: Sequel[:excluded][:b]},
54
- update_where: {Sequel[:table][:status_id] => 1}).insert(a: 1, b: 2)
55
- # INSERT INTO TABLE (a, b) VALUES (1, 2) ON CONFLICT (a)
56
- # DO UPDATE SET b = excluded.b WHERE (table.status_id = 1)
57
-
58
- * Dataset#window for the WINDOW clause has been moved from the
59
- PostgreSQL-specific support to core, and has been enabled on
60
- MySQL 8+ and SQLAnywhere. This allows you to specify a shared
61
- window specification in a query, which can be used by multiple
62
- window functions.
63
-
64
- = Other Improvements
65
-
66
- * When using the static_cache plugin, Model.first when called without
67
- a block and without arguments or with a single Integer argument now
68
- uses the cached values instead of issuing a query.
69
-
70
- * Using set_column_default with a nil value now correctly removes an
71
- existing default value on MySQL when the column is NOT NULL.
72
-
73
- * Window function support has been enabled on SQLAnywhere, since it
74
- works correctly.
75
-
76
- * Dumping schema for numeric/decimal columns with default values
77
- now works correctly. This was broken starting in Sequel 5.9.0
78
- due to changes to use BigDecimal() instead of BigDecimal.new().
79
-
80
- * The jdbc/sqlserver adapter now works correctly on JRuby 9.2+.
81
-
82
- * An additional check constraint violation failure message is now
83
- recognized on SQLite.
@@ -1,141 +0,0 @@
1
- = New Features
2
-
3
- * An eager_graph_eager plugin has been added, which allows you to
4
- chain eager loads using separate queries to an existing dataset that
5
- uses eager_graph. Given the following model associations:
6
-
7
- Band.one_to_many :albums
8
- Album.one_to_many :tracks
9
-
10
- Let's say you wanted to return bands ordered by album name, and
11
- eagerly load those albums, you can do that using:
12
-
13
- Band.eager_graph(:albums).order{albums[:name]}
14
-
15
- Let's say you also wanted to eagerly load the tracks for each album.
16
- You could just add them to the eager_graph call:
17
-
18
- Band.eager_graph(albums: :tracks).order{albums[:name]}
19
-
20
- However, the bloats the result set, and you aren't ordering by the
21
- track information, so a join is not required. The eager_graph_eager
22
- plugin allows you to specify that the tracks be eagerly loaded in a
23
- separate query after the eager_graph load of albums:
24
-
25
- Band.eager_graph(:albums).
26
- eager_graph_eager([:albums], :tracks).
27
- order{albums[:name]}
28
-
29
- eager_graph_eager's first argument is a dependency chain, specified
30
- as an array of symbols. This specifies the point at which to
31
- perform the eager load. The remaining arguments are arguments that
32
- could be passed to Dataset#eager to specify what dependent
33
- associations should be loaded at that point.
34
-
35
- * A caller_logging Database extension has been added, which logs
36
- caller information before queries, filtering out the internal
37
- Sequel callers. Example:
38
-
39
- DB.extension :caller_logging
40
- DB[:table].first
41
- # Logger:
42
- # (0.000041s) (source: /path/to/app/foo/t.rb:12 in `get_first`)
43
- # SELECT * FROM table LIMIT 1
44
-
45
- You can further filter the caller lines by setting
46
- Database#caller_logging_ignore to a regexp of additional caller
47
- lines to ignore. This is useful if you have specific methods or
48
- internal extensions/plugins that you would also like to ignore as
49
- they obscure the code actually making the request.
50
-
51
- DB.caller_logging_ignore = %r{/path/to/app/lib/plugins}
52
-
53
- You can also format the caller before it is placed in the logger,
54
- using caller_logging_formatter:
55
-
56
- DB.caller_logging_formatter = lambda do |caller|
57
- "(#{caller.sub(/\A\/path\/to\/app\//, '')})"
58
- end
59
- DB[:table].first
60
- # Logger:
61
- # (0.000041s) (foo/t.rb:12 in `get_first`) SELECT * FROM table LIMIT 1
62
-
63
- * Database#call_procedure has been added to the postgres adapter, and
64
- is usable on PostgreSQL 11+ for calling procedures created with
65
- CREATE PROCEDURE.
66
-
67
- DB.call_procedure(:foo, 1, "bar")
68
- # CALL foo(1, 'bar')
69
-
70
- This method will return a hash of results if the procedure returns
71
- a result, or nil if it does not return a result.
72
-
73
- = Other Improvements
74
-
75
- * It is now possible to use Dataset#eager_graph in an eager load
76
- callback for associations that use join tables. This allows you
77
- to eager load some associations using separate queries and other
78
- associations using joins. For example:
79
-
80
- Band.eager(:albums=>proc{|ds| ds.eager_graph(:tracks)})
81
-
82
- Will load the bands in one query, and load the albums and tracks
83
- in a separate query using a join. Previously, this construction
84
- worked only for associations that did not use join tables. It now
85
- works for associations that use join tables, as long as existing
86
- selected columns are not removed inside the callback.
87
-
88
- * The tactical_eager_loading plugin now handles automatic eager
89
- loading for associated objects that were created during the
90
- load of dataset that uses eager_graph. When using the plugin,
91
- the following code will now only execute 2 queries, instead of
92
- issuing a separate query for each album to get the tracks for
93
- the album.
94
-
95
- artists = Artist.eager_graph(:albums).all
96
- artists.each do |artist|
97
- artist.albums.each do |album|
98
- album.tracks
99
- end
100
- end
101
-
102
- * Calling Dataset#graph with a dataset with existing selections where
103
- the column aliases cannot be determined automatically now works
104
- correctly by using a subselect. Previously, attempting to do this
105
- would raise an exception. This allows the following code to work:
106
-
107
- DB[:table].select_all(:table).select_append(expr).graph(...)
108
-
109
- * Datasets now cache the EagerGraphLoader object that is generated to
110
- convert arrays of hashes into an object graph, so that subsequent
111
- eager loads on the same dataset do not need to recompute the same
112
- information. Most EagerGraphLoader internal state is now frozen to
113
- prevent unintentional modification.
114
-
115
- * Sequel.extension now loads files from gems. Previously, it used
116
- Kernel.require, which does not load files from gems.
117
-
118
- * Adapters that emulate prepared statements using literalization now
119
- use a placeholder literalizer and should execute significantly
120
- faster. More prepared statement internal metadata is now frozen
121
- to prevent unintentional modification.
122
-
123
- * Dataset#intersect, #except, and #nowait are now supported on MariaDB
124
- 10.3+.
125
-
126
- * The constraint_validations extension now respects the
127
- constraint_validations_table setting when adding metadata for the
128
- constraint validations.
129
-
130
- * In the oracle adapter, the clob prepared statement argument type is
131
- now mapped to the OCI8::CLOB class, allowing the use of Oracle
132
- procedures with clob output parameters.
133
-
134
- * The Model.load_cache method in the static_cache plugin is now public.
135
-
136
- = Backwards Compatibility
137
-
138
- * The private Dataset#prepared_arg? method has been removed. It is no
139
- longer necessary after the refactoring to the prepared statement
140
- code. External adapters that currently call the method should be
141
- updated to no longer call the method.
@@ -1,27 +0,0 @@
1
- = New Features
2
-
3
- * A constant_sql_override Database extension has been added, allowing
4
- for overriding the SQL used by constants such as
5
- Sequel::CURRENT_TIMESTAMP. This can be used to force
6
- CURRENT_TIMESTAMP to be literalized at a particular time zone:
7
-
8
- DB.extension :constant_sql_override
9
- DB.set_constant_sql(Sequel::CURRENT_TIMESTAMP,
10
- "CURRENT_TIMESTAMP AT TIME ZONE 'UTC'")
11
-
12
- * Prepared statements now support the :single_value type, which
13
- returns the first column value in the dataset.
14
-
15
- prep_stmt = DB[:table].select(:column).prepare(:single_value, :ps)
16
- prep_stmt.call
17
- # PREPARE ps AS SELECT column FROM table LIMIT 1;
18
- # EXECUTE ps;
19
- # => 42
20
-
21
- = Other Improvements
22
-
23
- * Dataset#from_self will no longer use a cached dataset if any options
24
- are given, as that can result in incorrect behavior.
25
-
26
- * Model.all in the static_cache plugin now accepts a block, mirroring
27
- the API when the static_cache plugin is not used.