sequel 4.49.0 → 5.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +130 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +6 -9
- data/doc/advanced_associations.rdoc +91 -168
- data/doc/association_basics.rdoc +197 -274
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +66 -43
- data/doc/code_order.rdoc +1 -8
- data/doc/core_extensions.rdoc +81 -56
- data/doc/dataset_basics.rdoc +8 -17
- data/doc/dataset_filtering.rdoc +81 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +73 -30
- data/doc/migration.rdoc +19 -36
- data/doc/model_dataset_method_design.rdoc +14 -17
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +10 -10
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +52 -70
- data/doc/opening_databases.rdoc +39 -32
- data/doc/postgresql.rdoc +48 -38
- data/doc/prepared_statements.rdoc +27 -22
- data/doc/querying.rdoc +173 -150
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/schema_modification.rdoc +78 -64
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +4 -5
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +18 -17
- data/doc/validations.rdoc +48 -45
- data/doc/virtual_rows.rdoc +87 -115
- data/lib/sequel/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- data/lib/sequel/adapters/jdbc/db2.rb +8 -37
- data/lib/sequel/adapters/jdbc/derby.rb +4 -50
- data/lib/sequel/adapters/jdbc/h2.rb +6 -26
- data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +11 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
- data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
- data/lib/sequel/adapters/jdbc.rb +18 -74
- data/lib/sequel/adapters/mock.rb +4 -30
- data/lib/sequel/adapters/mysql.rb +7 -44
- data/lib/sequel/adapters/mysql2.rb +5 -23
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +4 -12
- data/lib/sequel/adapters/odbc/oracle.rb +1 -1
- data/lib/sequel/adapters/odbc.rb +0 -19
- data/lib/sequel/adapters/oracle.rb +8 -13
- data/lib/sequel/adapters/postgres.rb +28 -150
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +11 -51
- data/lib/sequel/adapters/shared/db2.rb +3 -61
- data/lib/sequel/adapters/shared/mssql.rb +21 -157
- data/lib/sequel/adapters/shared/mysql.rb +61 -227
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +58 -264
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +22 -101
- data/lib/sequel/adapters/sqlanywhere.rb +4 -23
- data/lib/sequel/adapters/sqlite.rb +2 -19
- data/lib/sequel/adapters/tinytds.rb +5 -15
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -4
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
- data/lib/sequel/adapters/utils/replace.rb +0 -5
- data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
- data/lib/sequel/ast_transformer.rb +3 -94
- data/lib/sequel/connection_pool/sharded_single.rb +1 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
- data/lib/sequel/connection_pool/single.rb +0 -2
- data/lib/sequel/connection_pool/threaded.rb +94 -110
- data/lib/sequel/connection_pool.rb +38 -28
- data/lib/sequel/core.rb +42 -101
- data/lib/sequel/database/connecting.rb +23 -60
- data/lib/sequel/database/dataset.rb +6 -9
- data/lib/sequel/database/dataset_defaults.rb +4 -48
- data/lib/sequel/database/features.rb +5 -4
- data/lib/sequel/database/logging.rb +2 -9
- data/lib/sequel/database/misc.rb +36 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +93 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/database.rb +12 -2
- data/lib/sequel/dataset/actions.rb +57 -107
- data/lib/sequel/dataset/dataset_module.rb +4 -16
- data/lib/sequel/dataset/features.rb +35 -30
- data/lib/sequel/dataset/graph.rb +40 -49
- data/lib/sequel/dataset/misc.rb +12 -37
- data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
- data/lib/sequel/dataset/prepared_statements.rb +23 -51
- data/lib/sequel/dataset/query.rb +91 -161
- data/lib/sequel/dataset/sql.rb +33 -225
- data/lib/sequel/dataset.rb +18 -10
- data/lib/sequel/deprecated.rb +18 -27
- data/lib/sequel/exceptions.rb +1 -17
- data/lib/sequel/extensions/_model_pg_row.rb +0 -7
- data/lib/sequel/extensions/_pretty_table.rb +1 -3
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/connection_expiration.rb +1 -1
- data/lib/sequel/extensions/connection_validator.rb +1 -1
- data/lib/sequel/extensions/constraint_validations.rb +11 -11
- data/lib/sequel/extensions/core_extensions.rb +39 -49
- data/lib/sequel/extensions/core_refinements.rb +39 -45
- data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
- data/lib/sequel/extensions/date_arithmetic.rb +7 -7
- data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/eval_inspect.rb +4 -11
- data/lib/sequel/extensions/freeze_datasets.rb +1 -69
- data/lib/sequel/extensions/from_block.rb +1 -35
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/identifier_mangling.rb +9 -19
- data/lib/sequel/extensions/implicit_subquery.rb +2 -2
- data/lib/sequel/extensions/inflector.rb +4 -4
- data/lib/sequel/extensions/migration.rb +27 -43
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
- data/lib/sequel/extensions/null_dataset.rb +2 -8
- data/lib/sequel/extensions/pagination.rb +1 -17
- data/lib/sequel/extensions/pg_array.rb +20 -189
- data/lib/sequel/extensions/pg_extended_date_support.rb +230 -0
- data/lib/sequel/extensions/pg_hstore.rb +11 -50
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
- data/lib/sequel/extensions/pg_inet.rb +3 -16
- data/lib/sequel/extensions/pg_interval.rb +1 -20
- data/lib/sequel/extensions/pg_json.rb +7 -27
- data/lib/sequel/extensions/pg_loose_count.rb +1 -1
- data/lib/sequel/extensions/pg_range.rb +6 -121
- data/lib/sequel/extensions/pg_range_ops.rb +1 -3
- data/lib/sequel/extensions/pg_row.rb +5 -77
- data/lib/sequel/extensions/pg_row_ops.rb +2 -13
- data/lib/sequel/extensions/query.rb +3 -4
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/schema_dumper.rb +13 -13
- data/lib/sequel/extensions/select_remove.rb +3 -3
- data/lib/sequel/extensions/split_array_nil.rb +2 -2
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/symbol_aref.rb +6 -20
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/model/associations.rb +129 -131
- data/lib/sequel/model/base.rb +133 -731
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +0 -3
- data/lib/sequel/model/exceptions.rb +2 -6
- data/lib/sequel/model/inflections.rb +1 -26
- data/lib/sequel/model/plugins.rb +1 -0
- data/lib/sequel/model.rb +27 -62
- data/lib/sequel/plugins/active_model.rb +2 -5
- data/lib/sequel/plugins/association_dependencies.rb +15 -15
- data/lib/sequel/plugins/association_pks.rb +14 -28
- data/lib/sequel/plugins/association_proxies.rb +6 -7
- data/lib/sequel/plugins/auto_validations.rb +4 -4
- data/lib/sequel/plugins/before_after_save.rb +0 -43
- data/lib/sequel/plugins/blacklist_security.rb +9 -8
- data/lib/sequel/plugins/boolean_readers.rb +3 -3
- data/lib/sequel/plugins/boolean_subsets.rb +2 -2
- data/lib/sequel/plugins/caching.rb +5 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
- data/lib/sequel/plugins/column_conflicts.rb +2 -2
- data/lib/sequel/plugins/column_select.rb +2 -2
- data/lib/sequel/plugins/composition.rb +15 -24
- data/lib/sequel/plugins/constraint_validations.rb +4 -3
- data/lib/sequel/plugins/csv_serializer.rb +13 -20
- data/lib/sequel/plugins/dataset_associations.rb +2 -2
- data/lib/sequel/plugins/def_dataset_method.rb +5 -5
- data/lib/sequel/plugins/defaults_setter.rb +1 -1
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/finder.rb +16 -10
- data/lib/sequel/plugins/force_encoding.rb +1 -7
- data/lib/sequel/plugins/hook_class_methods.rb +4 -106
- data/lib/sequel/plugins/input_transformer.rb +10 -11
- data/lib/sequel/plugins/insert_returning_select.rb +1 -9
- data/lib/sequel/plugins/instance_filters.rb +5 -5
- data/lib/sequel/plugins/instance_hooks.rb +7 -52
- data/lib/sequel/plugins/inverted_subsets.rb +3 -1
- data/lib/sequel/plugins/json_serializer.rb +19 -19
- data/lib/sequel/plugins/lazy_attributes.rb +1 -10
- data/lib/sequel/plugins/list.rb +6 -6
- data/lib/sequel/plugins/many_through_many.rb +11 -8
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/nested_attributes.rb +18 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +8 -2
- data/lib/sequel/plugins/pg_row.rb +2 -11
- data/lib/sequel/plugins/prepared_statements.rb +13 -66
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +7 -7
- data/lib/sequel/plugins/serialization.rb +15 -33
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +2 -8
- data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/static_cache.rb +8 -9
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +1 -1
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/timestamps.rb +6 -7
- data/lib/sequel/plugins/touch.rb +4 -8
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +2 -2
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/update_or_create.rb +3 -3
- data/lib/sequel/plugins/update_refresh.rb +3 -3
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validation_class_methods.rb +10 -9
- data/lib/sequel/plugins/validation_contexts.rb +4 -4
- data/lib/sequel/plugins/validation_helpers.rb +26 -25
- data/lib/sequel/plugins/whitelist_security.rb +13 -9
- data/lib/sequel/plugins/xml_serializer.rb +24 -25
- data/lib/sequel/sql.rb +145 -276
- data/lib/sequel/timezones.rb +8 -23
- data/lib/sequel/version.rb +2 -2
- data/lib/sequel.rb +1 -1
- data/spec/adapter_spec.rb +1 -1
- data/spec/adapters/db2_spec.rb +2 -103
- data/spec/adapters/mssql_spec.rb +89 -68
- data/spec/adapters/mysql_spec.rb +111 -478
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +459 -664
- data/spec/adapters/spec_helper.rb +12 -31
- data/spec/adapters/sqlanywhere_spec.rb +2 -77
- data/spec/adapters/sqlite_spec.rb +8 -146
- data/spec/bin_spec.rb +11 -16
- data/spec/core/connection_pool_spec.rb +173 -74
- data/spec/core/database_spec.rb +96 -244
- data/spec/core/dataset_spec.rb +99 -414
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +241 -4
- data/spec/core/object_graph_spec.rb +11 -60
- data/spec/core/placeholder_literalizer_spec.rb +1 -14
- data/spec/core/schema_generator_spec.rb +51 -40
- data/spec/core/schema_spec.rb +88 -77
- data/spec/core/spec_helper.rb +6 -24
- data/spec/core/version_spec.rb +1 -1
- data/spec/core_extensions_spec.rb +7 -83
- data/spec/core_model_spec.rb +2 -2
- data/spec/deprecation_helper.rb +2 -14
- data/spec/extensions/accessed_columns_spec.rb +1 -1
- data/spec/extensions/active_model_spec.rb +3 -3
- data/spec/extensions/after_initialize_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +2 -2
- data/spec/extensions/association_dependencies_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +30 -92
- data/spec/extensions/association_proxies_spec.rb +1 -1
- data/spec/extensions/auto_literal_strings_spec.rb +1 -12
- data/spec/extensions/auto_validations_spec.rb +1 -1
- data/spec/extensions/blacklist_security_spec.rb +1 -1
- data/spec/extensions/blank_spec.rb +1 -1
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/caching_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +53 -1118
- data/spec/extensions/column_conflicts_spec.rb +1 -1
- data/spec/extensions/column_select_spec.rb +4 -4
- data/spec/extensions/columns_introspection_spec.rb +1 -1
- data/spec/extensions/columns_updated_spec.rb +1 -1
- data/spec/extensions/composition_spec.rb +8 -30
- data/spec/extensions/connection_expiration_spec.rb +3 -3
- data/spec/extensions/connection_validator_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
- data/spec/extensions/constraint_validations_spec.rb +1 -1
- data/spec/extensions/core_refinements_spec.rb +1 -3
- data/spec/extensions/csv_serializer_spec.rb +4 -9
- data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +2 -1
- data/spec/extensions/dataset_source_alias_spec.rb +1 -1
- data/spec/extensions/date_arithmetic_spec.rb +3 -3
- data/spec/extensions/def_dataset_method_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +8 -9
- data/spec/extensions/dirty_spec.rb +1 -1
- data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
- data/spec/extensions/eager_each_spec.rb +2 -2
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/error_splitter_spec.rb +1 -1
- data/spec/extensions/error_sql_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +1 -1
- data/spec/extensions/finder_spec.rb +1 -1
- data/spec/extensions/force_encoding_spec.rb +2 -5
- data/spec/extensions/freeze_datasets_spec.rb +1 -1
- data/spec/extensions/graph_each_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +1 -194
- data/spec/extensions/identifier_mangling_spec.rb +17 -170
- data/spec/extensions/implicit_subquery_spec.rb +1 -5
- data/spec/extensions/inflector_spec.rb +1 -1
- data/spec/extensions/input_transformer_spec.rb +7 -2
- data/spec/extensions/insert_returning_select_spec.rb +1 -1
- data/spec/extensions/instance_filters_spec.rb +1 -1
- data/spec/extensions/instance_hooks_spec.rb +1 -95
- data/spec/extensions/inverted_subsets_spec.rb +1 -1
- data/spec/extensions/json_serializer_spec.rb +1 -1
- data/spec/extensions/lazy_attributes_spec.rb +1 -7
- data/spec/extensions/list_spec.rb +5 -6
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +25 -33
- data/spec/extensions/migration_spec.rb +12 -2
- data/spec/extensions/modification_detection_spec.rb +1 -1
- data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
- data/spec/extensions/named_timezones_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +1 -29
- data/spec/extensions/null_dataset_spec.rb +1 -11
- data/spec/extensions/optimistic_locking_spec.rb +2 -2
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +22 -26
- data/spec/extensions/pg_array_ops_spec.rb +1 -1
- data/spec/extensions/pg_array_spec.rb +3 -48
- data/spec/extensions/pg_enum_spec.rb +1 -1
- data/spec/extensions/pg_extended_date_support_spec.rb +122 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +22 -31
- data/spec/extensions/pg_inet_ops_spec.rb +1 -1
- data/spec/extensions/pg_inet_spec.rb +1 -14
- data/spec/extensions/pg_interval_spec.rb +3 -13
- data/spec/extensions/pg_json_ops_spec.rb +1 -1
- data/spec/extensions/pg_json_spec.rb +1 -13
- data/spec/extensions/pg_loose_count_spec.rb +1 -1
- data/spec/extensions/pg_range_ops_spec.rb +1 -1
- data/spec/extensions/pg_range_spec.rb +3 -88
- data/spec/extensions/pg_row_ops_spec.rb +1 -1
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pg_row_spec.rb +1 -44
- data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
- data/spec/extensions/prepared_statements_safe_spec.rb +7 -7
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +40 -9
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +23 -34
- data/spec/extensions/round_timestamps_spec.rb +1 -5
- data/spec/extensions/s_spec.rb +1 -1
- data/spec/extensions/schema_caching_spec.rb +1 -1
- data/spec/extensions/schema_dumper_spec.rb +43 -32
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +5 -17
- data/spec/extensions/server_block_spec.rb +1 -1
- data/spec/extensions/server_logging_spec.rb +2 -2
- data/spec/extensions/sharding_spec.rb +1 -1
- data/spec/extensions/shared_caching_spec.rb +1 -28
- data/spec/extensions/single_table_inheritance_spec.rb +2 -5
- data/spec/extensions/singular_table_names_spec.rb +1 -1
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +5 -27
- data/spec/extensions/split_array_nil_spec.rb +1 -1
- data/spec/extensions/split_values_spec.rb +1 -1
- data/spec/extensions/sql_comments_spec.rb +1 -1
- data/spec/extensions/sql_expr_spec.rb +1 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_agg_spec.rb +2 -2
- data/spec/extensions/string_date_time_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +1 -1
- data/spec/extensions/subclasses_spec.rb +1 -1
- data/spec/extensions/subset_conditions_spec.rb +1 -1
- data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
- data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
- data/spec/extensions/synchronize_sql_spec.rb +124 -0
- data/spec/extensions/table_select_spec.rb +4 -4
- data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
- data/spec/extensions/thread_local_timezones_spec.rb +1 -1
- data/spec/extensions/timestamps_spec.rb +5 -7
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +1 -1
- data/spec/extensions/tree_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -1
- data/spec/extensions/update_or_create_spec.rb +12 -16
- data/spec/extensions/update_primary_key_spec.rb +4 -3
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +10 -13
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +3 -3
- data/spec/extensions/validation_contexts_spec.rb +1 -1
- data/spec/extensions/validation_helpers_spec.rb +10 -44
- data/spec/extensions/whitelist_security_spec.rb +5 -5
- data/spec/extensions/xml_serializer_spec.rb +8 -13
- data/spec/guards_helper.rb +2 -1
- data/spec/integration/associations_test.rb +1 -23
- data/spec/integration/database_test.rb +7 -7
- data/spec/integration/dataset_test.rb +12 -47
- data/spec/integration/eager_loader_test.rb +1 -1
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +4 -82
- data/spec/integration/plugin_test.rb +7 -23
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +10 -10
- data/spec/integration/spec_helper.rb +17 -21
- data/spec/integration/timezone_test.rb +5 -5
- data/spec/integration/transaction_test.rb +3 -55
- data/spec/integration/type_test.rb +9 -9
- data/spec/model/association_reflection_spec.rb +24 -9
- data/spec/model/associations_spec.rb +124 -303
- data/spec/model/base_spec.rb +43 -137
- data/spec/model/class_dataset_methods_spec.rb +2 -20
- data/spec/model/dataset_methods_spec.rb +1 -20
- data/spec/model/eager_loading_spec.rb +48 -17
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +29 -339
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +33 -129
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +19 -65
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- data/lib/sequel/adapters/do/mysql.rb +0 -69
- data/lib/sequel/adapters/do/postgres.rb +0 -46
- data/lib/sequel/adapters/do/sqlite3.rb +0 -41
- data/lib/sequel/adapters/do.rb +0 -166
- data/lib/sequel/adapters/jdbc/as400.rb +0 -92
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
- data/lib/sequel/adapters/odbc/progress.rb +0 -12
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -261
- data/lib/sequel/adapters/shared/informix.rb +0 -63
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift/mysql.rb +0 -50
- data/lib/sequel/adapters/swift/postgres.rb +0 -49
- data/lib/sequel/adapters/swift/sqlite.rb +0 -48
- data/lib/sequel/adapters/swift.rb +0 -169
- data/lib/sequel/adapters/utils/pg_types.rb +0 -4
- data/lib/sequel/dataset/mutation.rb +0 -98
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
- data/lib/sequel/extensions/filter_having.rb +0 -65
- data/lib/sequel/extensions/hash_aliases.rb +0 -51
- data/lib/sequel/extensions/meta_def.rb +0 -37
- data/lib/sequel/extensions/query_literals.rb +0 -86
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
- data/lib/sequel/extensions/set_overrides.rb +0 -82
- data/lib/sequel/no_core_ext.rb +0 -4
- data/lib/sequel/plugins/association_autoreloading.rb +0 -11
- data/lib/sequel/plugins/identifier_columns.rb +0 -49
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
- data/lib/sequel/plugins/schema.rb +0 -84
- data/lib/sequel/plugins/scissors.rb +0 -37
- data/spec/core/dataset_mutation_spec.rb +0 -253
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/filter_having_spec.rb +0 -42
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/hash_aliases_spec.rb +0 -26
- data/spec/extensions/identifier_columns_spec.rb +0 -19
- data/spec/extensions/meta_def_spec.rb +0 -35
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
- data/spec/extensions/query_literals_spec.rb +0 -185
- data/spec/extensions/schema_spec.rb +0 -123
- data/spec/extensions/scissors_spec.rb +0 -27
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
- data/spec/extensions/set_overrides_spec.rb +0 -75
data/lib/sequel/dataset/query.rb
CHANGED
@@ -14,13 +14,12 @@ module Sequel
|
|
14
14
|
|
15
15
|
EMPTY_ARRAY = [].freeze
|
16
16
|
|
17
|
-
# The dataset options that require the removal of cached columns
|
18
|
-
# if changed.
|
17
|
+
# The dataset options that require the removal of cached columns if changed.
|
19
18
|
COLUMN_CHANGE_OPTS = [:select, :sql, :from, :join].freeze
|
20
19
|
|
21
20
|
# Which options don't affect the SQL generation. Used by simple_select_all?
|
22
21
|
# to determine if this is a simple SELECT * FROM table.
|
23
|
-
NON_SQL_OPTIONS = [:server, :graph, :
|
22
|
+
NON_SQL_OPTIONS = [:server, :graph, :row_proc, :quote_identifiers, :skip_symbol_cache].freeze
|
24
23
|
|
25
24
|
# These symbols have _join methods created (e.g. inner_join) that
|
26
25
|
# call join_table with the symbol, passing along the arguments and
|
@@ -37,14 +36,13 @@ module Sequel
|
|
37
36
|
|
38
37
|
# Methods that return modified datasets
|
39
38
|
QUERY_METHODS = ((<<-METHS).split.map(&:to_sym) + JOIN_METHODS).freeze
|
40
|
-
add_graph_aliases
|
39
|
+
add_graph_aliases distinct except exclude exclude_having
|
41
40
|
filter for_update from from_self graph grep group group_and_count group_append group_by having intersect invert
|
42
41
|
limit lock_style naked offset or order order_append order_by order_more order_prepend qualify
|
43
42
|
reverse reverse_order select select_all select_append select_group select_more server
|
44
43
|
set_graph_aliases unfiltered ungraphed ungrouped union
|
45
44
|
unlimited unordered where with with_recursive with_sql
|
46
45
|
METHS
|
47
|
-
# SEQUEL5: Remove and, exclude_where
|
48
46
|
|
49
47
|
# Register an extension callback for Dataset objects. ext should be the
|
50
48
|
# extension name symbol, and mod should either be a Module that the
|
@@ -67,12 +65,6 @@ module Sequel
|
|
67
65
|
Sequel.synchronize{EXTENSIONS[ext] = block}
|
68
66
|
end
|
69
67
|
|
70
|
-
# Alias for where.
|
71
|
-
def and(*cond, &block)
|
72
|
-
Sequel::Deprecation.deprecate("Sequel::Dataset#and", "Use #where, or use the sequel_4_dataset_methods extension")
|
73
|
-
where(*cond, &block)
|
74
|
-
end
|
75
|
-
|
76
68
|
# On Ruby 2.4+, use clone(:freeze=>false) to create clones, because
|
77
69
|
# we use true freezing in that case, and we need to modify the opts
|
78
70
|
# in the frozen copy.
|
@@ -89,13 +81,13 @@ module Sequel
|
|
89
81
|
# If the options changed include options in COLUMN_CHANGE_OPTS, the cached
|
90
82
|
# columns are deleted. This method should generally not be called
|
91
83
|
# directly by user code.
|
92
|
-
def clone(opts =
|
84
|
+
def clone(opts = (return self; nil))
|
93
85
|
c = super(:freeze=>false)
|
94
86
|
c.opts.merge!(opts)
|
95
87
|
unless opts.each_key{|o| break if COLUMN_CHANGE_OPTS.include?(o)}
|
96
88
|
c.clear_columns_cache
|
97
89
|
end
|
98
|
-
c.freeze
|
90
|
+
c.freeze
|
99
91
|
c
|
100
92
|
end
|
101
93
|
else
|
@@ -106,7 +98,7 @@ module Sequel
|
|
106
98
|
unless opts.each_key{|o| break if COLUMN_CHANGE_OPTS.include?(o)}
|
107
99
|
c.clear_columns_cache
|
108
100
|
end
|
109
|
-
c.
|
101
|
+
c.opts.freeze
|
110
102
|
c
|
111
103
|
end
|
112
104
|
# :nocov:
|
@@ -140,10 +132,10 @@ module Sequel
|
|
140
132
|
# DB[:items].except(DB[:other_items])
|
141
133
|
# # SELECT * FROM (SELECT * FROM items EXCEPT SELECT * FROM other_items) AS t1
|
142
134
|
#
|
143
|
-
# DB[:items].except(DB[:other_items], :
|
135
|
+
# DB[:items].except(DB[:other_items], all: true, from_self: false)
|
144
136
|
# # SELECT * FROM items EXCEPT ALL SELECT * FROM other_items
|
145
137
|
#
|
146
|
-
# DB[:items].except(DB[:other_items], :
|
138
|
+
# DB[:items].except(DB[:other_items], alias: :i)
|
147
139
|
# # SELECT * FROM (SELECT * FROM items EXCEPT SELECT * FROM other_items) AS i
|
148
140
|
def except(dataset, opts=OPTS)
|
149
141
|
raise(InvalidOperation, "EXCEPT not supported") unless supports_intersect_except?
|
@@ -154,10 +146,10 @@ module Sequel
|
|
154
146
|
# Performs the inverse of Dataset#where. Note that if you have multiple filter
|
155
147
|
# conditions, this is not the same as a negation of all conditions.
|
156
148
|
#
|
157
|
-
# DB[:items].exclude(:
|
149
|
+
# DB[:items].exclude(category: 'software')
|
158
150
|
# # SELECT * FROM items WHERE (category != 'software')
|
159
151
|
#
|
160
|
-
# DB[:items].exclude(:
|
152
|
+
# DB[:items].exclude(category: 'software', id: 3)
|
161
153
|
# # SELECT * FROM items WHERE ((category != 'software') OR (id != 3))
|
162
154
|
#
|
163
155
|
# Also note that SQL uses 3-valued boolean logic (+true+, +false+, +NULL+), so
|
@@ -165,7 +157,7 @@ module Sequel
|
|
165
157
|
# not match rows that were NULL originally. If you take the earlier
|
166
158
|
# example:
|
167
159
|
#
|
168
|
-
# DB[:items].exclude(:
|
160
|
+
# DB[:items].exclude(category: 'software')
|
169
161
|
# # SELECT * FROM items WHERE (category != 'software')
|
170
162
|
#
|
171
163
|
# Note that this does not match rows where +category+ is +NULL+. This
|
@@ -173,7 +165,7 @@ module Sequel
|
|
173
165
|
# or not the +NULL+ category is +software+. You can explicitly
|
174
166
|
# specify how to handle +NULL+ values if you want:
|
175
167
|
#
|
176
|
-
# DB[:items].exclude(Sequel.~(:
|
168
|
+
# DB[:items].exclude(Sequel.~(category: nil) & {category: 'software'})
|
177
169
|
# # SELECT * FROM items WHERE ((category IS NULL) OR (category != 'software'))
|
178
170
|
def exclude(*cond, &block)
|
179
171
|
add_filter(:where, cond, true, &block)
|
@@ -190,12 +182,6 @@ module Sequel
|
|
190
182
|
add_filter(:having, cond, true, &block)
|
191
183
|
end
|
192
184
|
|
193
|
-
# Alias for exclude.
|
194
|
-
def exclude_where(*cond, &block)
|
195
|
-
Sequel::Deprecation.deprecate("Sequel::Dataset#exclude_where", "Use #exclude, or use the sequel_4_dataset_methods extension")
|
196
|
-
exclude(*cond, &block)
|
197
|
-
end
|
198
|
-
|
199
185
|
if TRUE_FREEZE
|
200
186
|
# Return a clone of the dataset loaded with the given dataset extensions.
|
201
187
|
# If no related extension file exists or the extension does not have
|
@@ -203,7 +189,7 @@ module Sequel
|
|
203
189
|
def extension(*a)
|
204
190
|
c = _clone(:freeze=>false)
|
205
191
|
c.send(:_extension!, a)
|
206
|
-
c.freeze
|
192
|
+
c.freeze
|
207
193
|
c
|
208
194
|
end
|
209
195
|
else
|
@@ -269,7 +255,10 @@ module Sequel
|
|
269
255
|
end
|
270
256
|
|
271
257
|
# Returns a dataset selecting from the current dataset.
|
272
|
-
#
|
258
|
+
# Options:
|
259
|
+
# :alias :: Controls the alias of the table
|
260
|
+
# :column_aliases :: Also aliases columns, using derived column lists.
|
261
|
+
# Only used in conjunction with :alias.
|
273
262
|
#
|
274
263
|
# ds = DB[:items].order(:name).select(:id, :name)
|
275
264
|
# # SELECT id,name FROM items ORDER BY name
|
@@ -277,10 +266,10 @@ module Sequel
|
|
277
266
|
# ds.from_self
|
278
267
|
# # SELECT * FROM (SELECT id, name FROM items ORDER BY name) AS t1
|
279
268
|
#
|
280
|
-
# ds.from_self(:
|
269
|
+
# ds.from_self(alias: :foo)
|
281
270
|
# # SELECT * FROM (SELECT id, name FROM items ORDER BY name) AS foo
|
282
271
|
#
|
283
|
-
# ds.from_self(:
|
272
|
+
# ds.from_self(alias: :foo, column_aliases: [:c1, :c2])
|
284
273
|
# # SELECT * FROM (SELECT id, name FROM items ORDER BY name) AS foo(c1, c2)
|
285
274
|
def from_self(opts=OPTS)
|
286
275
|
fs = {}
|
@@ -293,9 +282,9 @@ module Sequel
|
|
293
282
|
end
|
294
283
|
|
295
284
|
# Match any of the columns to any of the patterns. The terms can be
|
296
|
-
# strings (which use LIKE) or regular expressions
|
297
|
-
#
|
298
|
-
#
|
285
|
+
# strings (which use LIKE) or regular expressions if the database supports that.
|
286
|
+
# Note that the total number of pattern matches will be
|
287
|
+
# Array(columns).length * Array(terms).length,
|
299
288
|
# which could cause performance issues.
|
300
289
|
#
|
301
290
|
# Options (all are boolean):
|
@@ -316,15 +305,15 @@ module Sequel
|
|
316
305
|
# # SELECT * FROM items WHERE ((a LIKE '%test%' ESCAPE '\') OR (a LIKE 'foo' ESCAPE '\')
|
317
306
|
# # OR (b LIKE '%test%' ESCAPE '\') OR (b LIKE 'foo' ESCAPE '\'))
|
318
307
|
#
|
319
|
-
# dataset.grep([:a, :b], %w'%foo% %bar%', :
|
308
|
+
# dataset.grep([:a, :b], %w'%foo% %bar%', all_patterns: true)
|
320
309
|
# # SELECT * FROM a WHERE (((a LIKE '%foo%' ESCAPE '\') OR (b LIKE '%foo%' ESCAPE '\'))
|
321
310
|
# # AND ((a LIKE '%bar%' ESCAPE '\') OR (b LIKE '%bar%' ESCAPE '\')))
|
322
311
|
#
|
323
|
-
# dataset.grep([:a, :b], %w'%foo% %bar%', :
|
312
|
+
# dataset.grep([:a, :b], %w'%foo% %bar%', all_columns: true)
|
324
313
|
# # SELECT * FROM a WHERE (((a LIKE '%foo%' ESCAPE '\') OR (a LIKE '%bar%' ESCAPE '\'))
|
325
314
|
# # AND ((b LIKE '%foo%' ESCAPE '\') OR (b LIKE '%bar%' ESCAPE '\')))
|
326
315
|
#
|
327
|
-
# dataset.grep([:a, :b], %w'%foo% %bar%', :
|
316
|
+
# dataset.grep([:a, :b], %w'%foo% %bar%', all_patterns: true, all_columns: true)
|
328
317
|
# # SELECT * FROM a WHERE ((a LIKE '%foo%' ESCAPE '\') AND (b LIKE '%foo%' ESCAPE '\')
|
329
318
|
# # AND (a LIKE '%bar%' ESCAPE '\') AND (b LIKE '%bar%' ESCAPE '\'))
|
330
319
|
def grep(columns, patterns, opts=OPTS)
|
@@ -372,11 +361,11 @@ module Sequel
|
|
372
361
|
# # SELECT first_name, last_name, count(*) AS count FROM items GROUP BY first_name, last_name
|
373
362
|
# # => [{:first_name=>'a', :last_name=>'b', :count=>1}, ...]
|
374
363
|
#
|
375
|
-
# DB[:items].group_and_count(:
|
364
|
+
# DB[:items].group_and_count(Sequel[:first_name].as(:name)).all
|
376
365
|
# # SELECT first_name AS name, count(*) AS count FROM items GROUP BY first_name
|
377
366
|
# # => [{:name=>'a', :count=>1}, ...]
|
378
367
|
#
|
379
|
-
# DB[:items].group_and_count{substr(first_name, 1, 1).as(initial)}.all
|
368
|
+
# DB[:items].group_and_count{substr(:first_name, 1, 1).as(:initial)}.all
|
380
369
|
# # SELECT substr(first_name, 1, 1) AS initial, count(*) AS count FROM items GROUP BY substr(first_name, 1, 1)
|
381
370
|
# # => [{:initial=>'a', :count=>1}, ...]
|
382
371
|
def group_and_count(*columns, &block)
|
@@ -414,7 +403,7 @@ module Sequel
|
|
414
403
|
|
415
404
|
# Returns a copy of the dataset with the HAVING conditions changed. See #where for argument types.
|
416
405
|
#
|
417
|
-
# DB[:items].group(:sum).having(:
|
406
|
+
# DB[:items].group(:sum).having(sum: 10)
|
418
407
|
# # SELECT * FROM items GROUP BY sum HAVING (sum = 10)
|
419
408
|
def having(*cond, &block)
|
420
409
|
add_filter(:having, cond, &block)
|
@@ -432,10 +421,10 @@ module Sequel
|
|
432
421
|
# DB[:items].intersect(DB[:other_items])
|
433
422
|
# # SELECT * FROM (SELECT * FROM items INTERSECT SELECT * FROM other_items) AS t1
|
434
423
|
#
|
435
|
-
# DB[:items].intersect(DB[:other_items], :
|
424
|
+
# DB[:items].intersect(DB[:other_items], all: true, from_self: false)
|
436
425
|
# # SELECT * FROM items INTERSECT ALL SELECT * FROM other_items
|
437
426
|
#
|
438
|
-
# DB[:items].intersect(DB[:other_items], :
|
427
|
+
# DB[:items].intersect(DB[:other_items], alias: :i)
|
439
428
|
# # SELECT * FROM (SELECT * FROM items INTERSECT SELECT * FROM other_items) AS i
|
440
429
|
def intersect(dataset, opts=OPTS)
|
441
430
|
raise(InvalidOperation, "INTERSECT not supported") unless supports_intersect_except?
|
@@ -446,10 +435,10 @@ module Sequel
|
|
446
435
|
# Inverts the current WHERE and HAVING clauses. If there is neither a
|
447
436
|
# WHERE or HAVING clause, adds a WHERE clause that is always false.
|
448
437
|
#
|
449
|
-
# DB[:items].where(:
|
438
|
+
# DB[:items].where(category: 'software').invert
|
450
439
|
# # SELECT * FROM items WHERE (category != 'software')
|
451
440
|
#
|
452
|
-
# DB[:items].where(:
|
441
|
+
# DB[:items].where(category: 'software', id: 3).invert
|
453
442
|
# # SELECT * FROM items WHERE ((category != 'software') OR (id != 3))
|
454
443
|
#
|
455
444
|
# See documentation for exclude for how inversion is handled in regards
|
@@ -521,10 +510,10 @@ module Sequel
|
|
521
510
|
# DB[:a].join_table(:cross, :b)
|
522
511
|
# # SELECT * FROM a CROSS JOIN b
|
523
512
|
#
|
524
|
-
# DB[:a].join_table(:inner, DB[:b], :
|
513
|
+
# DB[:a].join_table(:inner, DB[:b], c: d)
|
525
514
|
# # SELECT * FROM a INNER JOIN (SELECT * FROM b) AS t1 ON (t1.c = a.d)
|
526
515
|
#
|
527
|
-
# DB[:a].join_table(:left, :
|
516
|
+
# DB[:a].join_table(:left, Sequel[:b].as(:c), [:d])
|
528
517
|
# # SELECT * FROM a LEFT JOIN b AS c USING (d)
|
529
518
|
#
|
530
519
|
# DB[:a].natural_join(:b).join_table(:inner, :c) do |ta, jta, js|
|
@@ -624,7 +613,7 @@ module Sequel
|
|
624
613
|
# or JOIN clauses, it will surround the subquery with LATERAL to enable it
|
625
614
|
# to deal with previous tables in the query:
|
626
615
|
#
|
627
|
-
# DB.from(:a, DB[:b].where(:
|
616
|
+
# DB.from(:a, DB[:b].where(Sequel[:a][:c]=>Sequel[:b][:d]).lateral)
|
628
617
|
# # SELECT * FROM a, LATERAL (SELECT * FROM b WHERE (a.c = b.d))
|
629
618
|
def lateral
|
630
619
|
clone(:lateral=>true)
|
@@ -676,8 +665,7 @@ module Sequel
|
|
676
665
|
|
677
666
|
# Returns a cloned dataset without a row_proc.
|
678
667
|
#
|
679
|
-
# ds = DB[:items]
|
680
|
-
# ds.row_proc = proc(&:invert)
|
668
|
+
# ds = DB[:items].with_row_proc(:invert.to_proc)
|
681
669
|
# ds.all # => [{2=>:id}]
|
682
670
|
# ds.naked.all # => [{:id=>2}]
|
683
671
|
def naked
|
@@ -699,13 +687,13 @@ module Sequel
|
|
699
687
|
|
700
688
|
# Adds an alternate filter to an existing WHERE clause using OR. If there
|
701
689
|
# is no WHERE clause, then the default is WHERE true, and OR would be redundant,
|
702
|
-
# so return
|
690
|
+
# so return the dataset in that case.
|
703
691
|
#
|
704
692
|
# DB[:items].where(:a).or(:b) # SELECT * FROM items WHERE a OR b
|
705
693
|
# DB[:items].or(:b) # SELECT * FROM items
|
706
694
|
def or(*cond, &block)
|
707
695
|
if @opts[:where].nil?
|
708
|
-
|
696
|
+
self
|
709
697
|
else
|
710
698
|
add_filter(:where, cond, false, :OR, &block)
|
711
699
|
end
|
@@ -720,7 +708,7 @@ module Sequel
|
|
720
708
|
# DB[:items].order(:name) # SELECT * FROM items ORDER BY name
|
721
709
|
# DB[:items].order(:a, :b) # SELECT * FROM items ORDER BY a, b
|
722
710
|
# DB[:items].order(Sequel.lit('a + b')) # SELECT * FROM items ORDER BY a + b
|
723
|
-
# DB[:items].order(:a + :b) # SELECT * FROM items ORDER BY (a + b)
|
711
|
+
# DB[:items].order(Sequel[:a] + :b) # SELECT * FROM items ORDER BY (a + b)
|
724
712
|
# DB[:items].order(Sequel.desc(:name)) # SELECT * FROM items ORDER BY name DESC
|
725
713
|
# DB[:items].order(Sequel.asc(:name, :nulls=>:last)) # SELECT * FROM items ORDER BY name ASC NULLS LAST
|
726
714
|
# DB[:items].order{sum(name).desc} # SELECT * FROM items ORDER BY sum(name) DESC
|
@@ -762,14 +750,14 @@ module Sequel
|
|
762
750
|
|
763
751
|
# Qualify to the given table, or first source if no table is given.
|
764
752
|
#
|
765
|
-
# DB[:items].where(:
|
753
|
+
# DB[:items].where(id: 1).qualify
|
766
754
|
# # SELECT items.* FROM items WHERE (items.id = 1)
|
767
755
|
#
|
768
|
-
# DB[:items].where(:
|
756
|
+
# DB[:items].where(id: 1).qualify(:i)
|
769
757
|
# # SELECT i.* FROM items WHERE (i.id = 1)
|
770
758
|
def qualify(table=first_source)
|
771
759
|
o = @opts
|
772
|
-
return
|
760
|
+
return self if o[:sql]
|
773
761
|
h = {}
|
774
762
|
(o.keys & QUALIFY_KEYS).each do |k|
|
775
763
|
h[k] = qualified_expression(o[k], table)
|
@@ -786,6 +774,16 @@ module Sequel
|
|
786
774
|
# DB[:items].returning # RETURNING *
|
787
775
|
# DB[:items].returning(nil) # RETURNING NULL
|
788
776
|
# DB[:items].returning(:id, :name) # RETURNING id, name
|
777
|
+
#
|
778
|
+
# DB[:items].returning.insert(:a=>1) do |hash|
|
779
|
+
# # hash for each row inserted, with values for all columns
|
780
|
+
# end
|
781
|
+
# DB[:items].returning.update(:a=>1) do |hash|
|
782
|
+
# # hash for each row updated, with values for all columns
|
783
|
+
# end
|
784
|
+
# DB[:items].returning.delete(:a=>1) do |hash|
|
785
|
+
# # hash for each row deleted, with values for all columns
|
786
|
+
# end
|
789
787
|
def returning(*values)
|
790
788
|
raise Error, "RETURNING is not supported on #{db.database_type}" unless supports_returning?(:insert)
|
791
789
|
clone(:returning=>values.freeze)
|
@@ -864,7 +862,7 @@ module Sequel
|
|
864
862
|
# DB[:items].select_group(:a, :b)
|
865
863
|
# # SELECT a, b FROM items GROUP BY a, b
|
866
864
|
#
|
867
|
-
# DB[:items].select_group(:
|
865
|
+
# DB[:items].select_group(Sequel[:c].as(:a)){f(c2)}
|
868
866
|
# # SELECT c AS a, f(c2) FROM items GROUP BY c, f(c2)
|
869
867
|
def select_group(*columns, &block)
|
870
868
|
virtual_row_columns(columns, block)
|
@@ -915,26 +913,9 @@ module Sequel
|
|
915
913
|
end
|
916
914
|
end
|
917
915
|
|
918
|
-
# Unbind bound variables from this dataset's filter and return an array of two
|
919
|
-
# objects. The first object is a modified dataset where the filter has been
|
920
|
-
# replaced with one that uses bound variable placeholders. The second object
|
921
|
-
# is the hash of unbound variables. You can then prepare and execute (or just
|
922
|
-
# call) the dataset with the bound variables to get results.
|
923
|
-
#
|
924
|
-
# ds, bv = DB[:items].where(:a=>1).unbind
|
925
|
-
# ds # SELECT * FROM items WHERE (a = $a)
|
926
|
-
# bv # {:a => 1}
|
927
|
-
# ds.call(:select, bv)
|
928
|
-
def unbind
|
929
|
-
Sequel::Deprecation.deprecate("Dataset#unbind", "Switch to using placeholders manually instead of unbinding them")
|
930
|
-
u = Unbinder.new
|
931
|
-
ds = clone(:where=>u.transform(opts[:where]), :join=>u.transform(opts[:join]))
|
932
|
-
[ds, u.binds]
|
933
|
-
end
|
934
|
-
|
935
916
|
# Returns a copy of the dataset with no filters (HAVING or WHERE clause) applied.
|
936
917
|
#
|
937
|
-
# DB[:items].group(:a).having(:
|
918
|
+
# DB[:items].group(:a).having(a: 1).where(:b).unfiltered
|
938
919
|
# # SELECT * FROM items GROUP BY a
|
939
920
|
def unfiltered
|
940
921
|
cached_dataset(:_unfiltered_ds){clone(:where => nil, :having => nil)}
|
@@ -942,7 +923,7 @@ module Sequel
|
|
942
923
|
|
943
924
|
# Returns a copy of the dataset with no grouping (GROUP or HAVING clause) applied.
|
944
925
|
#
|
945
|
-
# DB[:items].group(:a).having(:
|
926
|
+
# DB[:items].group(:a).having(a: 1).where(:b).ungrouped
|
946
927
|
# # SELECT * FROM items WHERE b
|
947
928
|
def ungrouped
|
948
929
|
cached_dataset(:_ungrouped_ds){clone(:group => nil, :having => nil)}
|
@@ -959,10 +940,10 @@ module Sequel
|
|
959
940
|
# DB[:items].union(DB[:other_items])
|
960
941
|
# # SELECT * FROM (SELECT * FROM items UNION SELECT * FROM other_items) AS t1
|
961
942
|
#
|
962
|
-
# DB[:items].union(DB[:other_items], :
|
943
|
+
# DB[:items].union(DB[:other_items], all: true, from_self: false)
|
963
944
|
# # SELECT * FROM items UNION ALL SELECT * FROM other_items
|
964
945
|
#
|
965
|
-
# DB[:items].union(DB[:other_items], :
|
946
|
+
# DB[:items].union(DB[:other_items], alias: :i)
|
966
947
|
# # SELECT * FROM (SELECT * FROM items UNION SELECT * FROM other_items) AS i
|
967
948
|
def union(dataset, opts=OPTS)
|
968
949
|
compound_clone(:union, dataset, opts)
|
@@ -986,18 +967,10 @@ module Sequel
|
|
986
967
|
#
|
987
968
|
# Accepts the following argument types:
|
988
969
|
#
|
989
|
-
# Hash :: list of equality/inclusion expressions
|
990
|
-
# Array :: depends:
|
991
|
-
# * If first member is a string, assumes the rest of the arguments
|
992
|
-
# are parameters and interpolates them into the string.
|
993
|
-
# * If all members are arrays of length two, treats the same way
|
994
|
-
# as a hash, except it allows for duplicate keys to be
|
995
|
-
# specified.
|
996
|
-
# * Otherwise, treats each argument as a separate condition.
|
997
|
-
# String :: taken literally
|
970
|
+
# Hash, Array of pairs :: list of equality/inclusion expressions
|
998
971
|
# Symbol :: taken as a boolean column argument (e.g. WHERE active)
|
999
|
-
# Sequel::SQL::BooleanExpression :: an existing condition expression,
|
1000
|
-
#
|
972
|
+
# Sequel::SQL::BooleanExpression, Sequel::LiteralString :: an existing condition expression, probably created
|
973
|
+
# using the Sequel expression filter DSL.
|
1001
974
|
#
|
1002
975
|
# where also accepts a block, which should return one of the above argument
|
1003
976
|
# types, and is treated the same way. This block yields a virtual row object,
|
@@ -1008,16 +981,16 @@ module Sequel
|
|
1008
981
|
#
|
1009
982
|
# Examples:
|
1010
983
|
#
|
1011
|
-
# DB[:items].where(:
|
984
|
+
# DB[:items].where(id: 3)
|
1012
985
|
# # SELECT * FROM items WHERE (id = 3)
|
1013
986
|
#
|
1014
|
-
# DB[:items].where('price < ?', 100)
|
987
|
+
# DB[:items].where(Sequel.lit('price < ?', 100))
|
1015
988
|
# # SELECT * FROM items WHERE price < 100
|
1016
989
|
#
|
1017
990
|
# DB[:items].where([[:id, [1,2,3]], [:id, 0..10]])
|
1018
991
|
# # SELECT * FROM items WHERE ((id IN (1, 2, 3)) AND ((id >= 0) AND (id <= 10)))
|
1019
992
|
#
|
1020
|
-
# DB[:items].where('price < 100')
|
993
|
+
# DB[:items].where(Sequel.lit('price < 100'))
|
1021
994
|
# # SELECT * FROM items WHERE price < 100
|
1022
995
|
#
|
1023
996
|
# DB[:items].where(:active)
|
@@ -1028,7 +1001,7 @@ module Sequel
|
|
1028
1001
|
#
|
1029
1002
|
# Multiple where calls can be chained for scoping:
|
1030
1003
|
#
|
1031
|
-
# software = dataset.where(:
|
1004
|
+
# software = dataset.where(category: 'software').where{price < 100}
|
1032
1005
|
# # SELECT * FROM items WHERE ((category = 'software') AND (price < 100))
|
1033
1006
|
#
|
1034
1007
|
# See the {"Dataset Filtering" guide}[rdoc-ref:doc/dataset_filtering.rdoc] for more examples and details.
|
@@ -1042,7 +1015,7 @@ module Sequel
|
|
1042
1015
|
# :args :: Specify the arguments/columns for the CTE, should be an array of symbols.
|
1043
1016
|
# :recursive :: Specify that this is a recursive CTE
|
1044
1017
|
#
|
1045
|
-
# DB[:items].with(:items, DB[:syx].where(:name.like('A%')))
|
1018
|
+
# DB[:items].with(:items, DB[:syx].where(Sequel[:name].like('A%')))
|
1046
1019
|
# # WITH items AS (SELECT * FROM syx WHERE (name LIKE 'A%' ESCAPE '\')) SELECT * FROM items
|
1047
1020
|
def with(name, dataset, opts=OPTS)
|
1048
1021
|
raise(Error, 'This dataset does not support common table expressions') unless supports_cte?
|
@@ -1061,15 +1034,15 @@ module Sequel
|
|
1061
1034
|
# :union_all :: Set to false to use UNION instead of UNION ALL combining the nonrecursive and recursive parts.
|
1062
1035
|
#
|
1063
1036
|
# DB[:t].with_recursive(:t,
|
1064
|
-
# DB[:i1].select(:id, :parent_id).where(:
|
1065
|
-
# DB[:i1].join(:t, :
|
1037
|
+
# DB[:i1].select(:id, :parent_id).where(parent_id: nil),
|
1038
|
+
# DB[:i1].join(:t, id: :parent_id).select(Sequel[:i1][:id], Sequel[:i1][:parent_id]),
|
1066
1039
|
# :args=>[:id, :parent_id])
|
1067
1040
|
#
|
1068
|
-
# # WITH RECURSIVE
|
1069
|
-
# # SELECT
|
1041
|
+
# # WITH RECURSIVE t(id, parent_id) AS (
|
1042
|
+
# # SELECT id, parent_id FROM i1 WHERE (parent_id IS NULL)
|
1070
1043
|
# # UNION ALL
|
1071
|
-
# # SELECT
|
1072
|
-
# # ) SELECT * FROM
|
1044
|
+
# # SELECT i1.id, i1.parent_id FROM i1 INNER JOIN t ON (t.id = i1.parent_id)
|
1045
|
+
# # ) SELECT * FROM t
|
1073
1046
|
def with_recursive(name, nonrecursive, recursive, opts=OPTS)
|
1074
1047
|
raise(Error, 'This datatset does not support common table expressions') unless supports_cte?
|
1075
1048
|
if hoist_cte?(nonrecursive)
|
@@ -1093,7 +1066,7 @@ module Sequel
|
|
1093
1066
|
c = _clone(:freeze=>false)
|
1094
1067
|
c.extend(*mods) unless mods.empty?
|
1095
1068
|
c.extend(DatasetModule.new(&block)) if block
|
1096
|
-
c.freeze
|
1069
|
+
c.freeze
|
1097
1070
|
c
|
1098
1071
|
end
|
1099
1072
|
else
|
@@ -1111,7 +1084,7 @@ module Sequel
|
|
1111
1084
|
#
|
1112
1085
|
# ds = DB[:items]
|
1113
1086
|
# ds.all # => [{:id=>2}]
|
1114
|
-
# ds.with_row_proc(
|
1087
|
+
# ds.with_row_proc(:invert.to_proc).all # => [{2=>:id}]
|
1115
1088
|
def with_row_proc(callable)
|
1116
1089
|
clone(:row_proc=>callable)
|
1117
1090
|
end
|
@@ -1132,7 +1105,7 @@ module Sequel
|
|
1132
1105
|
# Note that datasets that specify custom SQL using this method will generally
|
1133
1106
|
# ignore future dataset methods that modify the SQL used, as specifying custom SQL
|
1134
1107
|
# overrides Sequel's SQL generator. You should probably limit yourself to the following
|
1135
|
-
# dataset methods when using this method:
|
1108
|
+
# dataset methods when using this method, or use the implicit_subquery extension:
|
1136
1109
|
#
|
1137
1110
|
# * each
|
1138
1111
|
# * all
|
@@ -1146,13 +1119,9 @@ module Sequel
|
|
1146
1119
|
# * update (if an UPDATE statement, with no arguments)
|
1147
1120
|
# * insert (if an INSERT statement, with no arguments)
|
1148
1121
|
# * truncate (if a TRUNCATE statement, with no arguments)
|
1149
|
-
#
|
1150
|
-
# If you want to use arbitrary dataset methods on a dataset that uses custom SQL, call
|
1151
|
-
# from_self on the dataset, which wraps the custom SQL in a subquery, and allows normal
|
1152
|
-
# dataset methods that modify the SQL to work.
|
1153
1122
|
def with_sql(sql, *args)
|
1154
1123
|
if sql.is_a?(Symbol)
|
1155
|
-
sql =
|
1124
|
+
sql = public_send(sql, *args)
|
1156
1125
|
else
|
1157
1126
|
sql = SQL::PlaceholderLiteralString.new(sql, args) unless args.empty?
|
1158
1127
|
end
|
@@ -1163,7 +1132,7 @@ module Sequel
|
|
1163
1132
|
|
1164
1133
|
# Add the dataset to the list of compounds
|
1165
1134
|
def compound_clone(type, dataset, opts)
|
1166
|
-
if
|
1135
|
+
if dataset.is_a?(Dataset) && dataset.opts[:with] && !supports_cte_in_compounds?
|
1167
1136
|
s, ds = hoist_cte(dataset)
|
1168
1137
|
return s.compound_clone(type, ds, opts)
|
1169
1138
|
end
|
@@ -1220,30 +1189,18 @@ module Sequel
|
|
1220
1189
|
|
1221
1190
|
def add_filter(clause, cond, invert=false, combine=:AND, &block)
|
1222
1191
|
if cond == EMPTY_ARRAY && !block
|
1223
|
-
|
1224
|
-
#raise Error, "must provide an argument to a filtering method if not passing a block" # SEQUEL5
|
1192
|
+
raise Error, "must provide an argument to a filtering method if not passing a block"
|
1225
1193
|
end
|
1226
1194
|
|
1227
1195
|
cond = cond.first if cond.size == 1
|
1228
1196
|
|
1229
1197
|
empty = cond == OPTS || cond == EMPTY_ARRAY
|
1230
|
-
old_empty = cond.respond_to?(:empty?) && cond.empty?
|
1231
|
-
if old_empty && !empty
|
1232
|
-
Sequel::Deprecation.deprecate("Treating #{cond.inspect} as a empty filter expression", "Only {} and [] are considered empty expressions now")
|
1233
|
-
empty = true
|
1234
|
-
end
|
1235
1198
|
|
1236
1199
|
if empty && !block
|
1237
|
-
|
1200
|
+
self
|
1238
1201
|
else
|
1239
1202
|
if cond == nil
|
1240
|
-
|
1241
|
-
Sequel::Deprecation.deprecate("Ignoring explicit nil argument when passing a block to a filtering method", "Do not pass an explicit nil argument to the filtering method, only pass the block")
|
1242
|
-
end
|
1243
|
-
unless @opts[clause]
|
1244
|
-
Sequel::Deprecation.deprecate("Ignoring explicit nil argument to a filtering method if dataset has no explicit filter", "Starting in Sequel 5, this will add a NULL condition")
|
1245
|
-
end
|
1246
|
-
#cond = Sequel::NULL # SEQUEL5
|
1203
|
+
cond = Sequel::NULL
|
1247
1204
|
end
|
1248
1205
|
if empty && block
|
1249
1206
|
cond = nil
|
@@ -1252,20 +1209,15 @@ module Sequel
|
|
1252
1209
|
cond = filter_expr(cond, &block)
|
1253
1210
|
cond = SQL::BooleanExpression.invert(cond) if invert
|
1254
1211
|
cond = SQL::BooleanExpression.new(combine, @opts[clause], cond) if @opts[clause]
|
1255
|
-
clone(clause => cond)
|
1256
|
-
end
|
1257
|
-
end
|
1258
1212
|
|
1259
|
-
|
1260
|
-
|
1261
|
-
|
1262
|
-
|
1263
|
-
end
|
1213
|
+
if cond.nil?
|
1214
|
+
Sequel::Deprecation.deprecate('Filtering method called on dataset with no existing filter with virtual row block and no argument and virtual row block returned nil. Currently, this results in the filter being ignored instead of using a NULL filter. In Sequel 5.4+, this behavior will change to using a NULL filter, similar to the behavior in all other cases.')
|
1215
|
+
#cond = Sequel::NULL
|
1216
|
+
end
|
1264
1217
|
|
1265
|
-
|
1266
|
-
|
1218
|
+
clone(clause => cond)
|
1219
|
+
end
|
1267
1220
|
end
|
1268
|
-
# :nocov:
|
1269
1221
|
|
1270
1222
|
# The default :qualify option to use for join tables if one is not specified.
|
1271
1223
|
def default_join_table_qualification
|
@@ -1277,11 +1229,9 @@ module Sequel
|
|
1277
1229
|
expr = nil if expr == EMPTY_ARRAY
|
1278
1230
|
|
1279
1231
|
if block
|
1280
|
-
|
1281
|
-
|
1282
|
-
|
1283
|
-
return filter_expr(Sequel.virtual_row(&block))
|
1284
|
-
end
|
1232
|
+
cond = filter_expr(Sequel.virtual_row(&block))
|
1233
|
+
cond = SQL::BooleanExpression.new(:AND, filter_expr(expr), cond) if expr
|
1234
|
+
return cond
|
1285
1235
|
end
|
1286
1236
|
|
1287
1237
|
case expr
|
@@ -1290,22 +1240,13 @@ module Sequel
|
|
1290
1240
|
when Array
|
1291
1241
|
if Sequel.condition_specifier?(expr)
|
1292
1242
|
SQL::BooleanExpression.from_value_pairs(expr)
|
1293
|
-
#else # SEQUEL5
|
1294
|
-
# raise(Error, "Invalid filter expression: #{expr.inspect}")
|
1295
|
-
elsif (sexpr = expr[0]).is_a?(String)
|
1296
|
-
Sequel::Deprecation.deprecate("Calling a dataset filtering method with multiple arguments or an array where the first argument/element is a string", "Use Sequel.lit(#{sexpr.inspect}#{", #{expr[1..-1].map(&:inspect).join(', ')}" if expr.length > 1}) to create an SQL fragment expression and pass that to the dataset filtering method, or use the auto_literal_strings extension")
|
1297
|
-
SQL::PlaceholderLiteralString.new(sexpr, expr[1..-1], true)
|
1298
1243
|
else
|
1299
|
-
|
1300
|
-
SQL::BooleanExpression.new(:AND, *expr.map{|x| filter_expr(x)})
|
1244
|
+
raise Error, "Invalid filter expression: #{expr.inspect}"
|
1301
1245
|
end
|
1302
|
-
when Proc
|
1303
|
-
Sequel::Deprecation.deprecate("Passing Proc objects as filter arguments", "Pass them as blocks to the filtering methods or to Sequel.expr")
|
1304
|
-
filter_expr(Sequel.virtual_row(&expr))
|
1305
1246
|
when LiteralString
|
1306
1247
|
LiteralString.new("(#{expr})")
|
1307
|
-
when Numeric, SQL::NumericExpression, SQL::StringExpression
|
1308
|
-
raise
|
1248
|
+
when Numeric, SQL::NumericExpression, SQL::StringExpression, Proc, String
|
1249
|
+
raise Error, "Invalid filter expression: #{expr.inspect}"
|
1309
1250
|
when TrueClass, FalseClass
|
1310
1251
|
if supports_where_true?
|
1311
1252
|
SQL::BooleanExpression.new(:NOOP, expr)
|
@@ -1314,9 +1255,6 @@ module Sequel
|
|
1314
1255
|
else
|
1315
1256
|
SQL::Constants::SQLFALSE
|
1316
1257
|
end
|
1317
|
-
when String
|
1318
|
-
Sequel::Deprecation.deprecate("Calling a dataset filtering method with a plain string", "Use Sequel.lit(#{expr.inspect}) to create a literal string and pass that to the dataset filtering method, or use the auto_literal_strings extension")
|
1319
|
-
LiteralString.new("(#{expr})")
|
1320
1258
|
when PlaceholderLiteralizer::Argument
|
1321
1259
|
expr.transform{|v| filter_expr(v)}
|
1322
1260
|
when SQL::PlaceholderLiteralString
|
@@ -1361,14 +1299,6 @@ module Sequel
|
|
1361
1299
|
server?(:default)
|
1362
1300
|
end
|
1363
1301
|
|
1364
|
-
# SEQUEL5: Remove
|
1365
|
-
def non_sql_options
|
1366
|
-
# :nocov:
|
1367
|
-
Sequel::Deprecation.deprecate("Dataset#non_sql_options (private method)", "Convert the related code to use the non_sql_option? method")
|
1368
|
-
NON_SQL_OPTIONS
|
1369
|
-
# :nocov:
|
1370
|
-
end
|
1371
|
-
|
1372
1302
|
# Whether the given option key does not affect the generated SQL.
|
1373
1303
|
def non_sql_option?(key)
|
1374
1304
|
NON_SQL_OPTIONS.include?(key)
|