sequel 5.8.0 → 5.38.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 +409 -1795
- data/MIT-LICENSE +1 -1
- data/README.rdoc +4 -4
- data/bin/sequel +4 -0
- data/doc/advanced_associations.rdoc +136 -18
- data/doc/association_basics.rdoc +10 -5
- data/doc/cheat_sheet.rdoc +1 -0
- data/doc/code_order.rdoc +12 -2
- data/doc/dataset_filtering.rdoc +17 -2
- data/doc/mass_assignment.rdoc +3 -3
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +30 -8
- data/doc/postgresql.rdoc +107 -2
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.38.0.txt +28 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/security.rdoc +10 -0
- data/doc/sharding.rdoc +42 -28
- data/doc/sql.rdoc +12 -0
- data/doc/testing.rdoc +24 -17
- data/doc/transactions.rdoc +78 -0
- data/doc/validations.rdoc +2 -2
- data/lib/sequel/adapters/ado.rb +26 -18
- data/lib/sequel/adapters/ado/access.rb +2 -2
- data/lib/sequel/adapters/ado/mssql.rb +5 -8
- data/lib/sequel/adapters/amalgalite.rb +1 -1
- data/lib/sequel/adapters/jdbc.rb +71 -27
- data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
- data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
- data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
- data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
- data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
- data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
- data/lib/sequel/adapters/mysql.rb +14 -15
- data/lib/sequel/adapters/mysql2.rb +5 -3
- data/lib/sequel/adapters/odbc.rb +4 -6
- data/lib/sequel/adapters/oracle.rb +7 -7
- data/lib/sequel/adapters/postgres.rb +52 -16
- data/lib/sequel/adapters/shared/access.rb +16 -12
- data/lib/sequel/adapters/shared/db2.rb +5 -0
- data/lib/sequel/adapters/shared/mssql.rb +41 -18
- data/lib/sequel/adapters/shared/mysql.rb +66 -19
- data/lib/sequel/adapters/shared/oracle.rb +29 -23
- data/lib/sequel/adapters/shared/postgres.rb +341 -95
- data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
- data/lib/sequel/adapters/shared/sqlite.rb +174 -21
- data/lib/sequel/adapters/sqlanywhere.rb +33 -17
- data/lib/sequel/adapters/sqlite.rb +78 -68
- data/lib/sequel/adapters/tinytds.rb +14 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
- data/lib/sequel/connection_pool.rb +2 -6
- data/lib/sequel/connection_pool/sharded_single.rb +7 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +26 -11
- data/lib/sequel/core.rb +327 -319
- data/lib/sequel/database/connecting.rb +7 -8
- data/lib/sequel/database/logging.rb +7 -1
- data/lib/sequel/database/misc.rb +68 -34
- data/lib/sequel/database/query.rb +6 -4
- data/lib/sequel/database/schema_generator.rb +31 -11
- data/lib/sequel/database/schema_methods.rb +32 -22
- data/lib/sequel/database/transactions.rb +129 -25
- data/lib/sequel/dataset.rb +4 -2
- data/lib/sequel/dataset/actions.rb +34 -23
- data/lib/sequel/dataset/features.rb +34 -0
- data/lib/sequel/dataset/graph.rb +27 -11
- data/lib/sequel/dataset/misc.rb +17 -3
- data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
- data/lib/sequel/dataset/prepared_statements.rb +96 -26
- data/lib/sequel/dataset/query.rb +43 -8
- data/lib/sequel/dataset/sql.rb +189 -41
- data/lib/sequel/deprecated.rb +3 -1
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/_pretty_table.rb +1 -2
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/connection_expiration.rb +6 -6
- data/lib/sequel/extensions/connection_validator.rb +7 -6
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +53 -28
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +3 -1
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/index_caching.rb +9 -7
- data/lib/sequel/extensions/integer64.rb +3 -1
- data/lib/sequel/extensions/looser_typecasting.rb +3 -3
- data/lib/sequel/extensions/migration.rb +13 -6
- data/lib/sequel/extensions/named_timezones.rb +84 -23
- data/lib/sequel/extensions/pg_array.rb +87 -79
- data/lib/sequel/extensions/pg_array_ops.rb +14 -6
- data/lib/sequel/extensions/pg_enum.rb +34 -18
- data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
- data/lib/sequel/extensions/pg_inet.rb +15 -5
- data/lib/sequel/extensions/pg_interval.rb +2 -0
- data/lib/sequel/extensions/pg_json.rb +387 -123
- data/lib/sequel/extensions/pg_json_ops.rb +168 -0
- data/lib/sequel/extensions/pg_range.rb +20 -10
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +3 -2
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/query.rb +1 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +13 -7
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
- data/lib/sequel/extensions/server_block.rb +18 -7
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
- data/lib/sequel/extensions/to_dot.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- data/lib/sequel/model/associations.rb +403 -69
- data/lib/sequel/model/base.rb +170 -90
- data/lib/sequel/model/plugins.rb +105 -0
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +3 -3
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +74 -22
- data/lib/sequel/plugins/association_proxies.rb +6 -2
- data/lib/sequel/plugins/auto_validations.rb +36 -17
- data/lib/sequel/plugins/blacklist_security.rb +1 -2
- data/lib/sequel/plugins/boolean_subsets.rb +4 -1
- data/lib/sequel/plugins/caching.rb +3 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
- data/lib/sequel/plugins/composition.rb +13 -9
- data/lib/sequel/plugins/csv_serializer.rb +28 -9
- data/lib/sequel/plugins/defaults_setter.rb +2 -2
- data/lib/sequel/plugins/dirty.rb +60 -22
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/finder.rb +2 -2
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/hook_class_methods.rb +17 -5
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +2 -2
- data/lib/sequel/plugins/json_serializer.rb +21 -14
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/list.rb +22 -10
- data/lib/sequel/plugins/many_through_many.rb +1 -1
- data/lib/sequel/plugins/nested_attributes.rb +27 -5
- data/lib/sequel/plugins/pg_array_associations.rb +12 -9
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
- data/lib/sequel/plugins/prepared_statements.rb +6 -12
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +20 -22
- data/lib/sequel/plugins/sharding.rb +13 -7
- data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/static_cache.rb +36 -17
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +1 -1
- data/lib/sequel/plugins/subclasses.rb +2 -0
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/tree.rb +49 -31
- data/lib/sequel/plugins/typecast_on_load.rb +3 -2
- data/lib/sequel/plugins/validation_class_methods.rb +11 -5
- data/lib/sequel/plugins/validation_helpers.rb +2 -2
- data/lib/sequel/sql.rb +120 -30
- data/lib/sequel/timezones.rb +55 -14
- data/lib/sequel/version.rb +6 -1
- metadata +101 -361
- data/Rakefile +0 -151
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.37.0.txt +0 -50
- data/doc/release_notes/4.38.0.txt +0 -67
- data/doc/release_notes/4.39.0.txt +0 -127
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.40.0.txt +0 -179
- data/doc/release_notes/4.41.0.txt +0 -77
- data/doc/release_notes/4.42.0.txt +0 -221
- data/doc/release_notes/4.43.0.txt +0 -87
- data/doc/release_notes/4.44.0.txt +0 -125
- data/doc/release_notes/4.45.0.txt +0 -370
- data/doc/release_notes/4.46.0.txt +0 -404
- data/doc/release_notes/4.47.0.txt +0 -56
- data/doc/release_notes/4.48.0.txt +0 -293
- data/doc/release_notes/4.49.0.txt +0 -222
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -170
- data/spec/adapters/mssql_spec.rb +0 -804
- data/spec/adapters/mysql_spec.rb +0 -1041
- data/spec/adapters/oracle_spec.rb +0 -327
- data/spec/adapters/postgres_spec.rb +0 -4000
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -600
- data/spec/bin_spec.rb +0 -269
- data/spec/core/connection_pool_spec.rb +0 -1228
- data/spec/core/database_spec.rb +0 -2673
- data/spec/core/dataset_spec.rb +0 -5419
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1344
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -306
- data/spec/core/placeholder_literalizer_spec.rb +0 -166
- data/spec/core/schema_generator_spec.rb +0 -214
- data/spec/core/schema_spec.rb +0 -1820
- data/spec/core/spec_helper.rb +0 -23
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -762
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/deprecation_helper.rb +0 -30
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -99
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- data/spec/extensions/association_pks_spec.rb +0 -423
- data/spec/extensions/association_proxies_spec.rb +0 -100
- data/spec/extensions/auto_literal_strings_spec.rb +0 -205
- data/spec/extensions/auto_validations_spec.rb +0 -202
- data/spec/extensions/blacklist_security_spec.rb +0 -95
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -273
- data/spec/extensions/class_table_inheritance_spec.rb +0 -568
- data/spec/extensions/column_conflicts_spec.rb +0 -75
- data/spec/extensions/column_select_spec.rb +0 -129
- data/spec/extensions/columns_introspection_spec.rb +0 -90
- data/spec/extensions/columns_updated_spec.rb +0 -35
- data/spec/extensions/composition_spec.rb +0 -248
- data/spec/extensions/connection_expiration_spec.rb +0 -133
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -395
- data/spec/extensions/core_refinements_spec.rb +0 -528
- data/spec/extensions/csv_serializer_spec.rb +0 -183
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -365
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -181
- data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
- data/spec/extensions/def_dataset_method_spec.rb +0 -100
- data/spec/extensions/defaults_setter_spec.rb +0 -141
- data/spec/extensions/delay_add_association_spec.rb +0 -73
- data/spec/extensions/dirty_spec.rb +0 -189
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
- data/spec/extensions/eager_each_spec.rb +0 -62
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -74
- data/spec/extensions/finder_spec.rb +0 -260
- data/spec/extensions/force_encoding_spec.rb +0 -126
- data/spec/extensions/freeze_datasets_spec.rb +0 -31
- data/spec/extensions/graph_each_spec.rb +0 -113
- data/spec/extensions/hook_class_methods_spec.rb +0 -380
- data/spec/extensions/identifier_mangling_spec.rb +0 -201
- data/spec/extensions/implicit_subquery_spec.rb +0 -58
- data/spec/extensions/index_caching_spec.rb +0 -66
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -69
- data/spec/extensions/insert_returning_select_spec.rb +0 -72
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -246
- data/spec/extensions/integer64_spec.rb +0 -22
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -336
- data/spec/extensions/lazy_attributes_spec.rb +0 -183
- data/spec/extensions/list_spec.rb +0 -275
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2177
- data/spec/extensions/migration_spec.rb +0 -840
- data/spec/extensions/modification_detection_spec.rb +0 -93
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
- data/spec/extensions/named_timezones_spec.rb +0 -109
- data/spec/extensions/nested_attributes_spec.rb +0 -703
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -127
- data/spec/extensions/pagination_spec.rb +0 -116
- data/spec/extensions/pg_array_associations_spec.rb +0 -802
- data/spec/extensions/pg_array_ops_spec.rb +0 -144
- data/spec/extensions/pg_array_spec.rb +0 -398
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -165
- data/spec/extensions/pg_enum_spec.rb +0 -113
- data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
- data/spec/extensions/pg_hstore_spec.rb +0 -219
- data/spec/extensions/pg_inet_ops_spec.rb +0 -102
- data/spec/extensions/pg_inet_spec.rb +0 -72
- data/spec/extensions/pg_interval_spec.rb +0 -103
- data/spec/extensions/pg_json_ops_spec.rb +0 -289
- data/spec/extensions/pg_json_spec.rb +0 -262
- data/spec/extensions/pg_loose_count_spec.rb +0 -23
- data/spec/extensions/pg_range_ops_spec.rb +0 -60
- data/spec/extensions/pg_range_spec.rb +0 -487
- data/spec/extensions/pg_row_ops_spec.rb +0 -61
- data/spec/extensions/pg_row_plugin_spec.rb +0 -60
- data/spec/extensions/pg_row_spec.rb +0 -363
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
- data/spec/extensions/pg_timestamptz_spec.rb +0 -17
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
- data/spec/extensions/prepared_statements_spec.rb +0 -182
- data/spec/extensions/pretty_table_spec.rb +0 -123
- data/spec/extensions/query_spec.rb +0 -94
- data/spec/extensions/rcte_tree_spec.rb +0 -381
- data/spec/extensions/round_timestamps_spec.rb +0 -39
- data/spec/extensions/s_spec.rb +0 -60
- data/spec/extensions/schema_caching_spec.rb +0 -64
- data/spec/extensions/schema_dumper_spec.rb +0 -868
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -365
- data/spec/extensions/server_block_spec.rb +0 -97
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -189
- data/spec/extensions/shared_caching_spec.rb +0 -151
- data/spec/extensions/single_table_inheritance_spec.rb +0 -347
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -18
- data/spec/extensions/spec_helper.rb +0 -61
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -57
- data/spec/extensions/sql_comments_spec.rb +0 -33
- data/spec/extensions/sql_expr_spec.rb +0 -59
- data/spec/extensions/static_cache_spec.rb +0 -410
- data/spec/extensions/string_agg_spec.rb +0 -90
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -79
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
- data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
- data/spec/extensions/synchronize_sql_spec.rb +0 -124
- data/spec/extensions/table_select_spec.rb +0 -83
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -141
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -209
- data/spec/extensions/to_dot_spec.rb +0 -153
- data/spec/extensions/touch_spec.rb +0 -226
- data/spec/extensions/tree_spec.rb +0 -284
- data/spec/extensions/typecast_on_load_spec.rb +0 -86
- data/spec/extensions/unlimited_update_spec.rb +0 -21
- data/spec/extensions/update_or_create_spec.rb +0 -83
- data/spec/extensions/update_primary_key_spec.rb +0 -105
- data/spec/extensions/update_refresh_spec.rb +0 -59
- data/spec/extensions/uuid_spec.rb +0 -101
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1040
- data/spec/extensions/validation_contexts_spec.rb +0 -31
- data/spec/extensions/validation_helpers_spec.rb +0 -525
- data/spec/extensions/whitelist_security_spec.rb +0 -157
- data/spec/extensions/xml_serializer_spec.rb +0 -213
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -58
- data/spec/integration/associations_test.rb +0 -2513
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1880
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -203
- data/spec/integration/plugin_test.rb +0 -2302
- data/spec/integration/prepared_statement_test.rb +0 -398
- data/spec/integration/schema_test.rb +0 -869
- data/spec/integration/spec_helper.rb +0 -64
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -354
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4538
- data/spec/model/base_spec.rb +0 -817
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -198
- data/spec/model/eager_loading_spec.rb +0 -2262
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -953
- data/spec/model/plugins_spec.rb +0 -318
- data/spec/model/record_spec.rb +0 -2107
- data/spec/model/spec_helper.rb +0 -45
- data/spec/model/validations_spec.rb +0 -193
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/sequel_warning.rb +0 -4
- data/spec/spec_config.rb +0 -12
|
@@ -23,15 +23,6 @@ module Sequel
|
|
|
23
23
|
to_application_timestamp(v.to_s) if v
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
# Convert smallint type to boolean if convert_smallint_to_bool is true
|
|
27
|
-
def schema_column_type(db_type)
|
|
28
|
-
if convert_smallint_to_bool && db_type =~ /smallint/i
|
|
29
|
-
:boolean
|
|
30
|
-
else
|
|
31
|
-
super
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
26
|
def schema_parse_table(table, opts)
|
|
36
27
|
m = output_identifier_meth(opts[:dataset])
|
|
37
28
|
im = input_identifier_meth(opts[:dataset])
|
|
@@ -216,6 +207,15 @@ module Sequel
|
|
|
216
207
|
"ALTER TABLE #{quote_schema_table(name)} RENAME #{quote_schema_table(new_name)}"
|
|
217
208
|
end
|
|
218
209
|
|
|
210
|
+
# Convert smallint type to boolean if convert_smallint_to_bool is true
|
|
211
|
+
def schema_column_type(db_type)
|
|
212
|
+
if convert_smallint_to_bool && db_type =~ /smallint/i
|
|
213
|
+
:boolean
|
|
214
|
+
else
|
|
215
|
+
super
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
219
|
def tables_and_views(type, opts=OPTS)
|
|
220
220
|
m = output_identifier_meth
|
|
221
221
|
metadata_dataset.
|
|
@@ -233,7 +233,7 @@ module Sequel
|
|
|
233
233
|
|
|
234
234
|
module DatasetMethods
|
|
235
235
|
Dataset.def_sql_method(self, :insert, %w'insert into columns values')
|
|
236
|
-
Dataset.def_sql_method(self, :select, %w'with select distinct limit columns into from join where group having compounds order lock')
|
|
236
|
+
Dataset.def_sql_method(self, :select, %w'with select distinct limit columns into from join where group having window compounds order lock')
|
|
237
237
|
|
|
238
238
|
# Whether to convert smallint to boolean arguments for this dataset.
|
|
239
239
|
# Defaults to the IBMDB module setting.
|
|
@@ -275,6 +275,14 @@ module Sequel
|
|
|
275
275
|
false
|
|
276
276
|
end
|
|
277
277
|
|
|
278
|
+
def supports_window_clause?
|
|
279
|
+
true
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
def supports_window_functions?
|
|
283
|
+
true
|
|
284
|
+
end
|
|
285
|
+
|
|
278
286
|
# Uses CROSS APPLY to join the given table into the current dataset.
|
|
279
287
|
def cross_apply(table)
|
|
280
288
|
join_table(:cross_apply, table)
|
|
@@ -389,6 +397,11 @@ module Sequel
|
|
|
389
397
|
:values
|
|
390
398
|
end
|
|
391
399
|
|
|
400
|
+
# SQLAnywhere does not natively support NULLS FIRST/LAST.
|
|
401
|
+
def requires_emulating_nulls_first?
|
|
402
|
+
true
|
|
403
|
+
end
|
|
404
|
+
|
|
392
405
|
def select_into_sql(sql)
|
|
393
406
|
if i = @opts[:into]
|
|
394
407
|
sql << " INTO "
|
|
@@ -10,6 +10,11 @@ module Sequel
|
|
|
10
10
|
def self.mock_adapter_setup(db)
|
|
11
11
|
db.instance_exec do
|
|
12
12
|
@sqlite_version = 30903
|
|
13
|
+
|
|
14
|
+
def schema_parse_table(*)
|
|
15
|
+
[]
|
|
16
|
+
end
|
|
17
|
+
singleton_class.send(:private, :schema_parse_table)
|
|
13
18
|
end
|
|
14
19
|
end
|
|
15
20
|
|
|
@@ -33,6 +38,10 @@ module Sequel
|
|
|
33
38
|
# booleans be stored as integers, but historically Sequel has used 't'/'f'.
|
|
34
39
|
attr_accessor :integer_booleans
|
|
35
40
|
|
|
41
|
+
# Whether to keep CURRENT_TIMESTAMP and similar expressions in UTC. By
|
|
42
|
+
# default, the expressions are converted to localtime.
|
|
43
|
+
attr_accessor :current_timestamp_utc
|
|
44
|
+
|
|
36
45
|
# A symbol signifying the value of the default transaction mode
|
|
37
46
|
attr_reader :transaction_mode
|
|
38
47
|
|
|
@@ -60,7 +69,7 @@ module Sequel
|
|
|
60
69
|
def foreign_key_list(table, opts=OPTS)
|
|
61
70
|
m = output_identifier_meth
|
|
62
71
|
h = {}
|
|
63
|
-
|
|
72
|
+
_foreign_key_list_ds(table).each do |row|
|
|
64
73
|
if r = h[row[:id]]
|
|
65
74
|
r[:columns] << m.call(row[:from])
|
|
66
75
|
r[:key] << m.call(row[:to]) if r[:key]
|
|
@@ -173,11 +182,24 @@ module Sequel
|
|
|
173
182
|
|
|
174
183
|
private
|
|
175
184
|
|
|
185
|
+
# Dataset used for parsing foreign key lists
|
|
186
|
+
def _foreign_key_list_ds(table)
|
|
187
|
+
metadata_dataset.with_sql("PRAGMA foreign_key_list(?)", input_identifier_meth.call(table))
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
# Dataset used for parsing schema
|
|
191
|
+
def _parse_pragma_ds(table_name, opts)
|
|
192
|
+
metadata_dataset.with_sql("PRAGMA table_#{'x' if sqlite_version > 33100}info(?)", input_identifier_meth(opts[:dataset]).call(table_name))
|
|
193
|
+
end
|
|
194
|
+
|
|
176
195
|
# Run all alter_table commands in a transaction. This is technically only
|
|
177
196
|
# needed for drop column.
|
|
178
197
|
def apply_alter_table(table, ops)
|
|
179
198
|
fks = fetch("PRAGMA foreign_keys")
|
|
180
|
-
|
|
199
|
+
if fks
|
|
200
|
+
run "PRAGMA foreign_keys = 0"
|
|
201
|
+
run "PRAGMA legacy_alter_table = 1" if sqlite_version >= 32600
|
|
202
|
+
end
|
|
181
203
|
transaction do
|
|
182
204
|
if ops.length > 1 && ops.all?{|op| op[:op] == :add_constraint || op[:op] == :set_column_null}
|
|
183
205
|
null_ops, ops = ops.partition{|op| op[:op] == :set_column_null}
|
|
@@ -196,7 +218,10 @@ module Sequel
|
|
|
196
218
|
end
|
|
197
219
|
remove_cached_schema(table)
|
|
198
220
|
ensure
|
|
199
|
-
|
|
221
|
+
if fks
|
|
222
|
+
run "PRAGMA foreign_keys = 1"
|
|
223
|
+
run "PRAGMA legacy_alter_table = 0" if sqlite_version >= 32600
|
|
224
|
+
end
|
|
200
225
|
end
|
|
201
226
|
|
|
202
227
|
# SQLite supports limited table modification. You can add a column
|
|
@@ -217,8 +242,12 @@ module Sequel
|
|
|
217
242
|
ocp = lambda{|oc| oc.delete_if{|c| c.to_s == op[:name].to_s}}
|
|
218
243
|
duplicate_table(table, :old_columns_proc=>ocp){|columns| columns.delete_if{|s| s[:name].to_s == op[:name].to_s}}
|
|
219
244
|
when :rename_column
|
|
220
|
-
|
|
221
|
-
|
|
245
|
+
if sqlite_version >= 32500
|
|
246
|
+
super
|
|
247
|
+
else
|
|
248
|
+
ncp = lambda{|nc| nc.map!{|c| c.to_s == op[:name].to_s ? op[:new_name] : c}}
|
|
249
|
+
duplicate_table(table, :new_columns_proc=>ncp){|columns| columns.each{|s| s[:name] = op[:new_name] if s[:name].to_s == op[:name].to_s}}
|
|
250
|
+
end
|
|
222
251
|
when :set_column_default
|
|
223
252
|
duplicate_table(table){|columns| columns.each{|s| s[:default] = op[:default] if s[:name].to_s == op[:name].to_s}}
|
|
224
253
|
when :set_column_null
|
|
@@ -228,13 +257,20 @@ module Sequel
|
|
|
228
257
|
when :drop_constraint
|
|
229
258
|
case op[:type]
|
|
230
259
|
when :primary_key
|
|
231
|
-
duplicate_table(table)
|
|
260
|
+
duplicate_table(table) do |columns|
|
|
261
|
+
columns.each do |s|
|
|
262
|
+
s[:unique] = false if s[:primary_key]
|
|
263
|
+
s[:primary_key] = s[:auto_increment] = nil
|
|
264
|
+
end
|
|
265
|
+
end
|
|
232
266
|
when :foreign_key
|
|
233
267
|
if op[:columns]
|
|
234
268
|
duplicate_table(table, :skip_foreign_key_columns=>op[:columns])
|
|
235
269
|
else
|
|
236
270
|
duplicate_table(table, :no_foreign_keys=>true)
|
|
237
271
|
end
|
|
272
|
+
when :unique
|
|
273
|
+
duplicate_table(table, :no_unique=>true)
|
|
238
274
|
else
|
|
239
275
|
duplicate_table(table)
|
|
240
276
|
end
|
|
@@ -269,9 +305,15 @@ module Sequel
|
|
|
269
305
|
false
|
|
270
306
|
end
|
|
271
307
|
|
|
272
|
-
# Surround default with parens to appease SQLite
|
|
308
|
+
# Surround default with parens to appease SQLite. Add support for GENERATED ALWAYS AS.
|
|
273
309
|
def column_definition_default_sql(sql, column)
|
|
274
310
|
sql << " DEFAULT (#{literal(column[:default])})" if column.include?(:default)
|
|
311
|
+
if (generated = column[:generated_always_as])
|
|
312
|
+
if (generated_type = column[:generated_type]) && (generated_type == :stored || generated_type == :virtual)
|
|
313
|
+
generated_type = generated_type.to_s.upcase
|
|
314
|
+
end
|
|
315
|
+
sql << " GENERATED ALWAYS AS (#{literal(generated)}) #{generated_type}"
|
|
316
|
+
end
|
|
275
317
|
end
|
|
276
318
|
|
|
277
319
|
# Array of PRAGMA SQL statements based on the Database options that should be applied to
|
|
@@ -299,7 +341,7 @@ module Sequel
|
|
|
299
341
|
DATABASE_ERROR_REGEXPS = {
|
|
300
342
|
/(is|are) not unique\z|PRIMARY KEY must be unique\z|UNIQUE constraint failed: .+\z/ => UniqueConstraintViolation,
|
|
301
343
|
/foreign key constraint failed\z/i => ForeignKeyConstraintViolation,
|
|
302
|
-
/\
|
|
344
|
+
/\A(SQLITE ERROR 275 \(CONSTRAINT_CHECK\) : )?CHECK constraint failed/ => CheckConstraintViolation,
|
|
303
345
|
/\A(SQLITE ERROR 19 \(CONSTRAINT\) : )?constraint failed\z/ => ConstraintViolation,
|
|
304
346
|
/may not be NULL\z|NOT NULL constraint failed: .+\z/ => NotNullConstraintViolation,
|
|
305
347
|
/\ASQLITE ERROR \d+ \(\) : CHECK constraint failed: / => CheckConstraintViolation
|
|
@@ -313,7 +355,7 @@ module Sequel
|
|
|
313
355
|
case sqlite_error_code(exception)
|
|
314
356
|
when 1299
|
|
315
357
|
NotNullConstraintViolation
|
|
316
|
-
when 2067
|
|
358
|
+
when 1555, 2067, 2579
|
|
317
359
|
UniqueConstraintViolation
|
|
318
360
|
when 787
|
|
319
361
|
ForeignKeyConstraintViolation
|
|
@@ -321,6 +363,8 @@ module Sequel
|
|
|
321
363
|
CheckConstraintViolation
|
|
322
364
|
when 19
|
|
323
365
|
ConstraintViolation
|
|
366
|
+
when 517
|
|
367
|
+
SerializationFailure
|
|
324
368
|
else
|
|
325
369
|
super
|
|
326
370
|
end
|
|
@@ -328,7 +372,7 @@ module Sequel
|
|
|
328
372
|
|
|
329
373
|
# The array of column schema hashes for the current columns in the table
|
|
330
374
|
def defined_columns_for(table)
|
|
331
|
-
cols = parse_pragma(table,
|
|
375
|
+
cols = parse_pragma(table, OPTS)
|
|
332
376
|
cols.each do |c|
|
|
333
377
|
c[:default] = LiteralString.new(c[:default]) if c[:default]
|
|
334
378
|
c[:type] = c[:db_type]
|
|
@@ -380,15 +424,19 @@ module Sequel
|
|
|
380
424
|
skip_indexes = []
|
|
381
425
|
indexes(table, :only_autocreated=>true).each do |name, h|
|
|
382
426
|
skip_indexes << name
|
|
383
|
-
if h[:
|
|
384
|
-
|
|
427
|
+
if h[:unique]
|
|
428
|
+
if h[:columns].length == 1
|
|
429
|
+
unique_columns.concat(h[:columns])
|
|
430
|
+
elsif h[:columns].map(&:to_s) != pks && !opts[:no_unique]
|
|
431
|
+
constraints << {:type=>:unique, :columns=>h[:columns]}
|
|
432
|
+
end
|
|
385
433
|
end
|
|
386
434
|
end
|
|
387
435
|
unique_columns -= pks
|
|
388
436
|
unless unique_columns.empty?
|
|
389
437
|
unique_columns.map!{|c| quote_identifier(c)}
|
|
390
438
|
def_columns.each do |c|
|
|
391
|
-
c[:unique] = true if unique_columns.include?(quote_identifier(c[:name]))
|
|
439
|
+
c[:unique] = true if unique_columns.include?(quote_identifier(c[:name])) && c[:unique] != false
|
|
392
440
|
end
|
|
393
441
|
end
|
|
394
442
|
|
|
@@ -433,7 +481,16 @@ module Sequel
|
|
|
433
481
|
# Parse the output of the table_info pragma
|
|
434
482
|
def parse_pragma(table_name, opts)
|
|
435
483
|
pks = 0
|
|
436
|
-
sch =
|
|
484
|
+
sch = _parse_pragma_ds(table_name, opts).map do |row|
|
|
485
|
+
if sqlite_version > 33100
|
|
486
|
+
# table_xinfo PRAGMA used, remove hidden columns
|
|
487
|
+
# that are not generated columns
|
|
488
|
+
if row[:generated] = (row.delete(:hidden) != 0)
|
|
489
|
+
next unless row[:type].end_with?(' GENERATED ALWAYS')
|
|
490
|
+
row[:type] = row[:type].sub(' GENERATED ALWAYS', '')
|
|
491
|
+
end
|
|
492
|
+
end
|
|
493
|
+
|
|
437
494
|
row.delete(:cid)
|
|
438
495
|
row[:allow_null] = row.delete(:notnull).to_i == 0
|
|
439
496
|
row[:default] = row.delete(:dflt_value)
|
|
@@ -450,6 +507,8 @@ module Sequel
|
|
|
450
507
|
row
|
|
451
508
|
end
|
|
452
509
|
|
|
510
|
+
sch.compact!
|
|
511
|
+
|
|
453
512
|
if pks > 1
|
|
454
513
|
# SQLite does not allow use of auto increment for tables
|
|
455
514
|
# with composite primary keys, so remove auto_increment
|
|
@@ -500,8 +559,8 @@ module Sequel
|
|
|
500
559
|
EXTRACT_MAP.each_value(&:freeze)
|
|
501
560
|
|
|
502
561
|
Dataset.def_sql_method(self, :delete, [['if db.sqlite_version >= 30803', %w'with delete from where'], ["else", %w'delete from where']])
|
|
503
|
-
Dataset.def_sql_method(self, :insert, [['if db.sqlite_version >= 30803', %w'with insert conflict into columns values'], ["else", %w'insert conflict into columns values']])
|
|
504
|
-
Dataset.def_sql_method(self, :select, [['if opts[:values]', %w'with values compounds'], ['else', %w'with select distinct columns from join where group having compounds order limit lock']])
|
|
562
|
+
Dataset.def_sql_method(self, :insert, [['if db.sqlite_version >= 30803', %w'with insert conflict into columns values on_conflict'], ["else", %w'insert conflict into columns values']])
|
|
563
|
+
Dataset.def_sql_method(self, :select, [['if opts[:values]', %w'with values compounds'], ['else', %w'with select distinct columns from join where group having window compounds order limit lock']])
|
|
505
564
|
Dataset.def_sql_method(self, :update, [['if db.sqlite_version >= 30803', %w'with update table set where'], ["else", %w'update table set where']])
|
|
506
565
|
|
|
507
566
|
def cast_sql_append(sql, expr, type)
|
|
@@ -566,7 +625,7 @@ module Sequel
|
|
|
566
625
|
# SQLite has CURRENT_TIMESTAMP and related constants in UTC instead
|
|
567
626
|
# of in localtime, so convert those constants to local time.
|
|
568
627
|
def constant_sql_append(sql, constant)
|
|
569
|
-
if c = CONSTANT_MAP[constant]
|
|
628
|
+
if (c = CONSTANT_MAP[constant]) && !db.current_timestamp_utc
|
|
570
629
|
sql << c
|
|
571
630
|
else
|
|
572
631
|
super
|
|
@@ -620,6 +679,14 @@ module Sequel
|
|
|
620
679
|
# supports the following conflict resolution algoriths: ROLLBACK, ABORT,
|
|
621
680
|
# FAIL, IGNORE and REPLACE.
|
|
622
681
|
#
|
|
682
|
+
# On SQLite 3.24.0+, you can pass a hash to use an ON CONFLICT clause.
|
|
683
|
+
# With out :update option, uses ON CONFLICT DO NOTHING. Options:
|
|
684
|
+
#
|
|
685
|
+
# :conflict_where :: The index filter, when using a partial index to determine uniqueness.
|
|
686
|
+
# :target :: The column name or expression to handle uniqueness violations on.
|
|
687
|
+
# :update :: A hash of columns and values to set. Uses ON CONFLICT DO UPDATE.
|
|
688
|
+
# :update_where :: A WHERE condition to use for the update.
|
|
689
|
+
#
|
|
623
690
|
# Examples:
|
|
624
691
|
#
|
|
625
692
|
# DB[:table].insert_conflict.insert(a: 1, b: 2)
|
|
@@ -627,11 +694,39 @@ module Sequel
|
|
|
627
694
|
#
|
|
628
695
|
# DB[:table].insert_conflict(:replace).insert(a: 1, b: 2)
|
|
629
696
|
# # INSERT OR REPLACE INTO TABLE (a, b) VALUES (1, 2)
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
697
|
+
#
|
|
698
|
+
# DB[:table].insert_conflict({}).insert(a: 1, b: 2)
|
|
699
|
+
# # INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
700
|
+
# # ON CONFLICT DO NOTHING
|
|
701
|
+
#
|
|
702
|
+
# DB[:table].insert_conflict(target: :a).insert(a: 1, b: 2)
|
|
703
|
+
# # INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
704
|
+
# # ON CONFLICT (a) DO NOTHING
|
|
705
|
+
#
|
|
706
|
+
# DB[:table].insert_conflict(target: :a, conflict_where: {c: true}).insert(a: 1, b: 2)
|
|
707
|
+
# # INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
708
|
+
# # ON CONFLICT (a) WHERE (c IS TRUE) DO NOTHING
|
|
709
|
+
#
|
|
710
|
+
# DB[:table].insert_conflict(target: :a, update: {b: Sequel[:excluded][:b]}).insert(a: 1, b: 2)
|
|
711
|
+
# # INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
712
|
+
# # ON CONFLICT (a) DO UPDATE SET b = excluded.b
|
|
713
|
+
#
|
|
714
|
+
# DB[:table].insert_conflict(target: :a,
|
|
715
|
+
# update: {b: Sequel[:excluded][:b]}, update_where: {Sequel[:table][:status_id] => 1}).insert(a: 1, b: 2)
|
|
716
|
+
# # INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
717
|
+
# # ON CONFLICT (a) DO UPDATE SET b = excluded.b WHERE (table.status_id = 1)
|
|
718
|
+
def insert_conflict(opts = :ignore)
|
|
719
|
+
case opts
|
|
720
|
+
when Symbol, String
|
|
721
|
+
unless INSERT_CONFLICT_RESOLUTIONS.include?(opts.to_s.upcase)
|
|
722
|
+
raise Error, "Invalid symbol or string passed to Dataset#insert_conflict: #{opts.inspect}. The allowed values are: :rollback, :abort, :fail, :ignore, or :replace"
|
|
723
|
+
end
|
|
724
|
+
clone(:insert_conflict => opts)
|
|
725
|
+
when Hash
|
|
726
|
+
clone(:insert_on_conflict => opts)
|
|
727
|
+
else
|
|
728
|
+
raise Error, "Invalid value passed to Dataset#insert_conflict: #{opts.inspect}, should use a symbol or a hash"
|
|
633
729
|
end
|
|
634
|
-
clone(:insert_conflict => resolution)
|
|
635
730
|
end
|
|
636
731
|
|
|
637
732
|
# Ignore uniqueness/exclusion violations when inserting, using INSERT OR IGNORE.
|
|
@@ -684,7 +779,25 @@ module Sequel
|
|
|
684
779
|
def supports_where_true?
|
|
685
780
|
false
|
|
686
781
|
end
|
|
782
|
+
|
|
783
|
+
# SQLite 3.28+ supports the WINDOW clause.
|
|
784
|
+
def supports_window_clause?
|
|
785
|
+
db.sqlite_version >= 32800
|
|
786
|
+
end
|
|
687
787
|
|
|
788
|
+
# SQLite 3.25+ supports window functions. However, support is only enabled
|
|
789
|
+
# on SQLite 3.26.0+ because internal Sequel usage of window functions
|
|
790
|
+
# to implement eager loading of limited associations triggers
|
|
791
|
+
# an SQLite crash bug in versions 3.25.0-3.25.3.
|
|
792
|
+
def supports_window_functions?
|
|
793
|
+
db.sqlite_version >= 32600
|
|
794
|
+
end
|
|
795
|
+
|
|
796
|
+
# SQLite 3.28.0+ supports all window frame options that Sequel supports
|
|
797
|
+
def supports_window_function_frame_option?(option)
|
|
798
|
+
db.sqlite_version >= 32800 ? true : super
|
|
799
|
+
end
|
|
800
|
+
|
|
688
801
|
private
|
|
689
802
|
|
|
690
803
|
# SQLite uses string literals instead of identifiers in AS clauses.
|
|
@@ -729,6 +842,36 @@ module Sequel
|
|
|
729
842
|
end
|
|
730
843
|
end
|
|
731
844
|
|
|
845
|
+
# Add ON CONFLICT clause if it should be used
|
|
846
|
+
def insert_on_conflict_sql(sql)
|
|
847
|
+
if opts = @opts[:insert_on_conflict]
|
|
848
|
+
sql << " ON CONFLICT"
|
|
849
|
+
|
|
850
|
+
if target = opts[:constraint]
|
|
851
|
+
sql << " ON CONSTRAINT "
|
|
852
|
+
identifier_append(sql, target)
|
|
853
|
+
elsif target = opts[:target]
|
|
854
|
+
sql << ' '
|
|
855
|
+
identifier_append(sql, Array(target))
|
|
856
|
+
if conflict_where = opts[:conflict_where]
|
|
857
|
+
sql << " WHERE "
|
|
858
|
+
literal_append(sql, conflict_where)
|
|
859
|
+
end
|
|
860
|
+
end
|
|
861
|
+
|
|
862
|
+
if values = opts[:update]
|
|
863
|
+
sql << " DO UPDATE SET "
|
|
864
|
+
update_sql_values_hash(sql, values)
|
|
865
|
+
if update_where = opts[:update_where]
|
|
866
|
+
sql << " WHERE "
|
|
867
|
+
literal_append(sql, update_where)
|
|
868
|
+
end
|
|
869
|
+
else
|
|
870
|
+
sql << " DO NOTHING"
|
|
871
|
+
end
|
|
872
|
+
end
|
|
873
|
+
end
|
|
874
|
+
|
|
732
875
|
# SQLite uses a preceding X for hex escaping strings
|
|
733
876
|
def literal_blob_append(sql, v)
|
|
734
877
|
sql << "X'" << v.unpack("H*").first << "'"
|
|
@@ -759,6 +902,11 @@ module Sequel
|
|
|
759
902
|
end
|
|
760
903
|
end
|
|
761
904
|
|
|
905
|
+
# SQLite supports NULLS FIRST/LAST natively in 3.30+.
|
|
906
|
+
def requires_emulating_nulls_first?
|
|
907
|
+
db.sqlite_version < 33000
|
|
908
|
+
end
|
|
909
|
+
|
|
762
910
|
# SQLite does not support FOR UPDATE, but silently ignore it
|
|
763
911
|
# instead of raising an error for compatibility with other
|
|
764
912
|
# databases.
|
|
@@ -782,6 +930,11 @@ module Sequel
|
|
|
782
930
|
false
|
|
783
931
|
end
|
|
784
932
|
|
|
933
|
+
# SQLite 3.30 supports the FILTER clause for aggregate functions.
|
|
934
|
+
def supports_filtered_aggregates?
|
|
935
|
+
db.sqlite_version >= 33000
|
|
936
|
+
end
|
|
937
|
+
|
|
785
938
|
# SQLite supports quoted function names.
|
|
786
939
|
def supports_quoted_function_names?
|
|
787
940
|
true
|
|
@@ -17,21 +17,34 @@ module Sequel
|
|
|
17
17
|
end
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
boolean = Object.new
|
|
21
|
+
def boolean.call(s)
|
|
22
|
+
s.to_i != 0
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
date = Object.new
|
|
26
|
+
def date.call(s)
|
|
27
|
+
::Date.strptime(s)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
decimal = Object.new
|
|
31
|
+
class << decimal
|
|
32
|
+
alias call BigDecimal
|
|
33
|
+
public :call
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
time = Object.new
|
|
37
|
+
def time.call(s)
|
|
38
|
+
::Sequel.string_to_time(s)
|
|
39
|
+
end
|
|
27
40
|
|
|
28
41
|
SQLANYWHERE_TYPES = {}
|
|
29
42
|
{
|
|
30
|
-
[0, 484] =>
|
|
31
|
-
[384] =>
|
|
32
|
-
[388] =>
|
|
33
|
-
[500] =>
|
|
34
|
-
[524, 528] =>
|
|
43
|
+
[0, 484] => decimal,
|
|
44
|
+
[384] => date,
|
|
45
|
+
[388] => time,
|
|
46
|
+
[500] => boolean,
|
|
47
|
+
[524, 528] => ::Sequel::SQL::Blob
|
|
35
48
|
}.each do |k,v|
|
|
36
49
|
k.each{|n| SQLANYWHERE_TYPES[n] = v}
|
|
37
50
|
end
|
|
@@ -153,17 +166,20 @@ module Sequel
|
|
|
153
166
|
else
|
|
154
167
|
cps[type]
|
|
155
168
|
end
|
|
156
|
-
col_infos << [
|
|
169
|
+
col_infos << [output_identifier(name), cp]
|
|
157
170
|
end
|
|
158
171
|
|
|
159
|
-
self.columns = col_infos.map
|
|
172
|
+
self.columns = col_infos.map(&:first)
|
|
173
|
+
max = col_infos.length
|
|
160
174
|
|
|
161
175
|
if rs
|
|
162
176
|
while api.sqlany_fetch_next(rs) == 1
|
|
177
|
+
i = -1
|
|
163
178
|
h = {}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
179
|
+
while (i+=1) < max
|
|
180
|
+
name, cp = col_infos[i]
|
|
181
|
+
v = api.sqlany_get_column(rs, i)[1]
|
|
182
|
+
h[name] = cp && v ? cp.call(v) : v
|
|
167
183
|
end
|
|
168
184
|
yield h
|
|
169
185
|
end
|