sequel 4.41.0 → 4.42.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +98 -0
- data/README.rdoc +23 -10
- data/doc/active_record.rdoc +4 -4
- data/doc/advanced_associations.rdoc +2 -2
- data/doc/association_basics.rdoc +5 -2
- data/doc/cheat_sheet.rdoc +3 -3
- data/doc/core_extensions.rdoc +2 -2
- data/doc/dataset_basics.rdoc +4 -4
- data/doc/dataset_filtering.rdoc +1 -1
- data/doc/migration.rdoc +19 -1
- data/doc/prepared_statements.rdoc +2 -2
- data/doc/release_notes/4.42.0.txt +221 -0
- data/doc/testing.rdoc +3 -1
- data/lib/sequel/adapters/ado/access.rb +0 -1
- data/lib/sequel/adapters/ado/mssql.rb +0 -1
- data/lib/sequel/adapters/do/mysql.rb +0 -1
- data/lib/sequel/adapters/do/postgres.rb +0 -1
- data/lib/sequel/adapters/do/sqlite3.rb +0 -1
- data/lib/sequel/adapters/ibmdb.rb +21 -25
- data/lib/sequel/adapters/jdbc.rb +8 -16
- data/lib/sequel/adapters/jdbc/as400.rb +0 -1
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -1
- data/lib/sequel/adapters/jdbc/db2.rb +0 -1
- data/lib/sequel/adapters/jdbc/derby.rb +0 -1
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -1
- data/lib/sequel/adapters/jdbc/h2.rb +0 -1
- data/lib/sequel/adapters/jdbc/hsqldb.rb +0 -1
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -1
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -1
- data/lib/sequel/adapters/jdbc/jtds.rb +0 -1
- data/lib/sequel/adapters/jdbc/mssql.rb +0 -1
- data/lib/sequel/adapters/jdbc/mysql.rb +0 -1
- data/lib/sequel/adapters/jdbc/oracle.rb +0 -1
- data/lib/sequel/adapters/jdbc/postgresql.rb +0 -13
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +0 -1
- data/lib/sequel/adapters/jdbc/sqlite.rb +0 -1
- data/lib/sequel/adapters/jdbc/sqlserver.rb +3 -4
- data/lib/sequel/adapters/mock.rb +54 -12
- data/lib/sequel/adapters/mysql.rb +1 -1
- data/lib/sequel/adapters/mysql2.rb +11 -17
- data/lib/sequel/adapters/odbc/mssql.rb +0 -1
- data/lib/sequel/adapters/oracle.rb +8 -20
- data/lib/sequel/adapters/postgres.rb +11 -29
- data/lib/sequel/adapters/shared/access.rb +5 -12
- data/lib/sequel/adapters/shared/cubrid.rb +4 -13
- data/lib/sequel/adapters/shared/db2.rb +4 -2
- data/lib/sequel/adapters/shared/firebird.rb +2 -4
- data/lib/sequel/adapters/shared/informix.rb +4 -2
- data/lib/sequel/adapters/shared/mssql.rb +3 -5
- data/lib/sequel/adapters/shared/mysql.rb +4 -14
- data/lib/sequel/adapters/shared/oracle.rb +1 -3
- data/lib/sequel/adapters/shared/postgres.rb +16 -38
- data/lib/sequel/adapters/shared/progress.rb +0 -2
- data/lib/sequel/adapters/shared/sqlanywhere.rb +0 -2
- data/lib/sequel/adapters/shared/sqlite.rb +20 -16
- data/lib/sequel/adapters/sqlite.rb +8 -20
- data/lib/sequel/adapters/swift/mysql.rb +0 -1
- data/lib/sequel/adapters/swift/postgres.rb +0 -1
- data/lib/sequel/adapters/swift/sqlite.rb +0 -1
- data/lib/sequel/adapters/tinytds.rb +4 -12
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -2
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +11 -34
- data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +26 -0
- data/lib/sequel/ast_transformer.rb +2 -2
- data/lib/sequel/database/dataset.rb +1 -1
- data/lib/sequel/database/dataset_defaults.rb +0 -66
- data/lib/sequel/database/features.rb +6 -0
- data/lib/sequel/database/misc.rb +31 -17
- data/lib/sequel/database/query.rb +7 -4
- data/lib/sequel/database/schema_methods.rb +1 -1
- data/lib/sequel/dataset.rb +8 -8
- data/lib/sequel/dataset/actions.rb +140 -46
- data/lib/sequel/dataset/features.rb +1 -5
- data/lib/sequel/dataset/graph.rb +7 -8
- data/lib/sequel/dataset/misc.rb +127 -56
- data/lib/sequel/dataset/mutation.rb +9 -20
- data/lib/sequel/dataset/placeholder_literalizer.rb +10 -1
- data/lib/sequel/dataset/prepared_statements.rb +102 -46
- data/lib/sequel/dataset/query.rb +155 -72
- data/lib/sequel/dataset/sql.rb +26 -9
- data/lib/sequel/extensions/columns_introspection.rb +3 -1
- data/lib/sequel/extensions/core_extensions.rb +5 -5
- data/lib/sequel/extensions/core_refinements.rb +5 -5
- data/lib/sequel/extensions/duplicate_columns_handler.rb +4 -2
- data/lib/sequel/extensions/freeze_datasets.rb +69 -0
- data/lib/sequel/extensions/identifier_mangling.rb +196 -0
- data/lib/sequel/extensions/looser_typecasting.rb +11 -7
- data/lib/sequel/extensions/migration.rb +1 -1
- data/lib/sequel/extensions/null_dataset.rb +5 -2
- data/lib/sequel/extensions/pagination.rb +42 -23
- data/lib/sequel/extensions/pg_enum.rb +3 -3
- data/lib/sequel/extensions/query.rb +3 -3
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +15 -8
- data/lib/sequel/model/associations.rb +25 -8
- data/lib/sequel/model/base.rb +88 -29
- data/lib/sequel/model/dataset_module.rb +37 -0
- data/lib/sequel/plugins/association_pks.rb +4 -4
- data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
- data/lib/sequel/plugins/constraint_validations.rb +1 -2
- data/lib/sequel/plugins/csv_serializer.rb +2 -2
- data/lib/sequel/plugins/dataset_associations.rb +8 -8
- data/lib/sequel/plugins/eager_each.rb +2 -2
- data/lib/sequel/plugins/instance_filters.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +2 -2
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/list.rb +4 -4
- data/lib/sequel/plugins/prepared_statements.rb +2 -4
- data/lib/sequel/plugins/prepared_statements_associations.rb +1 -3
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +13 -13
- data/lib/sequel/plugins/sharding.rb +1 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +9 -4
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/validation_class_methods.rb +1 -1
- data/lib/sequel/plugins/validation_helpers.rb +1 -1
- data/lib/sequel/plugins/xml_serializer.rb +2 -2
- data/lib/sequel/sql.rb +69 -36
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +10 -0
- data/spec/adapters/firebird_spec.rb +1 -1
- data/spec/adapters/mssql_spec.rb +4 -5
- data/spec/adapters/mysql_spec.rb +9 -9
- data/spec/adapters/postgres_spec.rb +67 -68
- data/spec/adapters/spec_helper.rb +6 -1
- data/spec/adapters/sqlite_spec.rb +29 -15
- data/spec/core/connection_pool_spec.rb +14 -14
- data/spec/core/database_spec.rb +38 -180
- data/spec/core/dataset_mutation_spec.rb +253 -0
- data/spec/core/dataset_spec.rb +394 -537
- data/spec/core/expression_filters_spec.rb +34 -32
- data/spec/core/mock_adapter_spec.rb +27 -35
- data/spec/core/placeholder_literalizer_spec.rb +2 -4
- data/spec/core/schema_generator_spec.rb +4 -4
- data/spec/core/schema_spec.rb +1 -2
- data/spec/core_extensions_spec.rb +22 -29
- data/spec/extensions/active_model_spec.rb +6 -6
- data/spec/extensions/association_dependencies_spec.rb +2 -2
- data/spec/extensions/blacklist_security_spec.rb +3 -3
- data/spec/extensions/boolean_readers_spec.rb +12 -12
- data/spec/extensions/caching_spec.rb +13 -10
- data/spec/extensions/class_table_inheritance_spec.rb +38 -43
- data/spec/extensions/column_conflicts_spec.rb +1 -3
- data/spec/extensions/columns_introspection_spec.rb +2 -3
- data/spec/extensions/composition_spec.rb +5 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +5 -5
- data/spec/extensions/constraint_validations_spec.rb +14 -8
- data/spec/extensions/core_refinements_spec.rb +22 -29
- data/spec/extensions/csv_serializer_spec.rb +7 -6
- data/spec/extensions/date_arithmetic_spec.rb +15 -15
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +1 -1
- data/spec/extensions/dirty_spec.rb +19 -10
- data/spec/extensions/duplicate_columns_handler_spec.rb +12 -18
- data/spec/extensions/eager_each_spec.rb +12 -16
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +4 -3
- data/spec/extensions/force_encoding_spec.rb +12 -12
- data/spec/extensions/freeze_datasets_spec.rb +31 -0
- data/spec/extensions/graph_each_spec.rb +6 -18
- data/spec/extensions/hook_class_methods_spec.rb +7 -7
- data/spec/extensions/identifier_mangling_spec.rb +307 -0
- data/spec/extensions/instance_filters_spec.rb +5 -6
- data/spec/extensions/instance_hooks_spec.rb +12 -12
- data/spec/extensions/json_serializer_spec.rb +12 -15
- data/spec/extensions/lazy_attributes_spec.rb +4 -4
- data/spec/extensions/list_spec.rb +19 -21
- data/spec/extensions/many_through_many_spec.rb +108 -163
- data/spec/extensions/meta_def_spec.rb +7 -2
- data/spec/extensions/migration_spec.rb +10 -12
- data/spec/extensions/mssql_optimistic_locking_spec.rb +4 -3
- data/spec/extensions/named_timezones_spec.rb +4 -3
- data/spec/extensions/nested_attributes_spec.rb +2 -2
- data/spec/extensions/null_dataset_spec.rb +17 -12
- data/spec/extensions/optimistic_locking_spec.rb +4 -5
- data/spec/extensions/pagination_spec.rb +8 -10
- data/spec/extensions/pg_array_associations_spec.rb +28 -27
- data/spec/extensions/pg_array_ops_spec.rb +2 -1
- data/spec/extensions/pg_array_spec.rb +6 -2
- data/spec/extensions/pg_enum_spec.rb +5 -3
- data/spec/extensions/pg_hstore_ops_spec.rb +3 -1
- data/spec/extensions/pg_hstore_spec.rb +7 -6
- data/spec/extensions/pg_inet_ops_spec.rb +2 -1
- data/spec/extensions/pg_inet_spec.rb +2 -1
- data/spec/extensions/pg_interval_spec.rb +2 -1
- data/spec/extensions/pg_json_ops_spec.rb +2 -1
- data/spec/extensions/pg_json_spec.rb +6 -3
- data/spec/extensions/pg_loose_count_spec.rb +1 -0
- data/spec/extensions/pg_range_ops_spec.rb +3 -1
- data/spec/extensions/pg_range_spec.rb +9 -5
- data/spec/extensions/pg_row_ops_spec.rb +2 -1
- data/spec/extensions/pg_row_plugin_spec.rb +4 -6
- data/spec/extensions/pg_row_spec.rb +5 -3
- data/spec/extensions/pg_static_cache_updater_spec.rb +2 -1
- data/spec/extensions/pg_typecast_on_load_spec.rb +1 -1
- data/spec/extensions/prepared_statements_associations_spec.rb +1 -1
- data/spec/extensions/prepared_statements_spec.rb +12 -11
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +8 -5
- data/spec/extensions/rcte_tree_spec.rb +39 -39
- data/spec/extensions/round_timestamps_spec.rb +2 -2
- data/spec/extensions/schema_dumper_spec.rb +3 -2
- data/spec/extensions/schema_spec.rb +2 -2
- data/spec/extensions/scissors_spec.rb +1 -2
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +30 -17
- data/spec/extensions/serialization_modification_detection_spec.rb +2 -2
- data/spec/extensions/serialization_spec.rb +15 -13
- data/spec/extensions/set_overrides_spec.rb +14 -8
- data/spec/extensions/sharding_spec.rb +9 -18
- data/spec/extensions/shared_caching_spec.rb +3 -4
- data/spec/extensions/single_table_inheritance_spec.rb +11 -11
- data/spec/extensions/skip_create_refresh_spec.rb +2 -1
- data/spec/extensions/spec_helper.rb +1 -1
- data/spec/extensions/split_values_spec.rb +2 -2
- data/spec/extensions/sql_comments_spec.rb +6 -0
- data/spec/extensions/static_cache_spec.rb +7 -9
- data/spec/extensions/string_agg_spec.rb +30 -29
- data/spec/extensions/tactical_eager_loading_spec.rb +4 -5
- data/spec/extensions/thread_local_timezones_spec.rb +2 -2
- data/spec/extensions/timestamps_spec.rb +28 -3
- data/spec/extensions/to_dot_spec.rb +1 -2
- data/spec/extensions/tree_spec.rb +33 -29
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -0
- data/spec/extensions/update_primary_key_spec.rb +11 -7
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +0 -1
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +10 -10
- data/spec/extensions/validation_helpers_spec.rb +10 -10
- data/spec/extensions/xml_serializer_spec.rb +7 -3
- data/spec/integration/associations_test.rb +31 -31
- data/spec/integration/dataset_test.rb +17 -19
- data/spec/integration/eager_loader_test.rb +24 -24
- data/spec/integration/model_test.rb +6 -6
- data/spec/integration/plugin_test.rb +43 -43
- data/spec/integration/prepared_statement_test.rb +6 -6
- data/spec/integration/schema_test.rb +63 -52
- data/spec/integration/spec_helper.rb +6 -1
- data/spec/integration/transaction_test.rb +13 -13
- data/spec/model/association_reflection_spec.rb +17 -17
- data/spec/model/associations_spec.rb +101 -96
- data/spec/model/base_spec.rb +175 -49
- data/spec/model/class_dataset_methods_spec.rb +5 -9
- data/spec/model/dataset_methods_spec.rb +5 -5
- data/spec/model/eager_loading_spec.rb +209 -235
- data/spec/model/hooks_spec.rb +15 -15
- data/spec/model/model_spec.rb +28 -21
- data/spec/model/plugins_spec.rb +4 -5
- data/spec/model/record_spec.rb +59 -57
- data/spec/model/spec_helper.rb +1 -1
- data/spec/model/validations_spec.rb +6 -6
- data/spec/spec_config.rb +1 -1
- metadata +10 -2
@@ -337,7 +337,7 @@ module Sequel
|
|
337
337
|
def split_multiple_result_sets
|
338
338
|
raise(Error, "Can't split multiple statements on a graphed dataset") if opts[:graph]
|
339
339
|
ds = clone(:split_multiple_result_sets=>true)
|
340
|
-
ds
|
340
|
+
ds = ds.with_row_proc(proc{|x| x.map{|h| row_proc.call(h)}}) if row_proc
|
341
341
|
ds
|
342
342
|
end
|
343
343
|
|
@@ -236,28 +236,12 @@ module Sequel
|
|
236
236
|
"sql = self; opts = Hash[opts]; opts[:arguments] = bind_arguments",
|
237
237
|
Sequel::Dataset::UnnumberedArgumentMapper,
|
238
238
|
%w"execute execute_dui execute_insert")
|
239
|
-
|
240
|
-
# Create a named prepared statement that is stored in the
|
241
|
-
# database (and connection) for reuse.
|
242
|
-
def prepare(type, name=nil, *values)
|
243
|
-
ps = to_prepared_statement(type, values)
|
244
|
-
ps.extend(PreparedStatementMethods)
|
245
|
-
if name
|
246
|
-
ps.prepared_statement_name = name
|
247
|
-
db.set_prepared_statement(name, ps)
|
248
|
-
end
|
249
|
-
ps
|
250
|
-
end
|
251
239
|
end
|
252
240
|
|
253
241
|
# Yield all rows matching this dataset.
|
254
242
|
def fetch_rows(sql)
|
255
243
|
execute(sql) do |r|
|
256
|
-
self.columns =
|
257
|
-
r.fields.map!{|c| output_identifier(c.to_s)}
|
258
|
-
else
|
259
|
-
r.fields
|
260
|
-
end
|
244
|
+
self.columns = r.fields.map!{|c| output_identifier(c.to_s)}
|
261
245
|
r.each(:cast_booleans=>convert_tinyint_to_bool?){|h| yield h}
|
262
246
|
end
|
263
247
|
self
|
@@ -296,6 +280,16 @@ module Sequel
|
|
296
280
|
super
|
297
281
|
end
|
298
282
|
|
283
|
+
if NativePreparedStatements
|
284
|
+
def bound_variable_modules
|
285
|
+
[PreparedStatementMethods]
|
286
|
+
end
|
287
|
+
|
288
|
+
def prepared_statement_modules
|
289
|
+
[PreparedStatementMethods]
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
299
293
|
# Handle correct quoting of strings using ::Mysql2::Client#escape.
|
300
294
|
def literal_string_append(sql, v)
|
301
295
|
s = db.synchronize(@opts[:server]){|c| c.escape(v)}
|
@@ -355,13 +355,6 @@ module Sequel
|
|
355
355
|
BindArgumentMethods = prepared_statements_module(:bind, ArgumentMapper)
|
356
356
|
PreparedStatementMethods = prepared_statements_module(:prepare, BindArgumentMethods)
|
357
357
|
|
358
|
-
# Execute the given type of statement with the hash of values.
|
359
|
-
def call(type, bind_vars={}, *values, &block)
|
360
|
-
ps = to_prepared_statement(type, values)
|
361
|
-
ps.extend(BindArgumentMethods)
|
362
|
-
ps.call(bind_vars, &block)
|
363
|
-
end
|
364
|
-
|
365
358
|
def fetch_rows(sql)
|
366
359
|
execute(sql) do |cursor|
|
367
360
|
cps = db.conversion_procs
|
@@ -378,19 +371,6 @@ module Sequel
|
|
378
371
|
self
|
379
372
|
end
|
380
373
|
|
381
|
-
# Prepare the given type of query with the given name and store
|
382
|
-
# it in the database. Note that a new native prepared statement is
|
383
|
-
# created on each call to this prepared statement.
|
384
|
-
def prepare(type, name=nil, *values)
|
385
|
-
ps = to_prepared_statement(type, values)
|
386
|
-
ps.extend(PreparedStatementMethods)
|
387
|
-
if name
|
388
|
-
ps.prepared_statement_name = name
|
389
|
-
db.set_prepared_statement(name, ps)
|
390
|
-
end
|
391
|
-
ps
|
392
|
-
end
|
393
|
-
|
394
374
|
# Oracle requires type specifiers for placeholders, at least
|
395
375
|
# if you ever want to use a nil/NULL value as the value for
|
396
376
|
# the placeholder.
|
@@ -415,6 +395,14 @@ module Sequel
|
|
415
395
|
def prepared_arg_placeholder
|
416
396
|
PREPARED_ARG_PLACEHOLDER
|
417
397
|
end
|
398
|
+
|
399
|
+
def bound_variable_modules
|
400
|
+
[BindArgumentMethods]
|
401
|
+
end
|
402
|
+
|
403
|
+
def prepared_statement_modules
|
404
|
+
[PreparedStatementMethods]
|
405
|
+
end
|
418
406
|
end
|
419
407
|
end
|
420
408
|
end
|
@@ -755,37 +755,19 @@ module Sequel
|
|
755
755
|
end
|
756
756
|
end
|
757
757
|
|
758
|
-
BindArgumentMethods = prepared_statements_module(:bind, [ArgumentMapper
|
759
|
-
|
760
|
-
PreparedStatementMethods = prepared_statements_module(:prepare, BindArgumentMethods, %w'execute execute_dui') do
|
761
|
-
# Raise a more obvious error if you attempt to call a unnamed prepared statement.
|
762
|
-
def call(*)
|
763
|
-
raise Error, "Cannot call prepared statement without a name" if prepared_statement_name.nil?
|
764
|
-
super
|
765
|
-
end
|
766
|
-
end
|
767
|
-
|
768
|
-
# Execute the given type of statement with the hash of values.
|
769
|
-
def call(type, bind_vars=OPTS, *values, &block)
|
770
|
-
ps = to_prepared_statement(type, values)
|
771
|
-
ps.extend(BindArgumentMethods)
|
772
|
-
ps.call(bind_vars, &block)
|
773
|
-
end
|
774
|
-
|
775
|
-
# Prepare the given type of statement with the given name, and store
|
776
|
-
# it in the database to be called later.
|
777
|
-
def prepare(type, name=nil, *values)
|
778
|
-
ps = to_prepared_statement(type, values)
|
779
|
-
ps.extend(PreparedStatementMethods)
|
780
|
-
if name
|
781
|
-
ps.prepared_statement_name = name
|
782
|
-
db.set_prepared_statement(name, ps)
|
783
|
-
end
|
784
|
-
ps
|
785
|
-
end
|
758
|
+
BindArgumentMethods = prepared_statements_module(:bind, [ArgumentMapper], %w'execute execute_dui')
|
759
|
+
PreparedStatementMethods = prepared_statements_module(:prepare, BindArgumentMethods, %w'execute execute_dui')
|
786
760
|
|
787
761
|
private
|
788
762
|
|
763
|
+
def bound_variable_modules
|
764
|
+
[BindArgumentMethods]
|
765
|
+
end
|
766
|
+
|
767
|
+
def prepared_statement_modules
|
768
|
+
[PreparedStatementMethods]
|
769
|
+
end
|
770
|
+
|
789
771
|
# PostgreSQL uses $N for placeholders instead of ?, so use a $
|
790
772
|
# as the placeholder.
|
791
773
|
def prepared_arg_placeholder
|
@@ -834,7 +816,7 @@ module Sequel
|
|
834
816
|
end
|
835
817
|
end
|
836
818
|
|
837
|
-
# Set the
|
819
|
+
# Set the columns based on the result set, and return the array of
|
838
820
|
# field numers, type conversion procs, and name symbol arrays.
|
839
821
|
def fetch_rows_set_cols(res)
|
840
822
|
cols = []
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
|
4
|
-
require 'adapters/utils/emulate_offset_with_reverse_and_count'
|
3
|
+
Sequel.require %w'emulate_offset_with_reverse_and_count unmodified_identifiers', 'adapters/utils'
|
5
4
|
|
5
|
+
module Sequel
|
6
6
|
module Access
|
7
7
|
Sequel::Database.set_shared_adapter_scheme(:access, self)
|
8
8
|
|
9
9
|
module DatabaseMethods
|
10
|
-
|
10
|
+
include UnmodifiedIdentifiers::DatabaseMethods
|
11
11
|
|
12
12
|
# Access uses type :access as the database_type
|
13
13
|
def database_type
|
@@ -16,7 +16,7 @@ module Sequel
|
|
16
16
|
|
17
17
|
# Doesn't work, due to security restrictions on MSysObjects
|
18
18
|
#def tables
|
19
|
-
# from(:MSysObjects).
|
19
|
+
# from(:MSysObjects).where(:Type=>1, :Flags=>0).select_map(:Name).map(&:to_sym)
|
20
20
|
#end
|
21
21
|
|
22
22
|
# Access doesn't support renaming tables from an SQL query,
|
@@ -61,14 +61,6 @@ module Sequel
|
|
61
61
|
"DROP INDEX #{quote_identifier(op[:name] || default_index_name(table, op[:columns]))} ON #{quote_schema_table(table)}"
|
62
62
|
end
|
63
63
|
|
64
|
-
def identifier_input_method_default
|
65
|
-
nil
|
66
|
-
end
|
67
|
-
|
68
|
-
def identifier_output_method_default
|
69
|
-
nil
|
70
|
-
end
|
71
|
-
|
72
64
|
# Access doesn't have a 64-bit integer type, so use integer and hope
|
73
65
|
# the user isn't using more than 32 bits.
|
74
66
|
def type_literal_generic_bignum_symbol(column)
|
@@ -91,6 +83,7 @@ module Sequel
|
|
91
83
|
Dataset.def_sql_method(self, :select, %w'select distinct limit columns into from join where group order having compounds')
|
92
84
|
end)
|
93
85
|
include EmulateOffsetWithReverseAndCount
|
86
|
+
include UnmodifiedIdentifiers::DatasetMethods
|
94
87
|
|
95
88
|
DATE_FORMAT = '#%Y-%m-%d#'.freeze
|
96
89
|
TIMESTAMP_FORMAT = '#%Y-%m-%d %H:%M:%S#'.freeze
|
@@ -1,15 +1,14 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
Sequel.require 'adapters/utils
|
3
|
+
Sequel.require %w'split_alter_table unmodified_identifiers', 'adapters/utils'
|
4
4
|
|
5
5
|
module Sequel
|
6
6
|
module Cubrid
|
7
7
|
Sequel::Database.set_shared_adapter_scheme(:cubrid, self)
|
8
8
|
|
9
9
|
module DatabaseMethods
|
10
|
-
extend Sequel::Database::ResetIdentifierMangling
|
11
|
-
|
12
10
|
include Sequel::Database::SplitAlterTable
|
11
|
+
include UnmodifiedIdentifiers::DatabaseMethods
|
13
12
|
|
14
13
|
AUTOINCREMENT = 'AUTO_INCREMENT'.freeze
|
15
14
|
COLUMN_DEFINITION_ORDER = [:auto_increment, :default, :null, :unique, :primary_key, :references]
|
@@ -143,16 +142,6 @@ module Sequel
|
|
143
142
|
DATABASE_ERROR_REGEXPS
|
144
143
|
end
|
145
144
|
|
146
|
-
# CUBRID is case insensitive, so don't modify identifiers
|
147
|
-
def identifier_input_method_default
|
148
|
-
nil
|
149
|
-
end
|
150
|
-
|
151
|
-
# CUBRID is case insensitive, so don't modify identifiers
|
152
|
-
def identifier_output_method_default
|
153
|
-
nil
|
154
|
-
end
|
155
|
-
|
156
145
|
# CUBRID does not support named column constraints.
|
157
146
|
def supports_named_column_constraints?
|
158
147
|
false
|
@@ -175,6 +164,8 @@ module Sequel
|
|
175
164
|
end
|
176
165
|
|
177
166
|
module DatasetMethods
|
167
|
+
include UnmodifiedIdentifiers::DatasetMethods
|
168
|
+
|
178
169
|
COMMA = Sequel::Dataset::COMMA
|
179
170
|
LIMIT = Sequel::Dataset::LIMIT
|
180
171
|
BOOL_FALSE = '0'.freeze
|
@@ -14,8 +14,6 @@ module Sequel
|
|
14
14
|
end
|
15
15
|
|
16
16
|
module DatabaseMethods
|
17
|
-
extend Sequel::Database::ResetIdentifierMangling
|
18
|
-
|
19
17
|
AUTOINCREMENT = 'GENERATED ALWAYS AS IDENTITY'.freeze
|
20
18
|
NOT_NULL = ' NOT NULL'.freeze
|
21
19
|
NULL = ''.freeze
|
@@ -322,6 +320,10 @@ module Sequel
|
|
322
320
|
end
|
323
321
|
end
|
324
322
|
|
323
|
+
def quote_identifiers?
|
324
|
+
@opts.fetch(:quote_identifiers, false)
|
325
|
+
end
|
326
|
+
|
325
327
|
def supports_cte?(type=:select)
|
326
328
|
type == :select
|
327
329
|
end
|
@@ -5,8 +5,6 @@ module Sequel
|
|
5
5
|
Sequel::Database.set_shared_adapter_scheme(:firebird, self)
|
6
6
|
|
7
7
|
module DatabaseMethods
|
8
|
-
extend Sequel::Database::ResetIdentifierMangling
|
9
|
-
|
10
8
|
AUTO_INCREMENT = ''.freeze
|
11
9
|
TEMPORARY = 'GLOBAL TEMPORARY '.freeze
|
12
10
|
|
@@ -40,7 +38,7 @@ module Sequel
|
|
40
38
|
end
|
41
39
|
|
42
40
|
def sequences(opts=OPTS)
|
43
|
-
ds = self[:"rdb$generators"].server(opts[:server]).
|
41
|
+
ds = self[:"rdb$generators"].server(opts[:server]).where(:"rdb$system_flag" => 0).select(:"rdb$generator_name")
|
44
42
|
block_given? ? yield(ds) : ds.map{|r| ds.send(:output_identifier, r[:"rdb$generator_name"])}
|
45
43
|
end
|
46
44
|
|
@@ -143,7 +141,7 @@ module Sequel
|
|
143
141
|
end
|
144
142
|
|
145
143
|
def tables_or_views(type, opts)
|
146
|
-
ds = self[:"rdb$relations"].server(opts[:server]).
|
144
|
+
ds = self[:"rdb$relations"].server(opts[:server]).where(:"rdb$relation_type" => type, Sequel::SQL::Function.new(:COALESCE, :"rdb$system_flag", 0) => 0).select(:"rdb$relation_name")
|
147
145
|
ds.map{|r| ds.send(:output_identifier, r[:"rdb$relation_name"].rstrip)}
|
148
146
|
end
|
149
147
|
|
@@ -5,8 +5,6 @@ module Sequel
|
|
5
5
|
Sequel::Database.set_shared_adapter_scheme(:informix, self)
|
6
6
|
|
7
7
|
module DatabaseMethods
|
8
|
-
extend Sequel::Database::ResetIdentifierMangling
|
9
|
-
|
10
8
|
TEMPORARY = 'TEMP '.freeze
|
11
9
|
|
12
10
|
# Informix uses the :informix database type
|
@@ -34,6 +32,10 @@ module Sequel
|
|
34
32
|
|
35
33
|
Dataset.def_sql_method(self, :select, %w'select limit distinct columns from join where having group compounds order')
|
36
34
|
|
35
|
+
def quote_identifiers?
|
36
|
+
@opts.fetch(:quote_identifiers, false)
|
37
|
+
end
|
38
|
+
|
37
39
|
# Informix does not support INTERSECT or EXCEPT
|
38
40
|
def supports_intersect_except?
|
39
41
|
false
|
@@ -13,8 +13,6 @@ module Sequel
|
|
13
13
|
end
|
14
14
|
|
15
15
|
module DatabaseMethods
|
16
|
-
extend Sequel::Database::ResetIdentifierMangling
|
17
|
-
|
18
16
|
AUTO_INCREMENT = 'IDENTITY(1,1)'.freeze
|
19
17
|
SERVER_VERSION_RE = /^(\d+)\.(\d+)\.(\d+)/.freeze
|
20
18
|
SERVER_VERSION_SQL = "SELECT CAST(SERVERPROPERTY('ProductVersion') AS varchar)".freeze
|
@@ -399,12 +397,12 @@ module Sequel
|
|
399
397
|
m = output_identifier_meth
|
400
398
|
metadata_dataset.from(Sequel[:information_schema][:tables].as(:t)).
|
401
399
|
select(:table_name).
|
402
|
-
|
400
|
+
where(:table_type=>type, :table_schema=>(opts[:schema]||'dbo').to_s).
|
403
401
|
map{|x| m.call(x[:table_name])}
|
404
402
|
end
|
405
403
|
|
406
404
|
# Always quote identifiers in the metadata_dataset, so schema parsing works.
|
407
|
-
def
|
405
|
+
def _metadata_dataset
|
408
406
|
super.with_quote_identifiers(true)
|
409
407
|
end
|
410
408
|
|
@@ -652,7 +650,7 @@ module Sequel
|
|
652
650
|
# MSSQL uses the CONTAINS keyword for full text search
|
653
651
|
def full_text_search(cols, terms, opts = OPTS)
|
654
652
|
terms = "\"#{terms.join('" OR "')}\"" if terms.is_a?(Array)
|
655
|
-
|
653
|
+
where("CONTAINS (?, ?)", cols, terms)
|
656
654
|
end
|
657
655
|
|
658
656
|
# Use the OUTPUT clause to get the value of all columns for the newly inserted record.
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
Sequel.require 'adapters/utils
|
4
|
-
Sequel.require 'adapters/utils/replace'
|
3
|
+
Sequel.require %w'replace split_alter_table unmodified_identifiers', 'adapters/utils'
|
5
4
|
|
6
5
|
module Sequel
|
7
6
|
module MySQL
|
@@ -38,7 +37,7 @@ module Sequel
|
|
38
37
|
# Methods shared by Database instances that connect to MySQL,
|
39
38
|
# currently supported by the native and JDBC adapters.
|
40
39
|
module DatabaseMethods
|
41
|
-
|
40
|
+
include UnmodifiedIdentifiers::DatabaseMethods
|
42
41
|
|
43
42
|
AUTO_INCREMENT = 'AUTO_INCREMENT'.freeze
|
44
43
|
CAST_TYPES = {String=>:CHAR, Integer=>:SIGNED, Time=>:DATETIME, DateTime=>:DATETIME, Numeric=>:DECIMAL, BigDecimal=>:DECIMAL, File=>:BINARY}
|
@@ -418,16 +417,6 @@ module Sequel
|
|
418
417
|
metadata_dataset.with_sql('SHOW FULL TABLES').server(opts[:server]).map{|r| m.call(r.values.first) if r.delete(:Table_type) == type}.compact
|
419
418
|
end
|
420
419
|
|
421
|
-
# MySQL folds unquoted identifiers to lowercase, so it shouldn't need to upcase identifiers on input.
|
422
|
-
def identifier_input_method_default
|
423
|
-
nil
|
424
|
-
end
|
425
|
-
|
426
|
-
# MySQL folds unquoted identifiers to lowercase, so it shouldn't need to upcase identifiers on output.
|
427
|
-
def identifier_output_method_default
|
428
|
-
nil
|
429
|
-
end
|
430
|
-
|
431
420
|
# Handle MySQL specific index SQL syntax
|
432
421
|
def index_definition_sql(table_name, index)
|
433
422
|
index_name = quote_identifier(index[:name] || default_index_name(table_name, index[:columns]))
|
@@ -627,6 +616,7 @@ module Sequel
|
|
627
616
|
Dataset.def_sql_method(self, :update, %w'update ignore table set where order limit')
|
628
617
|
|
629
618
|
include Sequel::Dataset::Replace
|
619
|
+
include UnmodifiedIdentifiers::DatasetMethods
|
630
620
|
|
631
621
|
# MySQL specific syntax for LIKE/REGEXP searches, as well as
|
632
622
|
# string concatenation.
|
@@ -724,7 +714,7 @@ module Sequel
|
|
724
714
|
|
725
715
|
# Adds full text filter
|
726
716
|
def full_text_search(cols, terms, opts = OPTS)
|
727
|
-
|
717
|
+
where(full_text_sql(cols, terms, opts))
|
728
718
|
end
|
729
719
|
|
730
720
|
# MySQL specific full text search syntax.
|
@@ -14,8 +14,6 @@ module Sequel
|
|
14
14
|
end
|
15
15
|
|
16
16
|
module DatabaseMethods
|
17
|
-
extend Sequel::Database::ResetIdentifierMangling
|
18
|
-
|
19
17
|
TEMPORARY = 'GLOBAL TEMPORARY '.freeze
|
20
18
|
AUTOINCREMENT = ''.freeze
|
21
19
|
|
@@ -265,7 +263,7 @@ module Sequel
|
|
265
263
|
pk = sch.select{|k, v| v[:primary_key]}
|
266
264
|
@primary_key_sequences[table] = if pk.length == 1
|
267
265
|
seq = "seq_#{table}_#{pk.first.first}"
|
268
|
-
seq.to_sym unless from(:user_sequences).
|
266
|
+
seq.to_sym unless from(:user_sequences).where(:sequence_name=>input_identifier_meth.call(seq)).empty?
|
269
267
|
end
|
270
268
|
end
|
271
269
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
Sequel.require 'adapters/utils
|
3
|
+
Sequel.require %w'pg_types unmodified_identifiers', 'adapters/utils'
|
4
4
|
|
5
5
|
module Sequel
|
6
6
|
# Top level module for holding all PostgreSQL-related modules and classes
|
@@ -109,7 +109,7 @@ module Sequel
|
|
109
109
|
|
110
110
|
# Methods shared by Database instances that connect to PostgreSQL.
|
111
111
|
module DatabaseMethods
|
112
|
-
|
112
|
+
include UnmodifiedIdentifiers::DatabaseMethods
|
113
113
|
|
114
114
|
PREPARED_ARG_PLACEHOLDER = LiteralString.new('$').freeze
|
115
115
|
RE_CURRVAL_ERROR = /currval of sequence "(.*)" is not yet defined in this session|relation "(.*)" does not exist/.freeze
|
@@ -352,7 +352,7 @@ module Sequel
|
|
352
352
|
# entry is schema qualified as well.
|
353
353
|
if schema
|
354
354
|
ref_ds = ref_ds.join(Sequel[:pg_namespace].as(:nsp2), :oid=>Sequel[:cl2][:relnamespace]).
|
355
|
-
|
355
|
+
select_append{nsp2[:nspname].as(:schema)}
|
356
356
|
end
|
357
357
|
|
358
358
|
h = {}
|
@@ -508,7 +508,7 @@ module Sequel
|
|
508
508
|
0
|
509
509
|
end
|
510
510
|
end
|
511
|
-
|
511
|
+
Sequel::Deprecation.deprecate('Sequel no longer supports PostgreSQL <8.2, some things may not work.') if @server_version < 80200
|
512
512
|
@server_version
|
513
513
|
end
|
514
514
|
|
@@ -581,7 +581,7 @@ module Sequel
|
|
581
581
|
# the database.
|
582
582
|
def type_supported?(type)
|
583
583
|
@supported_types ||= {}
|
584
|
-
@supported_types.fetch(type){@supported_types[type] = (from(:pg_type).
|
584
|
+
@supported_types.fetch(type){@supported_types[type] = (from(:pg_type).where(:typtype=>'b', :typname=>type.to_s).count > 0)}
|
585
585
|
end
|
586
586
|
|
587
587
|
# Creates a dataset that uses the VALUES clause:
|
@@ -1005,16 +1005,6 @@ module Sequel
|
|
1005
1005
|
procs
|
1006
1006
|
end
|
1007
1007
|
|
1008
|
-
# PostgreSQL folds unquoted identifiers to lowercase, so it shouldn't need to upcase identifiers on input.
|
1009
|
-
def identifier_input_method_default
|
1010
|
-
nil
|
1011
|
-
end
|
1012
|
-
|
1013
|
-
# PostgreSQL folds unquoted identifiers to lowercase, so it shouldn't need to upcase identifiers on output.
|
1014
|
-
def identifier_output_method_default
|
1015
|
-
nil
|
1016
|
-
end
|
1017
|
-
|
1018
1008
|
# PostgreSQL specific index SQL.
|
1019
1009
|
def index_definition_sql(table_name, index)
|
1020
1010
|
cols = index[:columns]
|
@@ -1048,7 +1038,7 @@ module Sequel
|
|
1048
1038
|
|
1049
1039
|
# Backbone of the tables and views support.
|
1050
1040
|
def pg_class_relname(type, opts)
|
1051
|
-
ds = metadata_dataset.from(:pg_class).
|
1041
|
+
ds = metadata_dataset.from(:pg_class).where(:relkind=>type).select(:relname).server(opts[:server]).join(:pg_namespace, :oid=>:relnamespace)
|
1052
1042
|
ds = filter_schema(ds, opts)
|
1053
1043
|
m = output_identifier_meth
|
1054
1044
|
if block_given?
|
@@ -1226,6 +1216,8 @@ module Sequel
|
|
1226
1216
|
|
1227
1217
|
# Instance methods for datasets that connect to a PostgreSQL database.
|
1228
1218
|
module DatasetMethods
|
1219
|
+
include UnmodifiedIdentifiers::DatasetMethods
|
1220
|
+
|
1229
1221
|
ACCESS_SHARE = 'ACCESS SHARE'.freeze
|
1230
1222
|
ACCESS_EXCLUSIVE = 'ACCESS EXCLUSIVE'.freeze
|
1231
1223
|
BOOL_FALSE = 'false'.freeze
|
@@ -1271,28 +1263,6 @@ module Sequel
|
|
1271
1263
|
Dataset.def_sql_method(self, :select, [['if opts[:values]', %w'values order limit'], ['elsif server_version >= 80400', %w'with select distinct columns from join where group having window compounds order limit lock'], ['else', %w'select distinct columns from join where group having compounds order limit lock']])
|
1272
1264
|
Dataset.def_sql_method(self, :update, [['if server_version >= 90100', %w'with update table set from where returning'], ['else', %w'update table set from where returning']])
|
1273
1265
|
|
1274
|
-
# Shared methods for prepared statements when used with PostgreSQL databases.
|
1275
|
-
module PreparedStatementMethods
|
1276
|
-
# Override insert action to use RETURNING if the server supports it.
|
1277
|
-
def run
|
1278
|
-
if @prepared_type == :insert && (opts[:returning_pk] || !opts[:returning])
|
1279
|
-
fetch_rows(prepared_sql){|r| return r.values.first}
|
1280
|
-
else
|
1281
|
-
super
|
1282
|
-
end
|
1283
|
-
end
|
1284
|
-
|
1285
|
-
def prepared_sql
|
1286
|
-
return @prepared_sql if @prepared_sql
|
1287
|
-
if @prepared_type == :insert && !opts[:returning]
|
1288
|
-
@opts[:returning] = insert_pk
|
1289
|
-
@opts[:returning_pk] = true
|
1290
|
-
end
|
1291
|
-
super
|
1292
|
-
@prepared_sql
|
1293
|
-
end
|
1294
|
-
end
|
1295
|
-
|
1296
1266
|
# Return the results of an EXPLAIN ANALYZE query as a string
|
1297
1267
|
def analyze
|
1298
1268
|
explain(:analyze=>true)
|
@@ -1819,6 +1789,14 @@ module Sequel
|
|
1819
1789
|
true
|
1820
1790
|
end
|
1821
1791
|
|
1792
|
+
def to_prepared_statement(type, *a)
|
1793
|
+
if type == :insert && !@opts.has_key?(:returning)
|
1794
|
+
returning(insert_pk).send(:to_prepared_statement, :insert_pk, *a)
|
1795
|
+
else
|
1796
|
+
super
|
1797
|
+
end
|
1798
|
+
end
|
1799
|
+
|
1822
1800
|
# Concatenate the expressions with a space in between
|
1823
1801
|
def full_text_string_join(cols)
|
1824
1802
|
cols = Array(cols).map{|x| SQL::Function.new(:COALESCE, x, EMPTY_STRING)}
|