sequel 4.49.0 → 5.3.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 +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/spec/core/dataset_spec.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative "spec_helper"
|
|
2
2
|
|
|
3
3
|
describe "Dataset" do
|
|
4
4
|
before do
|
|
@@ -50,6 +50,21 @@ describe "Dataset#clone" do
|
|
|
50
50
|
it "should create an exact copy of the dataset" do
|
|
51
51
|
@dataset = @dataset.with_row_proc(Proc.new{|r| r})
|
|
52
52
|
clone = @dataset.clone
|
|
53
|
+
@dataset.dup.must_be_same_as @dataset
|
|
54
|
+
|
|
55
|
+
if RUBY_VERSION >= '2.4'
|
|
56
|
+
clone.must_be_same_as @dataset
|
|
57
|
+
else
|
|
58
|
+
clone.object_id.wont_equal @dataset.object_id
|
|
59
|
+
clone.class.must_equal @dataset.class
|
|
60
|
+
clone.db.must_equal @dataset.db
|
|
61
|
+
clone.opts.must_equal @dataset.opts
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "should create an exact copy of the dataset when given an empty hash" do
|
|
66
|
+
@dataset = @dataset.with_row_proc(Proc.new{|r| r})
|
|
67
|
+
clone = @dataset.clone({})
|
|
53
68
|
|
|
54
69
|
clone.object_id.wont_equal @dataset.object_id
|
|
55
70
|
clone.class.must_equal @dataset.class
|
|
@@ -164,15 +179,12 @@ describe "A simple dataset" do
|
|
|
164
179
|
end
|
|
165
180
|
|
|
166
181
|
it "should format an insert statement with hash" do
|
|
167
|
-
@dataset.insert_sql(:name => 'wxyz', :price => 342).
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
@dataset.insert_sql({}).must_equal "INSERT INTO test DEFAULT VALUES"
|
|
182
|
+
@dataset.insert_sql(:name => 'wxyz', :price => 342).must_equal 'INSERT INTO test (name, price) VALUES (\'wxyz\', 342)'
|
|
183
|
+
@dataset.insert_sql({}).must_equal "INSERT INTO test DEFAULT VALUES"
|
|
171
184
|
end
|
|
172
185
|
|
|
173
186
|
it "should format an insert statement with string keys" do
|
|
174
|
-
@dataset.insert_sql('name' => 'wxyz', 'price' => 342).
|
|
175
|
-
must_match(/INSERT INTO test \(name, price\) VALUES \('wxyz', 342\)|INSERT INTO test \(price, name\) VALUES \(342, 'wxyz'\)/)
|
|
187
|
+
@dataset.insert_sql('name' => 'wxyz', 'price' => 342).must_equal 'INSERT INTO test (name, price) VALUES (\'wxyz\', 342)'
|
|
176
188
|
end
|
|
177
189
|
|
|
178
190
|
it "should format an insert statement with an arbitrary value" do
|
|
@@ -248,19 +260,17 @@ describe "A dataset with a limit" do
|
|
|
248
260
|
@dataset.db.sqls.must_equal ['DELETE FROM a']
|
|
249
261
|
end
|
|
250
262
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
end
|
|
263
|
+
it "should raise on #update" do
|
|
264
|
+
proc{@dataset.update(:a=>1)}.must_raise(Sequel::InvalidOperation)
|
|
265
|
+
end
|
|
255
266
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
end
|
|
267
|
+
it "should raise on #delete" do
|
|
268
|
+
proc{@dataset.delete}.must_raise(Sequel::InvalidOperation)
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
it "should raise on #truncate" do
|
|
272
|
+
proc{@dataset.truncate}.must_raise(Sequel::InvalidOperation)
|
|
273
|
+
proc{@dataset.skip_limit_check.truncate}.must_raise(Sequel::InvalidOperation)
|
|
264
274
|
end
|
|
265
275
|
end
|
|
266
276
|
|
|
@@ -279,19 +289,17 @@ describe "A dataset with an offset" do
|
|
|
279
289
|
@dataset.db.sqls.must_equal ['DELETE FROM a']
|
|
280
290
|
end
|
|
281
291
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
end
|
|
292
|
+
it "should raise on #update" do
|
|
293
|
+
proc{@dataset.update(:a=>1)}.must_raise(Sequel::InvalidOperation)
|
|
294
|
+
end
|
|
286
295
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
end
|
|
296
|
+
it "should raise on #delete" do
|
|
297
|
+
proc{@dataset.delete}.must_raise(Sequel::InvalidOperation)
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
it "should raise on #truncate" do
|
|
301
|
+
proc{@dataset.truncate}.must_raise(Sequel::InvalidOperation)
|
|
302
|
+
proc{@dataset.skip_limit_check.truncate}.must_raise(Sequel::InvalidOperation)
|
|
295
303
|
end
|
|
296
304
|
end
|
|
297
305
|
|
|
@@ -351,11 +359,17 @@ describe "Dataset#where" do
|
|
|
351
359
|
@d1 = @dataset.where(:region => 'Asia')
|
|
352
360
|
end
|
|
353
361
|
|
|
354
|
-
if
|
|
355
|
-
it "should just clone if given no arguments or block" do
|
|
362
|
+
it "should raise Error if given no arguments or block" do
|
|
356
363
|
proc{@dataset.where}.must_raise Sequel::Error
|
|
357
364
|
end
|
|
358
365
|
|
|
366
|
+
it "should raise Error for arrays/multiple arguments that are not condition specifiers" do
|
|
367
|
+
proc{@dataset.where('a = ?', 1)}.must_raise Sequel::Error
|
|
368
|
+
proc{@dataset.where(['a = ?', 1])}.must_raise Sequel::Error
|
|
369
|
+
proc{@dataset.where({:a=>1}, {:b=>2})}.must_raise Sequel::Error
|
|
370
|
+
proc{@dataset.where([{:a=>1}, {:b=>2}])}.must_raise Sequel::Error
|
|
371
|
+
end
|
|
372
|
+
|
|
359
373
|
it "should handle nil argument if block is given" do
|
|
360
374
|
@d1.where(nil){a}.sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND NULL AND a)"
|
|
361
375
|
end
|
|
@@ -363,7 +377,15 @@ describe "Dataset#where" do
|
|
|
363
377
|
it "should handle nil argument if block has no existing filter" do
|
|
364
378
|
@dataset.where(nil).sql.must_equal "SELECT * FROM test WHERE NULL"
|
|
365
379
|
end
|
|
380
|
+
|
|
381
|
+
deprecated "should handle nil block result has no existing filter" do
|
|
382
|
+
@dataset.where{nil}.sql.must_equal "SELECT * FROM test"
|
|
366
383
|
end
|
|
384
|
+
|
|
385
|
+
# SEQUEL54
|
|
386
|
+
it "should handle nil block result has no existing filter" do
|
|
387
|
+
@dataset.where{nil}.sql.must_equal "SELECT * FROM test WHERE NULL"
|
|
388
|
+
end if false
|
|
367
389
|
|
|
368
390
|
it "should just clone if given an empty array or hash argument" do
|
|
369
391
|
@dataset.where({}).sql.must_equal @dataset.sql
|
|
@@ -373,84 +395,36 @@ describe "Dataset#where" do
|
|
|
373
395
|
@dataset.filter([]).sql.must_equal @dataset.sql
|
|
374
396
|
end
|
|
375
397
|
|
|
376
|
-
|
|
377
|
-
@dataset.where
|
|
378
|
-
@dataset.filter
|
|
379
|
-
end
|
|
380
|
-
|
|
381
|
-
deprecated "should just clone if given no arguments or block" do
|
|
382
|
-
@dataset.where.sql.must_equal @dataset.sql
|
|
383
|
-
@dataset.filter.sql.must_equal @dataset.sql
|
|
384
|
-
end
|
|
385
|
-
|
|
386
|
-
deprecated "should ignore nil argument if block is given" do
|
|
387
|
-
@d1.where(nil){a}.sql.must_equal @d1.where(:a).sql
|
|
398
|
+
it "should raise if no arguments or block" do
|
|
399
|
+
proc{@dataset.where}.must_raise Sequel::Error
|
|
400
|
+
proc{@dataset.filter}.must_raise Sequel::Error
|
|
388
401
|
end
|
|
389
402
|
|
|
390
|
-
|
|
391
|
-
@dataset.where(nil).sql.must_equal
|
|
403
|
+
it "should treat nil as NULL argument if block has no existing filter" do
|
|
404
|
+
@dataset.where(nil).sql.must_equal "SELECT * FROM test WHERE NULL"
|
|
405
|
+
@d1.where(nil).sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND NULL)"
|
|
392
406
|
end
|
|
393
407
|
|
|
394
408
|
it "should work with hashes" do
|
|
395
|
-
@dataset.where(:name => 'xyz', :price => 342).select_sql.
|
|
396
|
-
must_match(/WHERE \(\(name = 'xyz'\) AND \(price = 342\)\)|WHERE \(\(price = 342\) AND \(name = 'xyz'\)\)/)
|
|
397
|
-
end
|
|
398
|
-
|
|
399
|
-
deprecated "should handle literal strings in arrays in filter methods" do
|
|
400
|
-
@dataset.where([Sequel.lit("a")]).sql.must_equal 'SELECT * FROM test WHERE (a)'
|
|
401
|
-
end
|
|
402
|
-
|
|
403
|
-
deprecated "should work with a string with placeholders and arguments for those placeholders" do
|
|
404
|
-
@dataset.where('price < ? AND id in ?', 100, [1, 2, 3]).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in (1, 2, 3))"
|
|
409
|
+
@dataset.where(:name => 'xyz', :price => 342).select_sql.must_equal 'SELECT * FROM test WHERE ((name = \'xyz\') AND (price = 342))'
|
|
405
410
|
end
|
|
406
411
|
|
|
407
412
|
it "should work with a placeholder literal string" do
|
|
408
413
|
@dataset.where(Sequel.lit('price < ? AND id in ?', 100, [1, 2, 3])).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in (1, 2, 3))"
|
|
409
414
|
end
|
|
410
415
|
|
|
411
|
-
deprecated "should not modify passed array with placeholders" do
|
|
412
|
-
a = ['price < ? AND id in ?', 100, 1, 2, 3]
|
|
413
|
-
b = a.dup
|
|
414
|
-
@dataset.where(a)
|
|
415
|
-
b.must_equal a
|
|
416
|
-
end
|
|
417
|
-
|
|
418
|
-
deprecated "should work with strings (custom SQL expressions)" do
|
|
419
|
-
@dataset.where('(a = 1 AND b = 2)').select_sql.must_equal "SELECT * FROM test WHERE ((a = 1 AND b = 2))"
|
|
420
|
-
end
|
|
421
|
-
|
|
422
416
|
it "should work with literal strings" do
|
|
423
417
|
@dataset.where(Sequel.lit('(a = 1 AND b = 2)')).select_sql.must_equal "SELECT * FROM test WHERE ((a = 1 AND b = 2))"
|
|
424
418
|
end
|
|
425
419
|
|
|
426
|
-
deprecated "should work with a string with named placeholders and a hash of placeholder value arguments" do
|
|
427
|
-
@dataset.where('price < :price AND id in :ids', :price=>100, :ids=>[1, 2, 3]).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in (1, 2, 3))"
|
|
428
|
-
end
|
|
429
|
-
|
|
430
420
|
it "should work with named placeholder strings" do
|
|
431
421
|
@dataset.where(Sequel.lit('price < :price AND id in :ids', :price=>100, :ids=>[1, 2, 3])).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in (1, 2, 3))"
|
|
432
422
|
end
|
|
433
423
|
|
|
434
|
-
deprecated "should not modify passed array with named placeholders" do
|
|
435
|
-
a = ['price < :price AND id in :ids', {:price=>100}]
|
|
436
|
-
b = a.dup
|
|
437
|
-
@dataset.where(a)
|
|
438
|
-
b.must_equal a
|
|
439
|
-
end
|
|
440
|
-
|
|
441
|
-
deprecated "should not replace named placeholders that don't exist in the hash" do
|
|
442
|
-
@dataset.where('price < :price AND id in :ids', :price=>100).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in :ids)"
|
|
443
|
-
end
|
|
444
|
-
|
|
445
424
|
it "should not replace named placeholders that don't exist in the hash when using placeholder strings" do
|
|
446
425
|
@dataset.where(Sequel.lit('price < :price AND id in :ids', :price=>100)).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in :ids)"
|
|
447
426
|
end
|
|
448
427
|
|
|
449
|
-
deprecated "should raise an error for a mismatched number of placeholders" do
|
|
450
|
-
proc{@dataset.where('price < ? AND id in ?', 100).select_sql}.must_raise(Sequel::Error)
|
|
451
|
-
proc{@dataset.where('price < ? AND id in ?', 100, [1, 2, 3], 4).select_sql}.must_raise(Sequel::Error)
|
|
452
|
-
end
|
|
453
|
-
|
|
454
428
|
it "should raise an error for a mismatched number of placeholders in placeholder literal strings" do
|
|
455
429
|
proc{@dataset.where(Sequel.lit('price < ? AND id in ?', 100)).select_sql}.must_raise(Sequel::Error)
|
|
456
430
|
proc{@dataset.where(Sequel.lit('price < ? AND id in ?', 100, [1, 2, 3], 4)).select_sql}.must_raise(Sequel::Error)
|
|
@@ -466,19 +440,10 @@ describe "Dataset#where" do
|
|
|
466
440
|
proc{@dataset.where(Sequel.lit(['price < ', ' AND id in '], 100, [1, 2, 3], 4)).select_sql}.must_raise(Sequel::Error)
|
|
467
441
|
end
|
|
468
442
|
|
|
469
|
-
deprecated "should handle partial names" do
|
|
470
|
-
@dataset.where('price < :price AND id = :p', :p=>2, :price=>100).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id = 2)"
|
|
471
|
-
end
|
|
472
|
-
|
|
473
443
|
it "should handle partial names when using placeholder literal strings" do
|
|
474
444
|
@dataset.where(Sequel.lit('price < :price AND id = :p', :p=>2, :price=>100)).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id = 2)"
|
|
475
445
|
end
|
|
476
446
|
|
|
477
|
-
deprecated "should handle ::cast syntax when no parameters are supplied" do
|
|
478
|
-
@dataset.where('price::float = 10', {}).select_sql.must_equal "SELECT * FROM test WHERE (price::float = 10)"
|
|
479
|
-
@dataset.where('price::float ? 10', {}).select_sql.must_equal "SELECT * FROM test WHERE (price::float ? 10)"
|
|
480
|
-
end
|
|
481
|
-
|
|
482
447
|
it "should handle ::cast syntax when no parameters are supplied when using placeholder strings" do
|
|
483
448
|
@dataset.where(Sequel.lit('price::float = 10', {})).select_sql.must_equal "SELECT * FROM test WHERE (price::float = 10)"
|
|
484
449
|
@dataset.where(Sequel.lit('price::float ? 10', {})).select_sql.must_equal "SELECT * FROM test WHERE (price::float ? 10)"
|
|
@@ -490,18 +455,6 @@ describe "Dataset#where" do
|
|
|
490
455
|
@d1.update_sql(:GDP => 0).must_equal "UPDATE test SET GDP = 0 WHERE (region = 'Asia')"
|
|
491
456
|
end
|
|
492
457
|
|
|
493
|
-
deprecated "should affect select, delete and update statements when using strings" do
|
|
494
|
-
@d2 = @dataset.where('region = ?', 'Asia')
|
|
495
|
-
@d2.select_sql.must_equal "SELECT * FROM test WHERE (region = 'Asia')"
|
|
496
|
-
@d2.delete_sql.must_equal "DELETE FROM test WHERE (region = 'Asia')"
|
|
497
|
-
@d2.update_sql(:GDP => 0).must_equal "UPDATE test SET GDP = 0 WHERE (region = 'Asia')"
|
|
498
|
-
|
|
499
|
-
@d3 = @dataset.where("a = 1")
|
|
500
|
-
@d3.select_sql.must_equal "SELECT * FROM test WHERE (a = 1)"
|
|
501
|
-
@d3.delete_sql.must_equal "DELETE FROM test WHERE (a = 1)"
|
|
502
|
-
@d3.update_sql(:GDP => 0).must_equal "UPDATE test SET GDP = 0 WHERE (a = 1)"
|
|
503
|
-
end
|
|
504
|
-
|
|
505
458
|
it "should affect select, delete and update statements when using literal strings" do
|
|
506
459
|
@d2 = @dataset.where(Sequel.lit('region = ?', 'Asia'))
|
|
507
460
|
@d2.select_sql.must_equal "SELECT * FROM test WHERE (region = 'Asia')"
|
|
@@ -521,18 +474,6 @@ describe "Dataset#where" do
|
|
|
521
474
|
@d1.where{GDP() > 1000}.select_sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > 1000))"
|
|
522
475
|
end
|
|
523
476
|
|
|
524
|
-
deprecated "should be composable using AND operator (for scoping) when using strings" do
|
|
525
|
-
@d2 = @dataset.where('region = ?', 'Asia')
|
|
526
|
-
@d2.where('GDP > ?', 1000).select_sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > 1000))"
|
|
527
|
-
@d2.where(:name => ['Japan', 'China']).select_sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND (name IN ('Japan', 'China')))"
|
|
528
|
-
@d2.where('GDP > ?').select_sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > ?))"
|
|
529
|
-
|
|
530
|
-
@d3 = @dataset.where("a = 1")
|
|
531
|
-
@d3.where('b = 2').select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (b = 2))"
|
|
532
|
-
@d3.where(:c => 3).select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (c = 3))"
|
|
533
|
-
@d3.where('d = ?', 4).select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (d = 4))"
|
|
534
|
-
end
|
|
535
|
-
|
|
536
477
|
it "should be composable using AND operator (for scoping) when using literal strings" do
|
|
537
478
|
@d2 = @dataset.where(Sequel.lit('region = ?', 'Asia'))
|
|
538
479
|
@d2.where(Sequel.lit('GDP > ?', 1000)).select_sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > 1000))"
|
|
@@ -545,10 +486,6 @@ describe "Dataset#where" do
|
|
|
545
486
|
@d3.where(Sequel.lit('d = ?', 4)).select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (d = 4))"
|
|
546
487
|
end
|
|
547
488
|
|
|
548
|
-
deprecated "should be composable using AND operator (for scoping) with block and string" do
|
|
549
|
-
@dataset.where("a = 1").where{e < 5}.select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (e < 5))"
|
|
550
|
-
end
|
|
551
|
-
|
|
552
489
|
it "should be composable using AND operator (for scoping) with block and literal string" do
|
|
553
490
|
@dataset.where(Sequel.lit("a = 1")).where{e < 5}.select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (e < 5))"
|
|
554
491
|
end
|
|
@@ -660,20 +597,10 @@ describe "Dataset#where" do
|
|
|
660
597
|
@dataset.filter(Sequel::SQLFALSE).sql.must_equal "SELECT * FROM test WHERE (1 = 0)"
|
|
661
598
|
end
|
|
662
599
|
|
|
663
|
-
deprecated "should allow the use of multiple arguments" do
|
|
664
|
-
@dataset.filter(:a, :b).sql.must_equal 'SELECT * FROM test WHERE (a AND b)'
|
|
665
|
-
@dataset.filter(:a, :b=>1).sql.must_equal 'SELECT * FROM test WHERE (a AND (b = 1))'
|
|
666
|
-
@dataset.filter(:a, Sequel.expr(:c) > 3, :b=>1).sql.must_equal 'SELECT * FROM test WHERE (a AND (c > 3) AND (b = 1))'
|
|
667
|
-
end
|
|
668
|
-
|
|
669
600
|
it "should allow the use of blocks and arguments simultaneously" do
|
|
670
601
|
@dataset.filter(Sequel.expr(:zz) < 3){yy > 3}.sql.must_equal 'SELECT * FROM test WHERE ((zz < 3) AND (yy > 3))'
|
|
671
602
|
end
|
|
672
603
|
|
|
673
|
-
deprecated "should allow the use of procs" do
|
|
674
|
-
@dataset.filter(proc{yy > 3}).sql.must_equal 'SELECT * FROM test WHERE (yy > 3)'
|
|
675
|
-
end
|
|
676
|
-
|
|
677
604
|
it "should yield a VirtualRow to the block" do
|
|
678
605
|
x = nil
|
|
679
606
|
@dataset.filter{|r| x = r; false}
|
|
@@ -725,18 +652,10 @@ describe "Dataset#or" do
|
|
|
725
652
|
@d1.or([]).sql.must_equal @d1.sql
|
|
726
653
|
end
|
|
727
654
|
|
|
728
|
-
deprecated "should just clone if given an empty string argument" do
|
|
729
|
-
@d1.or('').sql.must_equal @d1.sql
|
|
730
|
-
end
|
|
731
|
-
|
|
732
655
|
it "should add an alternative expression to the where clause" do
|
|
733
656
|
@d1.or(:y => 2).sql.must_equal 'SELECT * FROM test WHERE ((x = 1) OR (y = 2))'
|
|
734
657
|
end
|
|
735
658
|
|
|
736
|
-
deprecated "should accept string filters" do
|
|
737
|
-
@d1.or('y > ?', 2).sql.must_equal 'SELECT * FROM test WHERE ((x = 1) OR (y > 2))'
|
|
738
|
-
end
|
|
739
|
-
|
|
740
659
|
it "should accept literal string filters" do
|
|
741
660
|
@d1.or(Sequel.lit('y > ?', 2)).sql.must_equal 'SELECT * FROM test WHERE ((x = 1) OR (y > 2))'
|
|
742
661
|
end
|
|
@@ -759,42 +678,6 @@ describe "Dataset#or" do
|
|
|
759
678
|
end
|
|
760
679
|
end
|
|
761
680
|
|
|
762
|
-
describe "Dataset#and" do
|
|
763
|
-
before do
|
|
764
|
-
@dataset = Sequel.mock.dataset.from(:test)
|
|
765
|
-
@d1 = @dataset.where(:x => 1)
|
|
766
|
-
end
|
|
767
|
-
|
|
768
|
-
deprecated "should add a WHERE filter if none exists" do
|
|
769
|
-
@dataset.and(:a => 1).sql.must_equal 'SELECT * FROM test WHERE (a = 1)'
|
|
770
|
-
end
|
|
771
|
-
|
|
772
|
-
deprecated "should add an expression to the where clause" do
|
|
773
|
-
@d1.and(:y => 2).sql.must_equal 'SELECT * FROM test WHERE ((x = 1) AND (y = 2))'
|
|
774
|
-
end
|
|
775
|
-
|
|
776
|
-
deprecated "should accept string filters with placeholders" do
|
|
777
|
-
@d1.and('y > ?', 2).sql.must_equal 'SELECT * FROM test WHERE ((x = 1) AND (y > 2))'
|
|
778
|
-
end
|
|
779
|
-
|
|
780
|
-
deprecated "should accept placeholder literal string filters" do
|
|
781
|
-
@d1.and(Sequel.lit('y > ?', 2)).sql.must_equal 'SELECT * FROM test WHERE ((x = 1) AND (y > 2))'
|
|
782
|
-
end
|
|
783
|
-
|
|
784
|
-
deprecated "should accept expression filters" do
|
|
785
|
-
@d1.and(Sequel.expr(:yy) > 3).sql.must_equal 'SELECT * FROM test WHERE ((x = 1) AND (yy > 3))'
|
|
786
|
-
end
|
|
787
|
-
|
|
788
|
-
deprecated "should accept blocks passed to filter" do
|
|
789
|
-
@d1.and{yy > 3}.sql.must_equal 'SELECT * FROM test WHERE ((x = 1) AND (yy > 3))'
|
|
790
|
-
end
|
|
791
|
-
|
|
792
|
-
deprecated "should correctly add parens to give predictable results" do
|
|
793
|
-
@d1.or(:y => 2).and(:z => 3).sql.must_equal 'SELECT * FROM test WHERE (((x = 1) OR (y = 2)) AND (z = 3))'
|
|
794
|
-
@d1.and(:y => 2).or(:z => 3).sql.must_equal 'SELECT * FROM test WHERE (((x = 1) AND (y = 2)) OR (z = 3))'
|
|
795
|
-
end
|
|
796
|
-
end
|
|
797
|
-
|
|
798
681
|
describe "Dataset#exclude" do
|
|
799
682
|
before do
|
|
800
683
|
@dataset = Sequel.mock.dataset.from(:test)
|
|
@@ -805,17 +688,7 @@ describe "Dataset#exclude" do
|
|
|
805
688
|
end
|
|
806
689
|
|
|
807
690
|
it "should take multiple conditions as a hash and express the logic correctly in SQL" do
|
|
808
|
-
@dataset.exclude(:region => 'Asia', :name => 'Japan').select_sql.
|
|
809
|
-
must_match(Regexp.union(/WHERE \(\(region != 'Asia'\) OR \(name != 'Japan'\)\)/,
|
|
810
|
-
/WHERE \(\(name != 'Japan'\) OR \(region != 'Asia'\)\)/))
|
|
811
|
-
end
|
|
812
|
-
|
|
813
|
-
deprecated "should parenthesize a single string condition correctly" do
|
|
814
|
-
@dataset.exclude("region = 'Asia' AND name = 'Japan'").select_sql.must_equal "SELECT * FROM test WHERE NOT (region = 'Asia' AND name = 'Japan')"
|
|
815
|
-
end
|
|
816
|
-
|
|
817
|
-
deprecated "should parenthesize an array condition correctly" do
|
|
818
|
-
@dataset.exclude('region = ? AND name = ?', 'Asia', 'Japan').select_sql.must_equal "SELECT * FROM test WHERE NOT (region = 'Asia' AND name = 'Japan')"
|
|
691
|
+
@dataset.exclude(:region => 'Asia', :name => 'Japan').select_sql.must_equal 'SELECT * FROM test WHERE ((region != \'Asia\') OR (name != \'Japan\'))'
|
|
819
692
|
end
|
|
820
693
|
|
|
821
694
|
it "should parenthesize a single literal string condition correctly" do
|
|
@@ -840,24 +713,8 @@ describe "Dataset#exclude" do
|
|
|
840
713
|
end
|
|
841
714
|
end
|
|
842
715
|
|
|
843
|
-
describe "Dataset#exclude_where" do
|
|
844
|
-
before do
|
|
845
|
-
@dataset = Sequel.mock.dataset.from(:test)
|
|
846
|
-
end
|
|
847
|
-
|
|
848
|
-
deprecated "should correctly negate the expression and add it to the where clause" do
|
|
849
|
-
@dataset.exclude_where(:region=>'Asia').sql.must_equal "SELECT * FROM test WHERE (region != 'Asia')"
|
|
850
|
-
@dataset.exclude_where(:region=>'Asia').exclude_where(:region=>'NA').sql.must_equal "SELECT * FROM test WHERE ((region != 'Asia') AND (region != 'NA'))"
|
|
851
|
-
end
|
|
852
|
-
|
|
853
|
-
deprecated "should affect the where clause even if having clause is already used" do
|
|
854
|
-
@dataset.group_and_count(:name).having{count > 2}.exclude_where(:region=>'Asia').sql.
|
|
855
|
-
must_equal "SELECT name, count(*) AS count FROM test WHERE (region != 'Asia') GROUP BY name HAVING (count > 2)"
|
|
856
|
-
end
|
|
857
|
-
end
|
|
858
|
-
|
|
859
716
|
describe "Dataset#exclude_having" do
|
|
860
|
-
|
|
717
|
+
it "should correctly negate the expression and add it to the having clause" do
|
|
861
718
|
Sequel.mock.dataset.from(:test).exclude_having{count > 2}.exclude_having{count < 0}.sql.must_equal "SELECT * FROM test HAVING ((count <= 2) AND (count >= 0))"
|
|
862
719
|
end
|
|
863
720
|
end
|
|
@@ -893,14 +750,6 @@ describe "Dataset#having" do
|
|
|
893
750
|
@dataset.having([]).sql.must_equal @dataset.sql
|
|
894
751
|
end
|
|
895
752
|
|
|
896
|
-
deprecated "should just clone if given an empty string argument" do
|
|
897
|
-
@dataset.having('').sql.must_equal @dataset.sql
|
|
898
|
-
end
|
|
899
|
-
|
|
900
|
-
deprecated "should handle string arguments" do
|
|
901
|
-
@grouped.having('sum(population) > 10').select_sql.must_equal "SELECT region, sum(population), avg(gdp) FROM test GROUP BY region HAVING (sum(population) > 10)"
|
|
902
|
-
end
|
|
903
|
-
|
|
904
753
|
it "should handle literal string arguments" do
|
|
905
754
|
@grouped.having(Sequel.lit('sum(population) > 10')).select_sql.must_equal "SELECT region, sum(population), avg(gdp) FROM test GROUP BY region HAVING (sum(population) > 10)"
|
|
906
755
|
end
|
|
@@ -2316,8 +2165,9 @@ describe "Dataset#count" do
|
|
|
2316
2165
|
|
|
2317
2166
|
it "should work on a graphed_dataset" do
|
|
2318
2167
|
ds = @dataset.with_extend{ def columns; [:a] end}
|
|
2319
|
-
|
|
2320
|
-
@
|
|
2168
|
+
ds.graph(@dataset, [:a], :table_alias=>:test2).count.must_equal 1
|
|
2169
|
+
@dataset.graph(ds, [:a], :table_alias=>:test2).count.must_equal 1
|
|
2170
|
+
@db.sqls.must_equal(['SELECT count(*) AS count FROM test LEFT OUTER JOIN test AS test2 USING (a) LIMIT 1'] * 2)
|
|
2321
2171
|
end
|
|
2322
2172
|
|
|
2323
2173
|
it "should not cache the columns value" do
|
|
@@ -2397,10 +2247,7 @@ describe "Dataset#first_source_alias" do
|
|
|
2397
2247
|
end
|
|
2398
2248
|
|
|
2399
2249
|
it "should be the entire first source if not aliased" do
|
|
2400
|
-
|
|
2401
|
-
# SEQUEL5: Remove deprecation block, but keep code
|
|
2402
|
-
@ds.from(:s__t).first_source_alias.must_equal :s__t
|
|
2403
|
-
end
|
|
2250
|
+
@ds.from(:s__t).first_source_alias.must_equal :s__t
|
|
2404
2251
|
end
|
|
2405
2252
|
|
|
2406
2253
|
with_symbol_splitting "should be the alias if aliased when using symbol splitting" do
|
|
@@ -2440,10 +2287,7 @@ describe "Dataset#first_source_table" do
|
|
|
2440
2287
|
|
|
2441
2288
|
it "should be the entire first source if not aliased" do
|
|
2442
2289
|
@ds.from(:t).first_source_table.must_equal :t
|
|
2443
|
-
|
|
2444
|
-
# SEQUEL5: Remove deprecation block, but keep code
|
|
2445
|
-
@ds.from(:s__t).first_source_table.must_equal :s__t
|
|
2446
|
-
end
|
|
2290
|
+
@ds.from(:s__t).first_source_table.must_equal :s__t
|
|
2447
2291
|
end
|
|
2448
2292
|
|
|
2449
2293
|
it "should be the entire first source if not aliased" do
|
|
@@ -2693,10 +2537,6 @@ describe "Dataset#join_table" do
|
|
|
2693
2537
|
'RIGHT OUTER JOIN (SELECT * FROM attributes WHERE (name = \'blah\')) AS "t3" ON ("t3"."attribute_id" = "t2"."id")'
|
|
2694
2538
|
end
|
|
2695
2539
|
|
|
2696
|
-
deprecated "should support using a string as the join condition" do
|
|
2697
|
-
@d.join(:categories, "c.item_id = items.id", :table_alias=>:c).sql.must_equal 'SELECT * FROM "items" INNER JOIN "categories" AS "c" ON (c.item_id = items.id)'
|
|
2698
|
-
end
|
|
2699
|
-
|
|
2700
2540
|
it "should support using a literal string as the join condition" do
|
|
2701
2541
|
@d.join(:categories, Sequel.lit("c.item_id = items.id"), :table_alias=>:c).sql.must_equal 'SELECT * FROM "items" INNER JOIN "categories" AS "c" ON (c.item_id = items.id)'
|
|
2702
2542
|
end
|
|
@@ -2874,73 +2714,6 @@ describe "Dataset aggregate methods" do
|
|
|
2874
2714
|
end
|
|
2875
2715
|
end
|
|
2876
2716
|
|
|
2877
|
-
describe "Dataset#range" do
|
|
2878
|
-
before do
|
|
2879
|
-
@db = Sequel.mock(:fetch=>{:v1 => 1, :v2 => 10})
|
|
2880
|
-
@ds = @db[:test].freeze
|
|
2881
|
-
end
|
|
2882
|
-
|
|
2883
|
-
deprecated "should generate a correct SQL statement" do
|
|
2884
|
-
5.times do
|
|
2885
|
-
@ds.range(:stamp)
|
|
2886
|
-
@db.sqls.must_equal ["SELECT min(stamp) AS v1, max(stamp) AS v2 FROM test LIMIT 1"]
|
|
2887
|
-
end
|
|
2888
|
-
|
|
2889
|
-
@ds.filter(Sequel.expr(:price) > 100).range(:stamp)
|
|
2890
|
-
@db.sqls.must_equal ["SELECT min(stamp) AS v1, max(stamp) AS v2 FROM test WHERE (price > 100) LIMIT 1"]
|
|
2891
|
-
end
|
|
2892
|
-
|
|
2893
|
-
deprecated "should return a range object" do
|
|
2894
|
-
5.times do
|
|
2895
|
-
@ds.range(:tryme).must_equal(1..10)
|
|
2896
|
-
end
|
|
2897
|
-
end
|
|
2898
|
-
|
|
2899
|
-
deprecated "should use a subselect for the same conditions as count" do
|
|
2900
|
-
@ds.order(:stamp).limit(5).range(:stamp).must_equal(1..10)
|
|
2901
|
-
@db.sqls.must_equal ['SELECT min(stamp) AS v1, max(stamp) AS v2 FROM (SELECT * FROM test ORDER BY stamp LIMIT 5) AS t1 LIMIT 1']
|
|
2902
|
-
end
|
|
2903
|
-
|
|
2904
|
-
deprecated "should accept virtual row blocks" do
|
|
2905
|
-
5.times do
|
|
2906
|
-
@ds.range{a(b)}
|
|
2907
|
-
@db.sqls.must_equal ["SELECT min(a(b)) AS v1, max(a(b)) AS v2 FROM test LIMIT 1"]
|
|
2908
|
-
end
|
|
2909
|
-
end
|
|
2910
|
-
end
|
|
2911
|
-
|
|
2912
|
-
describe "Dataset#interval" do
|
|
2913
|
-
before do
|
|
2914
|
-
@db = Sequel.mock(:fetch=>{:v => 1234})
|
|
2915
|
-
@ds = @db[:test].freeze
|
|
2916
|
-
end
|
|
2917
|
-
|
|
2918
|
-
deprecated "should generate the correct SQL statement" do
|
|
2919
|
-
5.times do
|
|
2920
|
-
@ds.interval(:stamp)
|
|
2921
|
-
@db.sqls.must_equal ["SELECT (max(stamp) - min(stamp)) AS interval FROM test LIMIT 1"]
|
|
2922
|
-
end
|
|
2923
|
-
|
|
2924
|
-
@ds.filter(Sequel.expr(:price) > 100).interval(:stamp)
|
|
2925
|
-
@db.sqls.must_equal ["SELECT (max(stamp) - min(stamp)) AS interval FROM test WHERE (price > 100) LIMIT 1"]
|
|
2926
|
-
end
|
|
2927
|
-
|
|
2928
|
-
deprecated "should use a subselect for the same conditions as count" do
|
|
2929
|
-
ds = @ds.order(:stamp).limit(5)
|
|
2930
|
-
5.times do
|
|
2931
|
-
ds.interval(:stamp).must_equal 1234
|
|
2932
|
-
@db.sqls.must_equal ['SELECT (max(stamp) - min(stamp)) AS interval FROM (SELECT * FROM test ORDER BY stamp LIMIT 5) AS t1 LIMIT 1']
|
|
2933
|
-
end
|
|
2934
|
-
end
|
|
2935
|
-
|
|
2936
|
-
deprecated "should accept virtual row blocks" do
|
|
2937
|
-
5.times do
|
|
2938
|
-
@ds.interval{a(b)}
|
|
2939
|
-
@db.sqls.must_equal ["SELECT (max(a(b)) - min(a(b))) AS interval FROM test LIMIT 1"]
|
|
2940
|
-
end
|
|
2941
|
-
end
|
|
2942
|
-
end
|
|
2943
|
-
|
|
2944
2717
|
describe "Dataset #first and #last" do
|
|
2945
2718
|
before do
|
|
2946
2719
|
@d = Sequel.mock(:fetch=>proc{|s| {:s=>s}})[:test]
|
|
@@ -2999,16 +2772,6 @@ describe "Dataset #first and #last" do
|
|
|
2999
2772
|
end
|
|
3000
2773
|
end
|
|
3001
2774
|
|
|
3002
|
-
deprecated "should combine block and standard argument filters if argument is a string" do
|
|
3003
|
-
ds = @d.order(:name).freeze
|
|
3004
|
-
5.times do
|
|
3005
|
-
@d.first('y = 25'){z > 26}.must_equal(:s=>'SELECT * FROM test WHERE ((y = 25) AND (z > 26)) LIMIT 1')
|
|
3006
|
-
ds.last('y = 16'){z > 26}.must_equal(:s=>'SELECT * FROM test WHERE ((y = 16) AND (z > 26)) ORDER BY name DESC LIMIT 1')
|
|
3007
|
-
@d.first('y = ?', 25){z > 26}.must_equal(:s=>'SELECT * FROM test WHERE ((y = 25) AND (z > 26)) LIMIT 1')
|
|
3008
|
-
ds.last('y = ?', 16){z > 26}.must_equal(:s=>'SELECT * FROM test WHERE ((y = 16) AND (z > 26)) ORDER BY name DESC LIMIT 1')
|
|
3009
|
-
end
|
|
3010
|
-
end
|
|
3011
|
-
|
|
3012
2775
|
it "should filter and return an array of records if an Integer argument is provided and a block is given" do
|
|
3013
2776
|
ds = @d.order(:a).freeze
|
|
3014
2777
|
5.times do
|
|
@@ -3264,7 +3027,7 @@ describe "Dataset#single_value!" do
|
|
|
3264
3027
|
|
|
3265
3028
|
it "should call each and return the first value of the first record" do
|
|
3266
3029
|
@db.fetch = [{:a=>1, :b=>2}, {:a=>3, :b=>4}]
|
|
3267
|
-
@db[:test].single_value!.
|
|
3030
|
+
@db[:test].single_value!.must_equal 1
|
|
3268
3031
|
@db.sqls.must_equal ['SELECT * FROM test']
|
|
3269
3032
|
end
|
|
3270
3033
|
|
|
@@ -3705,10 +3468,7 @@ describe "Dataset#multi_insert" do
|
|
|
3705
3468
|
|
|
3706
3469
|
it "should accept string keys as column names" do
|
|
3707
3470
|
@ds.multi_insert([{'x'=>1, 'y'=>2}, {'x'=>3, 'y'=>4}])
|
|
3708
|
-
|
|
3709
|
-
["INSERT INTO items (x, y) VALUES (1, 2)", "INSERT INTO items (y, x) VALUES (2, 1)"].must_include(sqls.slice!(1))
|
|
3710
|
-
["INSERT INTO items (x, y) VALUES (3, 4)", "INSERT INTO items (y, x) VALUES (4, 3)"].must_include(sqls.slice!(1))
|
|
3711
|
-
sqls.must_equal ['BEGIN', 'COMMIT']
|
|
3471
|
+
@db.sqls.must_equal ['BEGIN', "INSERT INTO items (x, y) VALUES (1, 2)", "INSERT INTO items (x, y) VALUES (3, 4)", 'COMMIT']
|
|
3712
3472
|
end
|
|
3713
3473
|
|
|
3714
3474
|
it "should not do anything if no hashes are provided" do
|
|
@@ -3722,8 +3482,8 @@ describe "Dataset#update_sql" do
|
|
|
3722
3482
|
@ds = Sequel.mock.dataset.from(:items)
|
|
3723
3483
|
end
|
|
3724
3484
|
|
|
3725
|
-
|
|
3726
|
-
@ds.update_sql("a = b").
|
|
3485
|
+
it "should raise Error for plain strings" do
|
|
3486
|
+
proc{@ds.update_sql("a = b")}.must_raise Sequel::Error
|
|
3727
3487
|
end
|
|
3728
3488
|
|
|
3729
3489
|
it "should accept literal strings" do
|
|
@@ -3817,6 +3577,16 @@ describe "Dataset#insert_sql" do
|
|
|
3817
3577
|
it "should use unaliased table name" do
|
|
3818
3578
|
@ds.from(Sequel.as(:items, :i)).insert_sql(1).must_equal "INSERT INTO items VALUES (1)"
|
|
3819
3579
|
end
|
|
3580
|
+
|
|
3581
|
+
it "should hoist WITH clauses from query if the dataset doesn't support CTEs in subselects" do
|
|
3582
|
+
@ds = @ds.with_extend do
|
|
3583
|
+
Sequel::Dataset.def_sql_method(self, :insert, %w'with insert into columns values')
|
|
3584
|
+
def supports_cte?(type=:select); true end
|
|
3585
|
+
def supports_cte_in_subselect?; false end
|
|
3586
|
+
end
|
|
3587
|
+
@ds.insert_sql(@ds.from(:foo).with(:foo, @ds.select(:bar))).must_equal 'WITH foo AS (SELECT bar FROM items) INSERT INTO items SELECT * FROM foo'
|
|
3588
|
+
@ds.insert_sql([:a], @ds.from(:foo).with(:foo, @ds.select(:bar))).must_equal 'WITH foo AS (SELECT bar FROM items) INSERT INTO items (a) SELECT * FROM foo'
|
|
3589
|
+
end
|
|
3820
3590
|
end
|
|
3821
3591
|
|
|
3822
3592
|
describe "Dataset#inspect" do
|
|
@@ -4121,6 +3891,15 @@ describe "Dataset prepared statements and bound variables " do
|
|
|
4121
3891
|
]*2)
|
|
4122
3892
|
end
|
|
4123
3893
|
|
|
3894
|
+
it "Dataset#prepare with a delayed evaluation should raise an error" do
|
|
3895
|
+
proc{@ds.where(Sequel.delay{{:n=>1}}).prepare(:select, :select_n)}.must_raise Sequel::Error
|
|
3896
|
+
end
|
|
3897
|
+
|
|
3898
|
+
it "Dataset#call with a delayed evaluation should work" do
|
|
3899
|
+
@ds.where(Sequel.delay{{:n=>1}}).call(:select).must_equal []
|
|
3900
|
+
@db.sqls.must_equal ["SELECT * FROM items WHERE (n = 1)"]
|
|
3901
|
+
end
|
|
3902
|
+
|
|
4124
3903
|
it "PreparedStatement#prepare should raise an error" do
|
|
4125
3904
|
ps = @ds.prepare(:select, :select_n)
|
|
4126
3905
|
proc{ps.prepare(:select, :select_n2)}.must_raise Sequel::Error
|
|
@@ -4132,9 +3911,8 @@ describe "Dataset prepared statements and bound variables " do
|
|
|
4132
3911
|
@db.sqls.must_equal ["SELECT * FROM items"]
|
|
4133
3912
|
end
|
|
4134
3913
|
|
|
4135
|
-
|
|
4136
|
-
@ds.filter(:num=>:$n).call(:select_all, :n=>1)
|
|
4137
|
-
@db.sqls.must_equal ['SELECT * FROM items WHERE (num = 1)']
|
|
3914
|
+
it "#call should raise Error if an invalid type is given" do
|
|
3915
|
+
proc{@ds.filter(:num=>:$n).call(:select_all, :n=>1)}.must_raise Sequel::Error
|
|
4138
3916
|
end
|
|
4139
3917
|
|
|
4140
3918
|
it "#inspect should indicate it is a prepared statement with the prepared SQL" do
|
|
@@ -4142,11 +3920,6 @@ describe "Dataset prepared statements and bound variables " do
|
|
|
4142
3920
|
'<Sequel::Mock::Dataset/PreparedStatement "SELECT * FROM items WHERE (num = $n)">'
|
|
4143
3921
|
end
|
|
4144
3922
|
|
|
4145
|
-
deprecated "should handle literal strings" do
|
|
4146
|
-
@ds.filter("num = ?", :$n).call(:select, :n=>1)
|
|
4147
|
-
@db.sqls.must_equal ['SELECT * FROM items WHERE (num = 1)']
|
|
4148
|
-
end
|
|
4149
|
-
|
|
4150
3923
|
it "should handle literal strings" do
|
|
4151
3924
|
@ds.filter(Sequel.lit("num = ?", :$n)).call(:select, :n=>1)
|
|
4152
3925
|
@db.sqls.must_equal ['SELECT * FROM items WHERE (num = 1)']
|
|
@@ -4174,11 +3947,6 @@ describe "Dataset prepared statements and bound variables " do
|
|
|
4174
3947
|
@db.sqls.must_equal ['SELECT * FROM items WHERE (0 AND (num IN (SELECT num FROM items WHERE (num IN (SELECT num FROM items WHERE (num = 1))))))']
|
|
4175
3948
|
end
|
|
4176
3949
|
|
|
4177
|
-
deprecated "should handle subselects with strings" do
|
|
4178
|
-
@ds.filter(:$b).filter(:num=>@ds.select(:num).filter("num = ?", :$n)).call(:select, :n=>1, :b=>0)
|
|
4179
|
-
@db.sqls.must_equal ['SELECT * FROM items WHERE (0 AND (num IN (SELECT num FROM items WHERE (num = 1))))']
|
|
4180
|
-
end
|
|
4181
|
-
|
|
4182
3950
|
it "should handle subselects with literal strings" do
|
|
4183
3951
|
@ds.filter(:$b).filter(:num=>@ds.select(:num).filter(Sequel.lit("num = ?", :$n))).call(:select, :n=>1, :b=>0)
|
|
4184
3952
|
@db.sqls.must_equal ['SELECT * FROM items WHERE (0 AND (num IN (SELECT num FROM items WHERE (num = 1))))']
|
|
@@ -4243,13 +4011,12 @@ describe Sequel::Dataset::UnnumberedArgumentMapper do
|
|
|
4243
4011
|
"UPDATE items SET num = ? WHERE (num = ?) -- args: [1, 1]"]
|
|
4244
4012
|
end
|
|
4245
4013
|
|
|
4246
|
-
|
|
4014
|
+
it "should raise Error for unrecognized statement types" do
|
|
4247
4015
|
ps = @ds.prepare(:select_all, :s)
|
|
4248
4016
|
ps = ps.with_extend(Sequel::Dataset::UnnumberedArgumentMapper)
|
|
4249
4017
|
sql = ps.prepared_sql
|
|
4250
4018
|
ps.prepared_sql.must_be_same_as(sql)
|
|
4251
|
-
ps.call(:n=>1)
|
|
4252
|
-
@db.sqls.must_equal ["SELECT * FROM items WHERE (num = ?) -- args: [1]"]
|
|
4019
|
+
proc{ps.call(:n=>1)}.must_raise Sequel::Error
|
|
4253
4020
|
end
|
|
4254
4021
|
end
|
|
4255
4022
|
|
|
@@ -4396,87 +4163,6 @@ describe "Sequel::Dataset#qualify" do
|
|
|
4396
4163
|
end
|
|
4397
4164
|
end
|
|
4398
4165
|
|
|
4399
|
-
describe "Sequel::Dataset#unbind" do
|
|
4400
|
-
before do
|
|
4401
|
-
deprecated do
|
|
4402
|
-
@ds = Sequel.mock[:t]
|
|
4403
|
-
@u = proc{|ds| ds, bv = ds.unbind; [ds.sql, bv]}
|
|
4404
|
-
end
|
|
4405
|
-
end
|
|
4406
|
-
|
|
4407
|
-
deprecated "should unbind values assigned to equality and inequality statements" do
|
|
4408
|
-
@ds.filter(:foo=>1).unbind.first.sql.must_equal "SELECT * FROM t WHERE (foo = $foo)"
|
|
4409
|
-
@ds.exclude(:foo=>1).unbind.first.sql.must_equal "SELECT * FROM t WHERE (foo != $foo)"
|
|
4410
|
-
@ds.filter{foo > 1}.unbind.first.sql.must_equal "SELECT * FROM t WHERE (foo > $foo)"
|
|
4411
|
-
@ds.filter{foo >= 1}.unbind.first.sql.must_equal "SELECT * FROM t WHERE (foo >= $foo)"
|
|
4412
|
-
@ds.filter{foo < 1}.unbind.first.sql.must_equal "SELECT * FROM t WHERE (foo < $foo)"
|
|
4413
|
-
@ds.filter{foo <= 1}.unbind.first.sql.must_equal "SELECT * FROM t WHERE (foo <= $foo)"
|
|
4414
|
-
end
|
|
4415
|
-
|
|
4416
|
-
deprecated "should return variables that could be used bound to recreate the previous query" do
|
|
4417
|
-
@ds.filter(:foo=>1).unbind.last.must_equal(:foo=>1)
|
|
4418
|
-
@ds.exclude(:foo=>1).unbind.last.must_equal(:foo=>1)
|
|
4419
|
-
end
|
|
4420
|
-
|
|
4421
|
-
deprecated "should return variables as symbols" do
|
|
4422
|
-
@ds.filter(Sequel.expr(:foo)=>1).unbind.last.must_equal(:foo=>1)
|
|
4423
|
-
@ds.exclude(Sequel.expr(:foo__bar)=>1).unbind.last.must_equal(:"foo.bar"=>1)
|
|
4424
|
-
end
|
|
4425
|
-
|
|
4426
|
-
deprecated "should handle numerics, strings, dates, times, and datetimes" do
|
|
4427
|
-
@u[@ds.filter(:foo=>1)].must_equal ["SELECT * FROM t WHERE (foo = $foo)", {:foo=>1}]
|
|
4428
|
-
@u[@ds.filter(:foo=>1.0)].must_equal ["SELECT * FROM t WHERE (foo = $foo)", {:foo=>1.0}]
|
|
4429
|
-
@u[@ds.filter(:foo=>BigDecimal.new('1.0'))].must_equal ["SELECT * FROM t WHERE (foo = $foo)", {:foo=>BigDecimal.new('1.0')}]
|
|
4430
|
-
@u[@ds.filter(:foo=>'a')].must_equal ["SELECT * FROM t WHERE (foo = $foo)", {:foo=>'a'}]
|
|
4431
|
-
@u[@ds.filter(:foo=>Date.today)].must_equal ["SELECT * FROM t WHERE (foo = $foo)", {:foo=>Date.today}]
|
|
4432
|
-
t = Time.now
|
|
4433
|
-
@u[@ds.filter(:foo=>t)].must_equal ["SELECT * FROM t WHERE (foo = $foo)", {:foo=>t}]
|
|
4434
|
-
dt = DateTime.now
|
|
4435
|
-
@u[@ds.filter(:foo=>dt)].must_equal ["SELECT * FROM t WHERE (foo = $foo)", {:foo=>dt}]
|
|
4436
|
-
end
|
|
4437
|
-
|
|
4438
|
-
deprecated "should not unbind literal strings" do
|
|
4439
|
-
@u[@ds.filter(:foo=>Sequel.lit('a'))].must_equal ["SELECT * FROM t WHERE (foo = a)", {}]
|
|
4440
|
-
end
|
|
4441
|
-
|
|
4442
|
-
deprecated "should not unbind Identifiers, QualifiedIdentifiers, or Symbols used as booleans" do
|
|
4443
|
-
@u[@ds.filter(:foo).filter{bar}.filter{foo__bar}].must_equal ["SELECT * FROM t WHERE (foo AND bar AND foo.bar)", {}]
|
|
4444
|
-
end
|
|
4445
|
-
|
|
4446
|
-
deprecated "should not unbind for values it doesn't understand" do
|
|
4447
|
-
@u[@ds.filter(:foo=>Class.new{def sql_literal(ds) 'bar' end}.new)].must_equal ["SELECT * FROM t WHERE (foo = bar)", {}]
|
|
4448
|
-
end
|
|
4449
|
-
|
|
4450
|
-
deprecated "should handle QualifiedIdentifiers" do
|
|
4451
|
-
@u[@ds.filter{foo__bar > 1}].must_equal ["SELECT * FROM t WHERE (foo.bar > $foo.bar)", {:"foo.bar"=>1}]
|
|
4452
|
-
end
|
|
4453
|
-
|
|
4454
|
-
deprecated "should handle wrapped objects" do
|
|
4455
|
-
@u[@ds.filter{Sequel::SQL::Wrapper.new(foo__bar) > Sequel::SQL::Wrapper.new(1)}].must_equal ["SELECT * FROM t WHERE (foo.bar > $foo.bar)", {:"foo.bar"=>1}]
|
|
4456
|
-
end
|
|
4457
|
-
|
|
4458
|
-
deprecated "should handle deep nesting" do
|
|
4459
|
-
@u[@ds.filter{foo > 1}.and{bar < 2}.or(:baz=>3).and(Sequel.case({~Sequel.expr(:x=>4)=>true}, false))].must_equal ["SELECT * FROM t WHERE ((((foo > $foo) AND (bar < $bar)) OR (baz = $baz)) AND (CASE WHEN (x != $x) THEN 't' ELSE 'f' END))", {:foo=>1, :bar=>2, :baz=>3, :x=>4}]
|
|
4460
|
-
end
|
|
4461
|
-
|
|
4462
|
-
deprecated "should handle JOIN ON" do
|
|
4463
|
-
@u[@ds.cross_join(:x).join(:a, [:u]).join(:b, [[:c, :d], [:e,1]])].must_equal ["SELECT * FROM t CROSS JOIN x INNER JOIN a USING (u) INNER JOIN b ON ((b.c = a.d) AND (b.e = $b.e))", {:"b.e"=>1}]
|
|
4464
|
-
end
|
|
4465
|
-
|
|
4466
|
-
deprecated "should raise an UnbindDuplicate exception if same variable is used with multiple different values" do
|
|
4467
|
-
proc{@ds.filter(:foo=>1).or(:foo=>2).unbind}.must_raise(Sequel::UnbindDuplicate)
|
|
4468
|
-
end
|
|
4469
|
-
|
|
4470
|
-
deprecated "should handle case where the same variable has the same value in multiple places " do
|
|
4471
|
-
@u[@ds.filter(:foo=>1).or(:foo=>1)].must_equal ["SELECT * FROM t WHERE ((foo = $foo) OR (foo = $foo))", {:foo=>1}]
|
|
4472
|
-
end
|
|
4473
|
-
|
|
4474
|
-
deprecated "should raise Error for unhandled objects inside Identifiers and QualifiedIndentifiers" do
|
|
4475
|
-
proc{@ds.filter(Sequel::SQL::Identifier.new([]) > 1).unbind}.must_raise(Sequel::Error)
|
|
4476
|
-
proc{@ds.filter{foo.qualify({}) > 1}.unbind}.must_raise(Sequel::Error)
|
|
4477
|
-
end
|
|
4478
|
-
end
|
|
4479
|
-
|
|
4480
4166
|
describe "Sequel::Dataset #with and #with_recursive" do
|
|
4481
4167
|
before do
|
|
4482
4168
|
@db = Sequel.mock
|
|
@@ -5230,7 +4916,7 @@ describe "Dataset extensions" do
|
|
|
5230
4916
|
end
|
|
5231
4917
|
end
|
|
5232
4918
|
before do
|
|
5233
|
-
@ds = Sequel.mock
|
|
4919
|
+
@ds = Sequel.mock.dataset
|
|
5234
4920
|
end
|
|
5235
4921
|
|
|
5236
4922
|
it "should be able to register an extension with a module Database#extension extend the module" do
|
|
@@ -5271,7 +4957,7 @@ describe "Dataset extensions" do
|
|
|
5271
4957
|
|
|
5272
4958
|
it "should register a Database extension for modifying all datasets when registering with a module" do
|
|
5273
4959
|
Sequel::Dataset.register_extension(:foo, Module.new{def a; 1; end})
|
|
5274
|
-
Sequel.mock
|
|
4960
|
+
Sequel.mock.extension(:foo).dataset.a.must_equal 1
|
|
5275
4961
|
end
|
|
5276
4962
|
|
|
5277
4963
|
it "should raise an Error if registering with both a module and a block" do
|
|
@@ -5648,7 +5334,7 @@ end
|
|
|
5648
5334
|
|
|
5649
5335
|
describe "Dataset#output_identifier" do
|
|
5650
5336
|
it "should handle empty identifiers and uppercase identifiers" do
|
|
5651
|
-
meth = Sequel::Database.new
|
|
5337
|
+
meth = Sequel::Database.new.dataset.method(:output_identifier)
|
|
5652
5338
|
meth.call('').must_equal :untitled
|
|
5653
5339
|
meth.call('A').must_equal :a
|
|
5654
5340
|
end
|
|
@@ -5700,7 +5386,6 @@ describe "Dataset#where_single_value" do
|
|
|
5700
5386
|
|
|
5701
5387
|
it "should return single value" do
|
|
5702
5388
|
5.times do
|
|
5703
|
-
a = []
|
|
5704
5389
|
@ds.only_id.where_single_value(:id=>1).must_equal 1
|
|
5705
5390
|
@ds.db.sqls.must_equal ['SELECT id FROM items WHERE (id = 1) LIMIT 1']
|
|
5706
5391
|
end
|