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
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative "spec_helper"
|
2
2
|
|
3
3
|
describe "Sequel::Deprecated" do
|
4
4
|
before do
|
@@ -27,7 +27,7 @@ describe "Sequel::Deprecated" do
|
|
27
27
|
|
28
28
|
it "should consider two arguments to be a method name and additional text" do
|
29
29
|
@d.deprecate("foo", "Use bar instead")
|
30
|
-
@output.must_equal ['foo is deprecated and will be removed in Sequel 5. Use bar instead.']
|
30
|
+
@output.must_equal ['foo is deprecated and will be removed in Sequel 5.1. Use bar instead.']
|
31
31
|
end
|
32
32
|
|
33
33
|
it "should include a prefix if set" do
|
@@ -67,4 +67,4 @@ describe "Sequel::Deprecated" do
|
|
67
67
|
@output.first.must_equal 'foo'
|
68
68
|
@output.count.must_equal 4
|
69
69
|
end
|
70
|
-
end
|
70
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative "spec_helper"
|
2
2
|
|
3
3
|
describe "Blockless Ruby Filters" do
|
4
4
|
before do
|
@@ -13,6 +13,12 @@ describe "Blockless Ruby Filters" do
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
+
it "should support boolean columns directly" do
|
17
|
+
x = Sequel[:x]
|
18
|
+
x.dup.must_be_same_as x
|
19
|
+
x.clone.must_be_same_as x
|
20
|
+
end
|
21
|
+
|
16
22
|
it "should support boolean columns directly" do
|
17
23
|
@d.l(:x).must_equal 'x'
|
18
24
|
end
|
@@ -23,30 +29,15 @@ describe "Blockless Ruby Filters" do
|
|
23
29
|
@d.l(:x__y___z).must_equal 'x.y AS z'
|
24
30
|
end
|
25
31
|
|
26
|
-
deprecated "should support qualified columns and aliased columns using symbols 2" do
|
27
|
-
@d.l(:x__y).must_equal 'x.y'
|
28
|
-
@d.l(:x___y).must_equal 'x AS y'
|
29
|
-
@d.l(:x__y___z).must_equal 'x.y AS z'
|
30
|
-
end
|
31
|
-
|
32
32
|
with_symbol_splitting "should support qualified columns using virtual rows" do
|
33
33
|
@d.l(Sequel.expr{x__y}).must_equal 'x.y'
|
34
34
|
end
|
35
35
|
|
36
|
-
deprecated "should support qualified columns using virtual rows" do
|
37
|
-
@d.l(Sequel.expr{x__y}).must_equal 'x.y'
|
38
|
-
end
|
39
|
-
|
40
36
|
it "should not split symbols or virtual row methods if symbol splitting is disabled" do
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
@d.l(:x__y___z).must_equal 'x__y___z'
|
46
|
-
@d.l(Sequel.expr{x__y}).must_equal 'x__y'
|
47
|
-
ensure
|
48
|
-
Sequel.split_symbols = :deprecated
|
49
|
-
end
|
37
|
+
@d.l(:x__y).must_equal 'x__y'
|
38
|
+
@d.l(:x___y).must_equal 'x___y'
|
39
|
+
@d.l(:x__y___z).must_equal 'x__y___z'
|
40
|
+
@d.l(Sequel.expr{x__y}).must_equal 'x__y'
|
50
41
|
end
|
51
42
|
|
52
43
|
it "should support NOT with SQL functions" do
|
@@ -110,28 +101,26 @@ describe "Blockless Ruby Filters" do
|
|
110
101
|
@d.l{(x + y) =~ /blah/}.must_equal '((x + y) ~ \'blah\')'
|
111
102
|
end
|
112
103
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
@d.l{(x + y) !~ /blah/}.must_equal '((x + y) !~ \'blah\')'
|
134
|
-
end
|
104
|
+
it "should support != and similar inversions via !~ method" do
|
105
|
+
@d.l{x !~ 100}.must_equal '(x != 100)'
|
106
|
+
@d.l{x !~ 'a'}.must_equal '(x != \'a\')'
|
107
|
+
@d.l{x !~ true}.must_equal '(x IS NOT TRUE)'
|
108
|
+
@d.l{x !~ false}.must_equal '(x IS NOT FALSE)'
|
109
|
+
@d.l{x !~ nil}.must_equal '(x IS NOT NULL)'
|
110
|
+
@d.l{x !~ (1...5)}.must_equal '((x < 1) OR (x >= 5))'
|
111
|
+
@d.l{x !~ [1,2,3]}.must_equal '(x NOT IN (1, 2, 3))'
|
112
|
+
|
113
|
+
@d.l{(x + y) !~ 100}.must_equal '((x + y) != 100)'
|
114
|
+
@d.l{(x + y) !~ 'a'}.must_equal '((x + y) != \'a\')'
|
115
|
+
@d.l{(x + y) !~ true}.must_equal '((x + y) IS NOT TRUE)'
|
116
|
+
@d.l{(x + y) !~ false}.must_equal '((x + y) IS NOT FALSE)'
|
117
|
+
@d.l{(x + y) !~ nil}.must_equal '((x + y) IS NOT NULL)'
|
118
|
+
@d.l{(x + y) !~ (1...5)}.must_equal '(((x + y) < 1) OR ((x + y) >= 5))'
|
119
|
+
@d.l{(x + y) !~ [1,2,3]}.must_equal '((x + y) NOT IN (1, 2, 3))'
|
120
|
+
|
121
|
+
@d = @d.with_extend{def supports_regexp?; true end}
|
122
|
+
@d.l{x !~ /blah/}.must_equal '(x !~ \'blah\')'
|
123
|
+
@d.l{(x + y) !~ /blah/}.must_equal '((x + y) !~ \'blah\')'
|
135
124
|
end
|
136
125
|
|
137
126
|
it "should support ~ via Hash and Regexp (if supported by database)" do
|
@@ -330,17 +319,6 @@ describe "Blockless Ruby Filters" do
|
|
330
319
|
proc{Sequel::SQL::BooleanExpression.invert(Sequel.expr(:x) + 2)}.must_raise(Sequel::Error)
|
331
320
|
end
|
332
321
|
|
333
|
-
deprecated "should return self on .lit" do
|
334
|
-
y = Sequel.expr(:x) + 1
|
335
|
-
y.lit.must_equal y
|
336
|
-
end
|
337
|
-
|
338
|
-
deprecated "should return have .sql_literal return the literal SQL for the expression" do
|
339
|
-
y = Sequel.expr(:x) + 1
|
340
|
-
y.sql_literal(@d).must_equal '(x + 1)'
|
341
|
-
y.sql_literal(@d).must_equal @d.literal(y)
|
342
|
-
end
|
343
|
-
|
344
322
|
it "should support SQL::Constants" do
|
345
323
|
@d.l({:x => Sequel::NULL}).must_equal '(x IS NULL)'
|
346
324
|
@d.l({:x => Sequel::NOTNULL}).must_equal '(x IS NOT NULL)'
|
@@ -549,18 +527,11 @@ describe Sequel::SQL::VirtualRow do
|
|
549
527
|
@d.l{function(arg1, 10, 'arg3')}.must_equal 'function("arg1", 10, \'arg3\')'
|
550
528
|
end
|
551
529
|
|
552
|
-
deprecated "should treat methods with a block and no arguments as a function call with no arguments" do
|
553
|
-
@d.l{version{}}.must_equal 'version()'
|
554
|
-
end
|
555
530
|
|
556
531
|
it "should treat methods followed by function as a function call with no arguments" do
|
557
532
|
@d.l{version.function}.must_equal 'version()'
|
558
533
|
end
|
559
534
|
|
560
|
-
deprecated "should treat methods with a block and a leading argument :* as a function call with the SQL wildcard" do
|
561
|
-
@d.l{count(:*){}}.must_equal 'count(*)'
|
562
|
-
end
|
563
|
-
|
564
535
|
it "should treat methods followed by function.* as a function call with * argument" do
|
565
536
|
@d.l{count.function.*}.must_equal 'count(*)'
|
566
537
|
end
|
@@ -574,67 +545,11 @@ describe Sequel::SQL::VirtualRow do
|
|
574
545
|
@d.literal(Sequel.expr{sum(1) * 2}).must_equal '(sum(1) * 2)'
|
575
546
|
end
|
576
547
|
|
577
|
-
deprecated "should treat methods with a block and a leading argument :distinct as a function call with DISTINCT and the additional method arguments" do
|
578
|
-
@d.l{count(:distinct, column1){}}.must_equal 'count(DISTINCT "column1")'
|
579
|
-
@d.l{count(:distinct, column1, column2){}}.must_equal 'count(DISTINCT "column1", "column2")'
|
580
|
-
end
|
581
|
-
|
582
548
|
it "should support distinct methods on functions to use DISTINCT before the arguments" do
|
583
549
|
@d.l{count(column1).distinct}.must_equal 'count(DISTINCT "column1")'
|
584
550
|
@d.l{count(column1, column2).distinct}.must_equal 'count(DISTINCT "column1", "column2")'
|
585
551
|
end
|
586
552
|
|
587
|
-
deprecated "should raise an error if an unsupported argument is used with a block" do
|
588
|
-
proc{@d.where{count(:blah){}}}.must_raise(Sequel::Error)
|
589
|
-
end
|
590
|
-
|
591
|
-
deprecated "should treat methods with a block and a leading argument :over as a window function call" do
|
592
|
-
@d.l{rank(:over){}}.must_equal 'rank() OVER ()'
|
593
|
-
end
|
594
|
-
|
595
|
-
deprecated "should support :partition options for window function calls" do
|
596
|
-
@d.l{rank(:over, :partition=>column1){}}.must_equal 'rank() OVER (PARTITION BY "column1")'
|
597
|
-
@d.l{rank(:over, :partition=>[column1, column2]){}}.must_equal 'rank() OVER (PARTITION BY "column1", "column2")'
|
598
|
-
end
|
599
|
-
|
600
|
-
deprecated "should support :args options for window function calls" do
|
601
|
-
@d.l{avg(:over, :args=>column1){}}.must_equal 'avg("column1") OVER ()'
|
602
|
-
@d.l{avg(:over, :args=>[column1, column2]){}}.must_equal 'avg("column1", "column2") OVER ()'
|
603
|
-
end
|
604
|
-
|
605
|
-
deprecated "should support :order option for window function calls" do
|
606
|
-
@d.l{rank(:over, :order=>column1){}}.must_equal 'rank() OVER (ORDER BY "column1")'
|
607
|
-
@d.l{rank(:over, :order=>[column1, column2]){}}.must_equal 'rank() OVER (ORDER BY "column1", "column2")'
|
608
|
-
end
|
609
|
-
|
610
|
-
deprecated "should support :window option for window function calls" do
|
611
|
-
@d.l{rank(:over, :window=>:win){}}.must_equal 'rank() OVER ("win")'
|
612
|
-
end
|
613
|
-
|
614
|
-
deprecated "should support :*=>true option for window function calls" do
|
615
|
-
@d.l{count(:over, :* =>true){}}.must_equal 'count(*) OVER ()'
|
616
|
-
end
|
617
|
-
|
618
|
-
deprecated "should support :frame=>:all option for window function calls" do
|
619
|
-
@d.l{rank(:over, :frame=>:all){}}.must_equal 'rank() OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)'
|
620
|
-
end
|
621
|
-
|
622
|
-
deprecated "should support :frame=>:rows option for window function calls" do
|
623
|
-
@d.l{rank(:over, :frame=>:rows){}}.must_equal 'rank() OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)'
|
624
|
-
end
|
625
|
-
|
626
|
-
deprecated "should support :frame=>'some string' option for window function calls" do
|
627
|
-
@d.l{rank(:over, :frame=>'RANGE BETWEEN 3 PRECEDING AND CURRENT ROW'){}}.must_equal 'rank() OVER (RANGE BETWEEN 3 PRECEDING AND CURRENT ROW)'
|
628
|
-
end
|
629
|
-
|
630
|
-
deprecated "should raise an error if an invalid :frame option is used" do
|
631
|
-
proc{@d.l{rank(:over, :frame=>:blah){}}}.must_raise(Sequel::Error)
|
632
|
-
end
|
633
|
-
|
634
|
-
deprecated "should support all these options together" do
|
635
|
-
@d.l{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}.must_equal 'count(*) OVER ("win" PARTITION BY "a" ORDER BY "b" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)'
|
636
|
-
end
|
637
|
-
|
638
553
|
it "should handle method.function.over as a window function call" do
|
639
554
|
@d.l{rank.function.over}.must_equal 'rank() OVER ()'
|
640
555
|
end
|
@@ -779,23 +694,6 @@ describe Sequel::SQL::VirtualRow do
|
|
779
694
|
@d.l{num < Math::PI.to_i}.must_equal "(\"num\" < 3)"
|
780
695
|
end
|
781
696
|
|
782
|
-
deprecated "should deal with methods added to Object after requiring Sequel" do
|
783
|
-
class Object
|
784
|
-
def adsoiwemlsdaf; 42; end
|
785
|
-
end
|
786
|
-
Sequel::BasicObject.remove_methods!
|
787
|
-
@d.l{a > adsoiwemlsdaf}.must_equal '("a" > "adsoiwemlsdaf")'
|
788
|
-
end
|
789
|
-
|
790
|
-
deprecated "should deal with private methods added to Kernel after requiring Sequel" do
|
791
|
-
module Kernel
|
792
|
-
private
|
793
|
-
def adsoiwemlsdaf2; 42; end
|
794
|
-
end
|
795
|
-
Sequel::BasicObject.remove_methods!
|
796
|
-
@d.l{a > adsoiwemlsdaf2}.must_equal '("a" > "adsoiwemlsdaf2")'
|
797
|
-
end
|
798
|
-
|
799
697
|
it "should have operator methods defined that produce Sequel expression objects" do
|
800
698
|
@d.l{|o| o.&({:a=>1}, :b)}.must_equal '(("a" = 1) AND "b")'
|
801
699
|
@d.l{|o| o.|({:a=>1}, :b)}.must_equal '(("a" = 1) OR "b")'
|
@@ -811,11 +709,6 @@ describe Sequel::SQL::VirtualRow do
|
|
811
709
|
@d.l{|o| o.<=(1, :b)}.must_equal '(1 <= "b")'
|
812
710
|
@d.l{|o| o.>=(1, :b)}.must_equal '(1 >= "b")'
|
813
711
|
end
|
814
|
-
|
815
|
-
deprecated "should have have ` produce literal strings" do
|
816
|
-
@d.l{a > `some SQL`}.must_equal '("a" > some SQL)'
|
817
|
-
@d.l{|o| o.a > o.`('some SQL')}.must_equal '("a" > some SQL)' #`
|
818
|
-
end
|
819
712
|
end
|
820
713
|
|
821
714
|
describe "Sequel core extension replacements" do
|
@@ -1044,13 +937,9 @@ describe "Sequel core extension replacements" do
|
|
1044
937
|
o = Sequel.blob(('a'..'z').to_a.join)
|
1045
938
|
o.inspect.must_equal "#<Sequel::SQL::Blob:0x#{'%x' % o.object_id} bytes=26 start=\"abcdefghij\" end=\"qrstuvwxyz\">"
|
1046
939
|
o = Sequel.blob(255.chr)
|
1047
|
-
o.inspect.must_equal "#<Sequel::SQL::Blob:0x#{'%x' % o.object_id} bytes=1 content=\"
|
940
|
+
o.inspect.must_equal "#<Sequel::SQL::Blob:0x#{'%x' % o.object_id} bytes=1 content=\"\\xFF\">"
|
1048
941
|
o = Sequel.blob((230..255).map(&:chr).join)
|
1049
|
-
|
1050
|
-
o.inspect.must_equal "#<Sequel::SQL::Blob:0x#{'%x' % o.object_id} bytes=26 start=\"\\xE6\\xE7\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF\" end=\"\\xF6\\xF7\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFE\\xFF\">"
|
1051
|
-
else
|
1052
|
-
o.inspect.must_equal "#<Sequel::SQL::Blob:0x#{'%x' % o.object_id} bytes=26 start=\"\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\" end=\"\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377\">"
|
1053
|
-
end
|
942
|
+
o.inspect.must_equal "#<Sequel::SQL::Blob:0x#{'%x' % o.object_id} bytes=26 start=\"\\xE6\\xE7\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF\" end=\"\\xF6\\xF7\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFE\\xFF\">"
|
1054
943
|
end
|
1055
944
|
|
1056
945
|
it "Sequel.deep_qualify should do a deep qualification into nested structors" do
|
@@ -1129,6 +1018,10 @@ describe "Sequel core extension replacements" do
|
|
1129
1018
|
l(Sequel.subscript(:a, 1...3), 'a[1:2]')
|
1130
1019
|
end
|
1131
1020
|
|
1021
|
+
it "Sequel.subscript.f should be subscript expression for backwards compatibility" do
|
1022
|
+
Sequel.subscript(:a, 1).f.must_equal :a
|
1023
|
+
end
|
1024
|
+
|
1132
1025
|
it "Sequel.function should return an SQL function" do
|
1133
1026
|
l(Sequel.function(:a), 'a()')
|
1134
1027
|
l(Sequel.function(:a, 1), 'a(1)')
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative "spec_helper"
|
2
2
|
|
3
3
|
describe "Sequel Mock Adapter" do
|
4
4
|
it "should have an adapter method" do
|
@@ -310,7 +310,7 @@ describe "Sequel Mock Adapter" do
|
|
310
310
|
it "should be able to set the columns to set in the dataset as an array of arrays of symbols" do
|
311
311
|
db = Sequel.mock(:columns=>[[:a, :b], [:c, :d]])
|
312
312
|
db[:t].columns.must_equal [:a, :b]
|
313
|
-
db[:
|
313
|
+
db[:x].columns.must_equal [:c, :d]
|
314
314
|
end
|
315
315
|
|
316
316
|
it "should be able to set the columns to set in the dataset as a proc" do
|
@@ -323,7 +323,7 @@ describe "Sequel Mock Adapter" do
|
|
323
323
|
db = Sequel.mock
|
324
324
|
db.columns = [[:a, :b], [:c, :d]]
|
325
325
|
db[:t].columns.must_equal [:a, :b]
|
326
|
-
db[:
|
326
|
+
db[:x].columns.must_equal [:c, :d]
|
327
327
|
end
|
328
328
|
|
329
329
|
it "should raise Error if given an invalid columns" do
|
@@ -451,7 +451,7 @@ describe "Sequel Mock Adapter" do
|
|
451
451
|
it "should be able to load dialects based on the database name" do
|
452
452
|
Sequel.mock(:host=>'access').select(Date.new(2011, 12, 13)).sql.must_equal 'SELECT #2011-12-13#'
|
453
453
|
Sequel.mock(:host=>'db2').select(1).sql.must_equal 'SELECT 1 FROM "SYSIBM"."SYSDUMMY1"'
|
454
|
-
Sequel.mock(:host=>'mssql'
|
454
|
+
Sequel.mock(:host=>'mssql')[:A].full_text_search(:B, 'C').with_quote_identifiers(false).sql.must_equal "SELECT * FROM A WHERE (CONTAINS (B, 'C'))"
|
455
455
|
Sequel.mock(:host=>'mysql')[:a].full_text_search(:b, 'c').with_quote_identifiers(false).sql.must_equal "SELECT * FROM a WHERE (MATCH (b) AGAINST ('c'))"
|
456
456
|
Sequel.mock(:host=>'oracle')[:a].limit(1).with_quote_identifiers(false).sql.upcase.must_equal 'SELECT * FROM (SELECT * FROM A) T1 WHERE (ROWNUM <= 1)'
|
457
457
|
Sequel.mock(:host=>'postgres')[:a].full_text_search(:b, 'c').with_quote_identifiers(false).sql.must_equal "SELECT * FROM a WHERE (to_tsvector(CAST('simple' AS regconfig), (COALESCE(b, ''))) @@ to_tsquery(CAST('simple' AS regconfig), 'c'))"
|
@@ -483,3 +483,240 @@ describe "Sequel Mock Adapter" do
|
|
483
483
|
Sequel.mock(:host=>'oracle').create_table(:a){String :b}
|
484
484
|
end
|
485
485
|
end
|
486
|
+
|
487
|
+
describe "PostgreSQL support" do
|
488
|
+
before do
|
489
|
+
@db = Sequel.mock(:host=>'postgres')
|
490
|
+
end
|
491
|
+
|
492
|
+
it "should create an unlogged table" do
|
493
|
+
@db.create_table(:unlogged_dolls, :unlogged => true){text :name}
|
494
|
+
@db.sqls.must_equal ['CREATE UNLOGGED TABLE "unlogged_dolls" ("name" text)']
|
495
|
+
end
|
496
|
+
|
497
|
+
it "should support spatial indexes" do
|
498
|
+
@db.alter_table(:posts){add_spatial_index [:geom]}
|
499
|
+
@db.sqls.must_equal ['CREATE INDEX "posts_geom_index" ON "posts" USING gist ("geom")']
|
500
|
+
end
|
501
|
+
|
502
|
+
it "should support indexes with index type" do
|
503
|
+
@db.alter_table(:posts){add_index :p, :type => 'gist'}
|
504
|
+
@db.sqls.must_equal ['CREATE INDEX "posts_p_index" ON "posts" USING gist ("p")']
|
505
|
+
end
|
506
|
+
|
507
|
+
it "should have #transaction support various types of synchronous options" do
|
508
|
+
@db.transaction(:synchronous=>:on){}
|
509
|
+
@db.transaction(:synchronous=>true){}
|
510
|
+
@db.transaction(:synchronous=>:off){}
|
511
|
+
@db.transaction(:synchronous=>false){}
|
512
|
+
@db.sqls.grep(/synchronous/).must_equal ["SET LOCAL synchronous_commit = on", "SET LOCAL synchronous_commit = on", "SET LOCAL synchronous_commit = off", "SET LOCAL synchronous_commit = off"]
|
513
|
+
|
514
|
+
@db.transaction(:synchronous=>nil){}
|
515
|
+
@db.sqls.must_equal ['BEGIN', 'COMMIT']
|
516
|
+
|
517
|
+
if @db.server_version >= 90100
|
518
|
+
@db.transaction(:synchronous=>:local){}
|
519
|
+
@db.sqls.grep(/synchronous/).must_equal ["SET LOCAL synchronous_commit = local"]
|
520
|
+
|
521
|
+
if @db.server_version >= 90200
|
522
|
+
@db.transaction(:synchronous=>:remote_write){}
|
523
|
+
@db.sqls.grep(/synchronous/).must_equal ["SET LOCAL synchronous_commit = remote_write"]
|
524
|
+
end
|
525
|
+
end
|
526
|
+
end
|
527
|
+
|
528
|
+
it "should have #transaction support read only transactions" do
|
529
|
+
@db.transaction(:read_only=>true){}
|
530
|
+
@db.transaction(:read_only=>false){}
|
531
|
+
@db.transaction(:isolation=>:serializable, :read_only=>true){}
|
532
|
+
@db.transaction(:isolation=>:serializable, :read_only=>false){}
|
533
|
+
@db.sqls.grep(/READ/).must_equal ["SET TRANSACTION READ ONLY", "SET TRANSACTION READ WRITE", "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY", "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE"]
|
534
|
+
end
|
535
|
+
|
536
|
+
it "should have #transaction support deferrable transactions" do
|
537
|
+
@db.transaction(:deferrable=>true){}
|
538
|
+
@db.transaction(:deferrable=>false){}
|
539
|
+
@db.transaction(:deferrable=>true, :read_only=>true){}
|
540
|
+
@db.transaction(:deferrable=>false, :read_only=>false){}
|
541
|
+
@db.transaction(:isolation=>:serializable, :deferrable=>true, :read_only=>true){}
|
542
|
+
@db.transaction(:isolation=>:serializable, :deferrable=>false, :read_only=>false){}
|
543
|
+
@db.sqls.grep(/DEF/).must_equal ["SET TRANSACTION DEFERRABLE", "SET TRANSACTION NOT DEFERRABLE", "SET TRANSACTION READ ONLY DEFERRABLE", "SET TRANSACTION READ WRITE NOT DEFERRABLE", "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE", "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE NOT DEFERRABLE"]
|
544
|
+
end
|
545
|
+
|
546
|
+
it "should support creating indexes concurrently" do
|
547
|
+
@db.add_index :test, [:name, :value], :concurrently=>true
|
548
|
+
@db.sqls.must_equal ['CREATE INDEX CONCURRENTLY "test_name_value_index" ON "test" ("name", "value")']
|
549
|
+
end
|
550
|
+
|
551
|
+
it "should support dropping indexes concurrently" do
|
552
|
+
@db.drop_index :test, [:name, :value], :concurrently=>true, :name=>'tnv2'
|
553
|
+
@db.sqls.must_equal ['DROP INDEX CONCURRENTLY "tnv2"']
|
554
|
+
end
|
555
|
+
|
556
|
+
it "should use INSERT RETURNING for inserts" do
|
557
|
+
@db[:test5].insert(:value=>10)
|
558
|
+
@db.sqls.must_equal ['INSERT INTO "test5" ("value") VALUES (10) RETURNING "id"']
|
559
|
+
end
|
560
|
+
|
561
|
+
it "should support opclass specification" do
|
562
|
+
@db.alter_table(:posts){add_index(:user_id, :opclass => :int4_ops, :type => :btree)}
|
563
|
+
@db.sqls.must_equal ['CREATE INDEX "posts_user_id_index" ON "posts" USING btree ("user_id" int4_ops)']
|
564
|
+
end
|
565
|
+
|
566
|
+
it 'should quote NaN' do
|
567
|
+
nan = 0.0/0.0
|
568
|
+
@db[:test5].insert_sql(:value => nan).must_equal %q{INSERT INTO "test5" ("value") VALUES ('NaN')}
|
569
|
+
end
|
570
|
+
|
571
|
+
it 'should quote +Infinity' do
|
572
|
+
inf = 1.0/0.0
|
573
|
+
@db[:test5].insert_sql(:value => inf).must_equal %q{INSERT INTO "test5" ("value") VALUES ('Infinity')}
|
574
|
+
end
|
575
|
+
|
576
|
+
it 'should quote -Infinity' do
|
577
|
+
inf = -1.0/0.0
|
578
|
+
@db[:test5].insert_sql(:value => inf).must_equal %q{INSERT INTO "test5" ("value") VALUES ('-Infinity')}
|
579
|
+
end
|
580
|
+
|
581
|
+
it "Dataset#insert_conflict should respect expressions in the target argument" do
|
582
|
+
@ds = @db[:ic_test]
|
583
|
+
@ds.insert_conflict(:target=>:a).insert_sql(1, 2, 3).must_equal "INSERT INTO \"ic_test\" VALUES (1, 2, 3) ON CONFLICT (\"a\") DO NOTHING"
|
584
|
+
@ds.insert_conflict(:target=>:c, :conflict_where=>{:c_is_unique=>true}).insert_sql(1, 2, 3).must_equal "INSERT INTO \"ic_test\" VALUES (1, 2, 3) ON CONFLICT (\"c\") WHERE (\"c_is_unique\" IS TRUE) DO NOTHING"
|
585
|
+
@ds.insert_conflict(:target=>[:b, :c]).insert_sql(1, 2, 3).must_equal "INSERT INTO \"ic_test\" VALUES (1, 2, 3) ON CONFLICT (\"b\", \"c\") DO NOTHING"
|
586
|
+
@ds.insert_conflict(:target=>[:b, Sequel.function(:round, :c)]).insert_sql(1, 2, 3).must_equal "INSERT INTO \"ic_test\" VALUES (1, 2, 3) ON CONFLICT (\"b\", round(\"c\")) DO NOTHING"
|
587
|
+
@ds.insert_conflict(:target=>[:b, Sequel.virtual_row{|o| o.round(:c)}]).insert_sql(1, 2, 3).must_equal "INSERT INTO \"ic_test\" VALUES (1, 2, 3) ON CONFLICT (\"b\", round(\"c\")) DO NOTHING"
|
588
|
+
end
|
589
|
+
|
590
|
+
it "should support creating and dropping foreign tables" do
|
591
|
+
@db.create_table(:t, :foreign=>:f, :options=>{:o=>1}){Integer :a}
|
592
|
+
@db.drop_table(:t, :foreign=>true)
|
593
|
+
@db.sqls.must_equal ['CREATE FOREIGN TABLE "t" ("a" integer) SERVER "f" OPTIONS (o \'1\')',
|
594
|
+
'DROP FOREIGN TABLE "t"']
|
595
|
+
end
|
596
|
+
|
597
|
+
it "#create_function and #drop_function should create and drop functions" do
|
598
|
+
@db.create_function('tf', 'SELECT 1', :returns=>:integer)
|
599
|
+
@db.drop_function('tf')
|
600
|
+
@db.sqls.map{|s| s.gsub(/\s+/, ' ').strip}.must_equal ["CREATE FUNCTION tf() RETURNS integer LANGUAGE SQL AS 'SELECT 1'",
|
601
|
+
'DROP FUNCTION tf()']
|
602
|
+
end
|
603
|
+
|
604
|
+
it "#create_function and #drop_function should support options" do
|
605
|
+
@db.create_function('tf', 'SELECT $1 + $2', :args=>[[:integer, :a], :integer], :replace=>true, :returns=>:integer, :language=>'SQL', :behavior=>:immutable, :strict=>true, :security_definer=>true, :cost=>2, :set=>{:search_path => 'public'})
|
606
|
+
@db.drop_function('tf', :if_exists=>true, :cascade=>true, :args=>[[:integer, :a], :integer])
|
607
|
+
@db.sqls.map{|s| s.gsub(/\s+/, ' ').strip}.must_equal ["CREATE OR REPLACE FUNCTION tf(a integer, integer) RETURNS integer LANGUAGE SQL IMMUTABLE STRICT SECURITY DEFINER COST 2 SET search_path = public AS 'SELECT $1 + $2'",
|
608
|
+
'DROP FUNCTION IF EXISTS tf(a integer, integer) CASCADE']
|
609
|
+
end
|
610
|
+
|
611
|
+
it "#create_language and #drop_language should create and drop languages" do
|
612
|
+
@db.create_language(:plpgsql)
|
613
|
+
@db.create_language(:plpgsql, :replace=>true, :trusted=>true, :handler=>:a, :validator=>:b)
|
614
|
+
@db.drop_language(:plpgsql)
|
615
|
+
@db.drop_language(:plpgsql, :if_exists=>true, :cascade=>true)
|
616
|
+
@db.sqls.map{|s| s.gsub(/\s+/, ' ').strip}.must_equal ['CREATE LANGUAGE plpgsql',
|
617
|
+
'CREATE OR REPLACE TRUSTED LANGUAGE plpgsql HANDLER a VALIDATOR b',
|
618
|
+
'DROP LANGUAGE plpgsql',
|
619
|
+
'DROP LANGUAGE IF EXISTS plpgsql CASCADE']
|
620
|
+
end
|
621
|
+
|
622
|
+
it "#create_schema and #drop_schema should create and drop schemas" do
|
623
|
+
@db.create_schema(:sequel)
|
624
|
+
@db.create_schema(:sequel, :if_not_exists=>true, :owner=>:foo)
|
625
|
+
@db.drop_schema(:sequel)
|
626
|
+
@db.drop_schema(:sequel, :if_exists=>true, :cascade=>true)
|
627
|
+
@db.sqls.must_equal ['CREATE SCHEMA "sequel"',
|
628
|
+
'CREATE SCHEMA IF NOT EXISTS "sequel" AUTHORIZATION "foo"',
|
629
|
+
'DROP SCHEMA "sequel"',
|
630
|
+
'DROP SCHEMA IF EXISTS "sequel" CASCADE']
|
631
|
+
end
|
632
|
+
|
633
|
+
it "#create_trigger and #drop_trigger should create and drop triggers" do
|
634
|
+
@db.create_trigger(:test, :identity, :tf, :each_row=>true)
|
635
|
+
@db.create_trigger(:test, :identity, :tf, :after=>true, :events=>:insert, :args=>[1, 'a'])
|
636
|
+
@db.create_trigger(:test, :identity, :tf, :each_row=>true, :when=> {Sequel[:new][:name] => 'b'})
|
637
|
+
@db.drop_trigger(:test, :identity)
|
638
|
+
@db.drop_trigger(:test, :identity, :if_exists=>true, :cascade=>true)
|
639
|
+
@db.sqls.map{|s| s.gsub(/\s+/, ' ').strip}.must_equal ['CREATE TRIGGER identity BEFORE INSERT OR UPDATE OR DELETE ON "test" FOR EACH ROW EXECUTE PROCEDURE tf()',
|
640
|
+
'CREATE TRIGGER identity AFTER INSERT ON "test" EXECUTE PROCEDURE tf(1, \'a\')',
|
641
|
+
%q{CREATE TRIGGER identity BEFORE INSERT OR UPDATE OR DELETE ON "test" FOR EACH ROW WHEN ("new"."name" = 'b') EXECUTE PROCEDURE tf()},
|
642
|
+
'DROP TRIGGER identity ON "test"',
|
643
|
+
'DROP TRIGGER IF EXISTS identity ON "test" CASCADE']
|
644
|
+
end
|
645
|
+
end
|
646
|
+
|
647
|
+
describe "MySQL support" do
|
648
|
+
before do
|
649
|
+
@db = Sequel.mock(:host=>'mysql')
|
650
|
+
end
|
651
|
+
|
652
|
+
it "should support spatial indexes" do
|
653
|
+
@db.alter_table(:posts){add_spatial_index [:geom]}
|
654
|
+
@db.sqls.must_equal ['CREATE SPATIAL INDEX `posts_geom_index` ON `posts` (`geom`)']
|
655
|
+
end
|
656
|
+
|
657
|
+
it "should support fulltext indexes and full_text_search" do
|
658
|
+
@db.alter_table(:posts){add_full_text_index :title; add_full_text_index [:title, :body]}
|
659
|
+
@db.sqls.must_equal [ "CREATE FULLTEXT INDEX `posts_title_index` ON `posts` (`title`)", "CREATE FULLTEXT INDEX `posts_title_body_index` ON `posts` (`title`, `body`)" ]
|
660
|
+
end
|
661
|
+
|
662
|
+
it "should support indexes with index type" do
|
663
|
+
@db.alter_table(:posts){add_index :id, :type => :btree}
|
664
|
+
@db.sqls.must_equal ["CREATE INDEX `posts_id_index` USING btree ON `posts` (`id`)"]
|
665
|
+
end
|
666
|
+
end
|
667
|
+
|
668
|
+
describe "SQLite support" do
|
669
|
+
before do
|
670
|
+
@db = Sequel.mock(:host=>'sqlite')
|
671
|
+
end
|
672
|
+
|
673
|
+
it "should use a string literal for Sequel[:col].as(:alias)" do
|
674
|
+
@db.literal(Sequel[:c].as(:a)).must_equal "`c` AS 'a'"
|
675
|
+
end
|
676
|
+
|
677
|
+
it "should use a string literal for Sequel[:table][:col].as(:alias)" do
|
678
|
+
@db.literal(Sequel[:t][:c].as(:a)).must_equal "`t`.`c` AS 'a'"
|
679
|
+
end
|
680
|
+
|
681
|
+
it "should use a string literal for :column.as(:alias)" do
|
682
|
+
@db.literal(Sequel.as(:c, :a)).must_equal "`c` AS 'a'"
|
683
|
+
end
|
684
|
+
|
685
|
+
it "should use a string literal in the SELECT clause" do
|
686
|
+
@db[:t].select(Sequel[:c].as(:a)).sql.must_equal "SELECT `c` AS 'a' FROM `t`"
|
687
|
+
end
|
688
|
+
|
689
|
+
it "should use a string literal in the FROM clause" do
|
690
|
+
@db[Sequel[:t].as(:a)].sql.must_equal "SELECT * FROM `t` AS 'a'"
|
691
|
+
end
|
692
|
+
|
693
|
+
it "should use a string literal in the JOIN clause" do
|
694
|
+
@db[:t].join_table(:natural, :j, nil, :table_alias=>:a).sql.must_equal "SELECT * FROM `t` NATURAL JOIN `j` AS 'a'"
|
695
|
+
end
|
696
|
+
|
697
|
+
it "should have support for various #transaction modes" do
|
698
|
+
@db.transaction{}
|
699
|
+
@db.transaction(:mode => :immediate){}
|
700
|
+
@db.transaction(:mode => :exclusive){}
|
701
|
+
@db.transaction(:mode => :deferred){}
|
702
|
+
@db.sqls.must_equal ["BEGIN", "COMMIT", "BEGIN IMMEDIATE TRANSACTION", "COMMIT", "BEGIN EXCLUSIVE TRANSACTION", "COMMIT", "BEGIN DEFERRED TRANSACTION", "COMMIT"]
|
703
|
+
|
704
|
+
@db.transaction_mode.must_be_nil
|
705
|
+
@db.transaction_mode = :immediate
|
706
|
+
@db.transaction_mode.must_equal :immediate
|
707
|
+
@db.transaction{}
|
708
|
+
@db.transaction(:mode => :exclusive){}
|
709
|
+
@db.sqls.must_equal ["BEGIN IMMEDIATE TRANSACTION", "COMMIT", "BEGIN EXCLUSIVE TRANSACTION", "COMMIT"]
|
710
|
+
end
|
711
|
+
|
712
|
+
it "should choose a temporary table name that isn't already used when dropping or renaming columns" do
|
713
|
+
exists = [true, true, false]
|
714
|
+
@db.define_singleton_method(:table_exists?){|x| exists.shift}
|
715
|
+
@db.drop_column(:test3, :i)
|
716
|
+
@db.sqls.grep(/ALTER/).must_equal ["ALTER TABLE `test3` RENAME TO `test3_backup2`"]
|
717
|
+
|
718
|
+
exists = [true, true, true, false]
|
719
|
+
@db.rename_column(:test3, :h, :i)
|
720
|
+
@db.sqls.grep(/ALTER/).must_equal ["ALTER TABLE `test3` RENAME TO `test3_backup3`"]
|
721
|
+
end
|
722
|
+
end
|