sequel 4.41.0 → 4.42.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.
- 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)}
|