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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen-string-literal: true
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
require_relative '../utils/unmodified_identifiers'
|
|
4
4
|
|
|
5
5
|
module Sequel
|
|
6
6
|
# Top level module for holding all PostgreSQL-related modules and classes
|
|
@@ -23,17 +23,6 @@ module Sequel
|
|
|
23
23
|
PLUS_INFINITY = 1.0/0.0
|
|
24
24
|
MINUS_INFINITY = -1.0/0.0
|
|
25
25
|
|
|
26
|
-
NAN_STR = 'NaN'.freeze
|
|
27
|
-
Sequel::Deprecation.deprecate_constant(self, :NAN_STR)
|
|
28
|
-
PLUS_INFINITY_STR = 'Infinity'.freeze
|
|
29
|
-
Sequel::Deprecation.deprecate_constant(self, :PLUS_INFINITY_STR)
|
|
30
|
-
MINUS_INFINITY_STR = '-Infinity'.freeze
|
|
31
|
-
Sequel::Deprecation.deprecate_constant(self, :MINUS_INFINITY_STR)
|
|
32
|
-
TRUE_STR = 't'.freeze
|
|
33
|
-
Sequel::Deprecation.deprecate_constant(self, :TRUE_STR)
|
|
34
|
-
DASH_STR = '-'.freeze
|
|
35
|
-
Sequel::Deprecation.deprecate_constant(self, :DASH_STR)
|
|
36
|
-
|
|
37
26
|
TYPE_TRANSLATOR = tt = Class.new do
|
|
38
27
|
def boolean(s) s == 't' end
|
|
39
28
|
def integer(s) s.to_i end
|
|
@@ -62,24 +51,9 @@ module Sequel
|
|
|
62
51
|
end
|
|
63
52
|
::Sequel::SQL::Blob.new(str)
|
|
64
53
|
end
|
|
65
|
-
end.new
|
|
66
|
-
|
|
67
|
-
# Type OIDs for string types used by PostgreSQL. These types don't
|
|
68
|
-
# have conversion procs associated with them (since the data is
|
|
69
|
-
# already in the form of a string).
|
|
70
|
-
STRING_TYPES = [18, 19, 25, 1042, 1043] # SEQUEL5: Remove
|
|
71
|
-
|
|
72
|
-
# Hash with type name strings/symbols and callable values for converting PostgreSQL types.
|
|
73
|
-
# Non-builtin types that don't have fixed numbers should use this to register
|
|
74
|
-
# conversion procs.
|
|
75
|
-
PG_NAMED_TYPES = {} unless defined?(PG_NAMED_TYPES)
|
|
76
|
-
PG_NAMED__TYPES = PG_NAMED_TYPES
|
|
77
|
-
Sequel::Deprecation.deprecate_constant(self, :PG_NAMED_TYPES)
|
|
54
|
+
end.new.freeze
|
|
78
55
|
|
|
79
|
-
|
|
80
|
-
PG_TYPES = {} unless defined?(PG_TYPES)
|
|
81
|
-
|
|
82
|
-
#CONVERSION_PROCS = {} # SEQUEL5
|
|
56
|
+
CONVERSION_PROCS = {}
|
|
83
57
|
|
|
84
58
|
{
|
|
85
59
|
[16] => tt.method(:boolean),
|
|
@@ -92,14 +66,10 @@ module Sequel
|
|
|
92
66
|
[1184, 1114] => ::Sequel.method(:database_to_application_timestamp),
|
|
93
67
|
}.each do |k,v|
|
|
94
68
|
k.each do |n|
|
|
95
|
-
|
|
96
|
-
#CONVERSION_PROCS[n] = v # SEQUEL5
|
|
69
|
+
CONVERSION_PROCS[n] = v
|
|
97
70
|
end
|
|
98
71
|
end
|
|
99
|
-
|
|
100
|
-
Sequel::Deprecation.deprecate_constant(self, :PG_TYPES)
|
|
101
|
-
|
|
102
|
-
#CONVERSION_PROCS.freeze # SEQUEL5
|
|
72
|
+
CONVERSION_PROCS.freeze
|
|
103
73
|
|
|
104
74
|
module MockAdapterDatabaseMethods
|
|
105
75
|
def bound_variable_arg(arg, conn)
|
|
@@ -112,39 +82,13 @@ module Sequel
|
|
|
112
82
|
end
|
|
113
83
|
|
|
114
84
|
def self.mock_adapter_setup(db)
|
|
115
|
-
db.
|
|
85
|
+
db.instance_exec do
|
|
116
86
|
@server_version = 90500
|
|
117
87
|
initialize_postgres_adapter
|
|
118
88
|
extend(MockAdapterDatabaseMethods)
|
|
119
89
|
end
|
|
120
90
|
end
|
|
121
91
|
|
|
122
|
-
CONVERTED_EXCEPTIONS = []
|
|
123
|
-
Sequel::Deprecation.deprecate_constant(self, :CONVERTED_EXCEPTIONS)
|
|
124
|
-
|
|
125
|
-
# SEQUEL5: Remove
|
|
126
|
-
@client_min_messages = :warning
|
|
127
|
-
@force_standard_strings = true
|
|
128
|
-
class << self
|
|
129
|
-
def client_min_messages
|
|
130
|
-
Sequel::Deprecation.deprecate("Sequel::Postgres.client_min_messages", "Use the :client_min_messages Database option instead")
|
|
131
|
-
@client_min_messages
|
|
132
|
-
end
|
|
133
|
-
def client_min_messages=(v)
|
|
134
|
-
Sequel::Deprecation.deprecate("Sequel::Postgres.client_min_messages=", "Use the :client_min_messages Database option instead")
|
|
135
|
-
@client_min_messages = v
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
def force_standard_strings
|
|
139
|
-
Sequel::Deprecation.deprecate("Sequel::Postgres.force_standard_strings", "Use the :force_standard_strings Database option instead")
|
|
140
|
-
@force_standard_strings
|
|
141
|
-
end
|
|
142
|
-
def force_standard_strings=(v)
|
|
143
|
-
Sequel::Deprecation.deprecate("Sequel::Postgres.force_standard_strings=", "Use the :force_standard_strings Database option instead")
|
|
144
|
-
@force_standard_strings = v
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
|
|
148
92
|
class CreateTableGenerator < Sequel::Schema::CreateTableGenerator
|
|
149
93
|
# Add an exclusion constraint when creating the table. Elements should be
|
|
150
94
|
# an array of 2 element arrays, with the first element being the column or
|
|
@@ -185,21 +129,13 @@ module Sequel
|
|
|
185
129
|
# Error raised when Sequel determines a PostgreSQL exclusion constraint has been violated.
|
|
186
130
|
class ExclusionConstraintViolation < Sequel::ConstraintViolation; end
|
|
187
131
|
|
|
188
|
-
# Methods shared by Database instances that connect to PostgreSQL.
|
|
189
132
|
module DatabaseMethods
|
|
190
133
|
include UnmodifiedIdentifiers::DatabaseMethods
|
|
191
134
|
|
|
192
|
-
RE_CURRVAL_ERROR = /currval of sequence "(.*)" is not yet defined in this session|relation "(.*)" does not exist/.freeze
|
|
193
|
-
Sequel::Deprecation.deprecate_constant(self, :RE_CURRVAL_ERROR)
|
|
194
|
-
POSTGRES_DEFAULT_RE = /\A(?:B?('.*')::[^']+|\((-?\d+(?:\.\d+)?)\))\z/
|
|
195
|
-
Sequel::Deprecation.deprecate_constant(self, :POSTGRES_DEFAULT_RE)
|
|
196
|
-
UNLOGGED = 'UNLOGGED '.freeze
|
|
197
|
-
Sequel::Deprecation.deprecate_constant(self, :UNLOGGED)
|
|
198
|
-
|
|
199
135
|
PREPARED_ARG_PLACEHOLDER = LiteralString.new('$').freeze
|
|
200
136
|
FOREIGN_KEY_LIST_ON_DELETE_MAP = {'a'=>:no_action, 'r'=>:restrict, 'c'=>:cascade, 'n'=>:set_null, 'd'=>:set_default}.freeze
|
|
201
137
|
ON_COMMIT = {:drop => 'DROP', :delete_rows => 'DELETE ROWS', :preserve_rows => 'PRESERVE ROWS'}.freeze
|
|
202
|
-
|
|
138
|
+
ON_COMMIT.each_value(&:freeze)
|
|
203
139
|
|
|
204
140
|
# SQL fragment for custom sequences (ones not created by serial primary key),
|
|
205
141
|
# Returning the schema and literal form of the sequence name, by parsing
|
|
@@ -263,27 +199,16 @@ module Sequel
|
|
|
263
199
|
conversion_procs[oid] = callable
|
|
264
200
|
end
|
|
265
201
|
|
|
266
|
-
# Add a conversion proc for a named type
|
|
267
|
-
# for types without fixed OIDs, which includes all types that
|
|
268
|
-
# are not included in a default PostgreSQL installation.
|
|
269
|
-
# a block is given, it is used as the conversion proc, otherwise
|
|
270
|
-
# the conversion proc is looked up in the PG_NAMED_TYPES hash.
|
|
202
|
+
# Add a conversion proc for a named type, using the given block.
|
|
203
|
+
# This should be used for types without fixed OIDs, which includes all types that
|
|
204
|
+
# are not included in a default PostgreSQL installation.
|
|
271
205
|
def add_named_conversion_proc(name, &block)
|
|
272
|
-
unless
|
|
273
|
-
|
|
274
|
-
Sequel::Deprecation.deprecate("Sequel::PG_NAMED_TYPES", "Call Database#add_named_conversion_proc directly for each database you want to support the #{name} type")
|
|
275
|
-
end
|
|
206
|
+
unless oid = from(:pg_type).where(:typtype=>['b', 'e'], :typname=>name.to_s).get(:oid)
|
|
207
|
+
raise Error, "No matching type in pg_type for #{name.inspect}"
|
|
276
208
|
end
|
|
277
|
-
|
|
278
|
-
# SEQUEL5:
|
|
279
|
-
#unless oid = from(:pg_type).where(:typtype=>['b', 'e'], :typname=>name.to_s).get(:oid)
|
|
280
|
-
# raise Error, "No matching type in pg_type for #{name.inspect}"
|
|
281
|
-
#end
|
|
282
|
-
#add_conversion_proc(oid, block) # SEQUEL5
|
|
209
|
+
add_conversion_proc(oid, block)
|
|
283
210
|
end
|
|
284
211
|
|
|
285
|
-
# Commit an existing prepared transaction with the given transaction
|
|
286
|
-
# identifier string.
|
|
287
212
|
def commit_prepared_transaction(transaction_id, opts=OPTS)
|
|
288
213
|
run("COMMIT PREPARED #{literal(transaction_id)}", opts)
|
|
289
214
|
end
|
|
@@ -347,7 +272,6 @@ module Sequel
|
|
|
347
272
|
self << create_trigger_sql(table, name, function, opts)
|
|
348
273
|
end
|
|
349
274
|
|
|
350
|
-
# PostgreSQL uses the :postgres database type.
|
|
351
275
|
def database_type
|
|
352
276
|
:postgres
|
|
353
277
|
end
|
|
@@ -486,10 +410,9 @@ module Sequel
|
|
|
486
410
|
else
|
|
487
411
|
range = 0...32
|
|
488
412
|
order = [Sequel[:indc][:relname], SQL::CaseExpression.new(range.map{|x| [SQL::Subscript.new(Sequel[:ind][:indkey], [x]), x]}, 32, Sequel[:att][:attnum])]
|
|
489
|
-
attnums = range.map{|x| SQL::Subscript.new(Sequel[:ind][:indkey], [x])} unless server_version >= 80100
|
|
490
413
|
end
|
|
491
414
|
|
|
492
|
-
attnums
|
|
415
|
+
attnums = SQL::Function.new(:ANY, Sequel[:ind][:indkey])
|
|
493
416
|
|
|
494
417
|
ds = metadata_dataset.
|
|
495
418
|
from{pg_class.as(:tab)}.
|
|
@@ -507,7 +430,8 @@ module Sequel
|
|
|
507
430
|
order(*order).
|
|
508
431
|
select{[indc[:relname].as(:name), ind[:indisunique].as(:unique), att[:attname].as(:column), con[:condeferrable].as(:deferrable)]}
|
|
509
432
|
|
|
510
|
-
ds = ds.where(:indisready=>true
|
|
433
|
+
ds = ds.where(:indisready=>true) if server_version >= 80300
|
|
434
|
+
ds = ds.where(:indislive=>true) if server_version >= 90300
|
|
511
435
|
|
|
512
436
|
indexes = {}
|
|
513
437
|
ds.each do |r|
|
|
@@ -575,28 +499,28 @@ module Sequel
|
|
|
575
499
|
run "REFRESH MATERIALIZED VIEW#{' CONCURRENTLY' if opts[:concurrently]} #{quote_schema_table(name)}"
|
|
576
500
|
end
|
|
577
501
|
|
|
578
|
-
# SEQUEL5: Remove
|
|
579
|
-
def reset_conversion_procs
|
|
580
|
-
Sequel::Deprecation.deprecate('Database#reset_conversion_procs', 'There should no longer be a need to reset conversion procs')
|
|
581
|
-
@conversion_procs = get_conversion_procs
|
|
582
|
-
conversion_procs_updated
|
|
583
|
-
@conversion_procs
|
|
584
|
-
end
|
|
585
|
-
|
|
586
502
|
# Reset the primary key sequence for the given table, basing it on the
|
|
587
503
|
# maximum current value of the table's primary key.
|
|
588
504
|
def reset_primary_key_sequence(table)
|
|
589
505
|
return unless seq = primary_key_sequence(table)
|
|
590
506
|
pk = SQL::Identifier.new(primary_key(table))
|
|
591
507
|
db = self
|
|
592
|
-
seq_ds = db.from(LiteralString.new(seq))
|
|
593
508
|
s, t = schema_and_table(table)
|
|
594
509
|
table = Sequel.qualify(s, t) if s
|
|
595
|
-
|
|
510
|
+
|
|
511
|
+
if server_version >= 100000
|
|
512
|
+
seq_ds = metadata_dataset.from(:pg_sequence).where(:seqrelid=>regclass_oid(LiteralString.new(seq)))
|
|
513
|
+
increment_by = :seqincrement
|
|
514
|
+
min_value = :seqmin
|
|
515
|
+
else
|
|
516
|
+
seq_ds = metadata_dataset.from(LiteralString.new(seq))
|
|
517
|
+
increment_by = :increment_by
|
|
518
|
+
min_value = :min_value
|
|
519
|
+
end
|
|
520
|
+
|
|
521
|
+
get{setval(seq, db[table].select(coalesce(max(pk)+seq_ds.select(increment_by), seq_ds.select(min_value))), false)}
|
|
596
522
|
end
|
|
597
523
|
|
|
598
|
-
# Rollback an existing prepared transaction with the given transaction
|
|
599
|
-
# identifier string.
|
|
600
524
|
def rollback_prepared_transaction(transaction_id, opts=OPTS)
|
|
601
525
|
run("ROLLBACK PREPARED #{literal(transaction_id)}", opts)
|
|
602
526
|
end
|
|
@@ -620,7 +544,6 @@ module Sequel
|
|
|
620
544
|
0
|
|
621
545
|
end
|
|
622
546
|
end
|
|
623
|
-
Sequel::Deprecation.deprecate('Sequel no longer supports PostgreSQL <8.2, some things may not work.') if @server_version < 80200
|
|
624
547
|
@server_version
|
|
625
548
|
end
|
|
626
549
|
|
|
@@ -700,10 +623,10 @@ module Sequel
|
|
|
700
623
|
# Creates a dataset that uses the VALUES clause:
|
|
701
624
|
#
|
|
702
625
|
# DB.values([[1, 2], [3, 4]])
|
|
703
|
-
# VALUES ((1, 2), (3, 4))
|
|
626
|
+
# # VALUES ((1, 2), (3, 4))
|
|
704
627
|
#
|
|
705
628
|
# DB.values([[1, 2], [3, 4]]).order(:column2).limit(1, 1)
|
|
706
|
-
# VALUES ((1, 2), (3, 4)) ORDER BY column2 LIMIT 1 OFFSET 1
|
|
629
|
+
# # VALUES ((1, 2), (3, 4)) ORDER BY column2 LIMIT 1 OFFSET 1
|
|
707
630
|
def values(v)
|
|
708
631
|
@default_dataset.clone(:values=>v)
|
|
709
632
|
end
|
|
@@ -723,21 +646,10 @@ module Sequel
|
|
|
723
646
|
|
|
724
647
|
private
|
|
725
648
|
|
|
726
|
-
# SEQUEL5: Remove
|
|
727
|
-
def add_named_conversion_procs(procs, named_procs)
|
|
728
|
-
unless (named_procs).empty?
|
|
729
|
-
convert_named_procs_to_procs(named_procs).each do |oid, pr|
|
|
730
|
-
procs[oid] ||= pr
|
|
731
|
-
end
|
|
732
|
-
conversion_procs_updated
|
|
733
|
-
end
|
|
734
|
-
end
|
|
735
|
-
|
|
736
649
|
def alter_table_add_column_sql(table, op)
|
|
737
650
|
"ADD COLUMN#{' IF NOT EXISTS' if op[:if_not_exists]} #{column_definition_sql(op)}"
|
|
738
651
|
end
|
|
739
652
|
|
|
740
|
-
# Use a PostgreSQL-specific alter table generator
|
|
741
653
|
def alter_table_generator_class
|
|
742
654
|
Postgres::AlterTableGenerator
|
|
743
655
|
end
|
|
@@ -821,14 +733,14 @@ module Sequel
|
|
|
821
733
|
(super || op[:op] == :validate_constraint) && op[:op] != :rename_column
|
|
822
734
|
end
|
|
823
735
|
|
|
824
|
-
VALID_CLIENT_MIN_MESSAGES = %w'DEBUG5 DEBUG4 DEBUG3 DEBUG2 DEBUG1 LOG NOTICE WARNING ERROR FATAL PANIC'.freeze
|
|
736
|
+
VALID_CLIENT_MIN_MESSAGES = %w'DEBUG5 DEBUG4 DEBUG3 DEBUG2 DEBUG1 LOG NOTICE WARNING ERROR FATAL PANIC'.freeze.each(&:freeze)
|
|
825
737
|
# The SQL queries to execute when starting a new connection.
|
|
826
738
|
def connection_configuration_sqls
|
|
827
739
|
sqls = []
|
|
828
740
|
|
|
829
|
-
sqls << "SET standard_conforming_strings = ON" if typecast_value_boolean(@opts.fetch(:force_standard_strings,
|
|
741
|
+
sqls << "SET standard_conforming_strings = ON" if typecast_value_boolean(@opts.fetch(:force_standard_strings, true))
|
|
830
742
|
|
|
831
|
-
cmm = @opts.fetch(:client_min_messages,
|
|
743
|
+
cmm = @opts.fetch(:client_min_messages, :warning)
|
|
832
744
|
if cmm && !cmm.to_s.empty?
|
|
833
745
|
cmm = cmm.to_s.upcase.strip
|
|
834
746
|
unless VALID_CLIENT_MIN_MESSAGES.include?(cmm)
|
|
@@ -872,34 +784,6 @@ module Sequel
|
|
|
872
784
|
end
|
|
873
785
|
end
|
|
874
786
|
|
|
875
|
-
# SEQUEL5: Remove
|
|
876
|
-
def conversion_procs_updated
|
|
877
|
-
nil
|
|
878
|
-
end
|
|
879
|
-
|
|
880
|
-
# SEQUEL5: Remove
|
|
881
|
-
def convert_named_procs_to_procs(named_procs)
|
|
882
|
-
h = {}
|
|
883
|
-
from(:pg_type).where(:typtype=>['b', 'e'], :typname=>named_procs.keys.map(&:to_s)).select_map([:oid, :typname]).each do |oid, name|
|
|
884
|
-
h[oid.to_i] = named_procs[name.untaint.to_sym]
|
|
885
|
-
end
|
|
886
|
-
h
|
|
887
|
-
end
|
|
888
|
-
|
|
889
|
-
# SEQUEL5: Remove
|
|
890
|
-
def copy_conversion_procs(oids)
|
|
891
|
-
Sequel::Deprecation.deprecate("Database#copy_conversion_procs", "There is no reason to use this anymore")
|
|
892
|
-
procs = conversion_procs
|
|
893
|
-
oids.each do |oid|
|
|
894
|
-
procs[oid] = PG__TYPES[oid]
|
|
895
|
-
end
|
|
896
|
-
conversion_procs_updated
|
|
897
|
-
end
|
|
898
|
-
|
|
899
|
-
EXCLUSION_CONSTRAINT_SQL_STATE = '23P01'.freeze
|
|
900
|
-
Sequel::Deprecation.deprecate_constant(self, :EXCLUSION_CONSTRAINT_SQL_STATE)
|
|
901
|
-
DEADLOCK_SQL_STATE = '40P01'.freeze
|
|
902
|
-
Sequel::Deprecation.deprecate_constant(self, :DEADLOCK_SQL_STATE)
|
|
903
787
|
def database_specific_error_class_from_sqlstate(sqlstate)
|
|
904
788
|
if sqlstate == '23P01'
|
|
905
789
|
ExclusionConstraintViolation
|
|
@@ -1041,7 +925,6 @@ module Sequel
|
|
|
1041
925
|
result += " AS #{sql}"
|
|
1042
926
|
end
|
|
1043
927
|
|
|
1044
|
-
# Use a PostgreSQL-specific create table generator
|
|
1045
928
|
def create_table_generator_class
|
|
1046
929
|
Postgres::CreateTableGenerator
|
|
1047
930
|
end
|
|
@@ -1098,8 +981,8 @@ module Sequel
|
|
|
1098
981
|
"DROP #{'MATERIALIZED ' if opts[:materialized]}VIEW#{' IF EXISTS' if opts[:if_exists]} #{quote_schema_table(name)}#{' CASCADE' if opts[:cascade]}"
|
|
1099
982
|
end
|
|
1100
983
|
|
|
1101
|
-
# If opts includes a :schema option,
|
|
1102
|
-
#
|
|
984
|
+
# If opts includes a :schema option, use it, otherwise restrict the filter to only the
|
|
985
|
+
# currently visible schemas.
|
|
1103
986
|
def filter_schema(ds, opts)
|
|
1104
987
|
expr = if schema = opts[:schema]
|
|
1105
988
|
schema.to_s
|
|
@@ -1109,18 +992,6 @@ module Sequel
|
|
|
1109
992
|
ds.where{{pg_namespace[:nspname]=>expr}}
|
|
1110
993
|
end
|
|
1111
994
|
|
|
1112
|
-
# SEQUEL5: Remove
|
|
1113
|
-
def get_conversion_procs
|
|
1114
|
-
procs = PG__TYPES.dup
|
|
1115
|
-
procs[1184] = procs[1114] = method(:to_application_timestamp)
|
|
1116
|
-
unless PG_NAMED__TYPES.empty?
|
|
1117
|
-
Sequel::Deprecation.deprecate("Sequel::PG_NAMED_TYPES", "Call Database#add_named_conversion_proc directly for each Database instance where you want to support the following type(s): #{PG_NAMED__TYPES.keys.join(', ')}")
|
|
1118
|
-
end
|
|
1119
|
-
add_named_conversion_procs(procs, PG_NAMED__TYPES)
|
|
1120
|
-
procs
|
|
1121
|
-
end
|
|
1122
|
-
|
|
1123
|
-
# PostgreSQL specific index SQL.
|
|
1124
995
|
def index_definition_sql(table_name, index)
|
|
1125
996
|
cols = index[:columns]
|
|
1126
997
|
index_name = index[:name] || default_index_name(table_name, cols)
|
|
@@ -1129,6 +1000,7 @@ module Sequel
|
|
|
1129
1000
|
else
|
|
1130
1001
|
literal(Array(cols))
|
|
1131
1002
|
end
|
|
1003
|
+
if_not_exists = " IF NOT EXISTS" if index[:if_not_exists]
|
|
1132
1004
|
unique = "UNIQUE " if index[:unique]
|
|
1133
1005
|
index_type = index[:type]
|
|
1134
1006
|
filter = index[:where] || index[:filter]
|
|
@@ -1140,7 +1012,7 @@ module Sequel
|
|
|
1140
1012
|
when :spatial
|
|
1141
1013
|
index_type = :gist
|
|
1142
1014
|
end
|
|
1143
|
-
"CREATE #{unique}INDEX#{' CONCURRENTLY' if index[:concurrently]} #{quote_identifier(index_name)} ON #{quote_schema_table(table_name)} #{"USING #{index_type} " if index_type}#{expr}#{filter}"
|
|
1015
|
+
"CREATE #{unique}INDEX#{' CONCURRENTLY' if index[:concurrently]}#{if_not_exists} #{quote_identifier(index_name)} ON #{quote_schema_table(table_name)} #{"USING #{index_type} " if index_type}#{expr}#{filter}"
|
|
1144
1016
|
end
|
|
1145
1017
|
|
|
1146
1018
|
# Setup datastructures shared by all postgres adapters.
|
|
@@ -1148,10 +1020,8 @@ module Sequel
|
|
|
1148
1020
|
@primary_keys = {}
|
|
1149
1021
|
@primary_key_sequences = {}
|
|
1150
1022
|
@supported_types = {}
|
|
1151
|
-
@conversion_procs =
|
|
1152
|
-
|
|
1153
|
-
# @conversion_procs = CONVERSION_PROCS.dup # SEQUEL5
|
|
1154
|
-
# procs[1184] = procs[1114] = method(:to_application_timestamp) # SEQUEL5
|
|
1023
|
+
procs = @conversion_procs = CONVERSION_PROCS.dup
|
|
1024
|
+
procs[1184] = procs[1114] = method(:to_application_timestamp)
|
|
1155
1025
|
end
|
|
1156
1026
|
|
|
1157
1027
|
# Backbone of the tables and views support.
|
|
@@ -1168,8 +1038,7 @@ module Sequel
|
|
|
1168
1038
|
end
|
|
1169
1039
|
end
|
|
1170
1040
|
|
|
1171
|
-
# Use a dollar sign instead of question mark for the argument
|
|
1172
|
-
# placeholder.
|
|
1041
|
+
# Use a dollar sign instead of question mark for the argument placeholder.
|
|
1173
1042
|
def prepared_arg_placeholder
|
|
1174
1043
|
PREPARED_ARG_PLACEHOLDER
|
|
1175
1044
|
end
|
|
@@ -1196,8 +1065,7 @@ module Sequel
|
|
|
1196
1065
|
Sequel.cast(expr.to_s,:regclass).cast(:oid)
|
|
1197
1066
|
end
|
|
1198
1067
|
|
|
1199
|
-
# Remove the cached entries for primary keys and sequences when a table is
|
|
1200
|
-
# changed.
|
|
1068
|
+
# Remove the cached entries for primary keys and sequences when a table is changed.
|
|
1201
1069
|
def remove_cached_schema(table)
|
|
1202
1070
|
tab = quote_schema_table(table)
|
|
1203
1071
|
Sequel.synchronize do
|
|
@@ -1213,7 +1081,6 @@ module Sequel
|
|
|
1213
1081
|
"ALTER TABLE #{quote_schema_table(name)} RENAME TO #{quote_identifier(schema_and_table(new_name).last)}"
|
|
1214
1082
|
end
|
|
1215
1083
|
|
|
1216
|
-
# Recognize PostgreSQL interval type.
|
|
1217
1084
|
def schema_column_type(db_type)
|
|
1218
1085
|
case db_type
|
|
1219
1086
|
when /\Ainterval\z/io
|
|
@@ -1315,7 +1182,7 @@ module Sequel
|
|
|
1315
1182
|
# PostgreSQL prefers the text datatype. If a fixed size is requested,
|
|
1316
1183
|
# the char type is used. If the text type is specifically
|
|
1317
1184
|
# disallowed or there is a size specified, use the varchar type.
|
|
1318
|
-
# Otherwise use the
|
|
1185
|
+
# Otherwise use the text type.
|
|
1319
1186
|
def type_literal_generic_string(column)
|
|
1320
1187
|
if column[:fixed]
|
|
1321
1188
|
"char(#{column[:size]||255})"
|
|
@@ -1332,85 +1199,11 @@ module Sequel
|
|
|
1332
1199
|
end
|
|
1333
1200
|
end
|
|
1334
1201
|
|
|
1335
|
-
# Instance methods for datasets that connect to a PostgreSQL database.
|
|
1336
1202
|
module DatasetMethods
|
|
1337
1203
|
include UnmodifiedIdentifiers::DatasetMethods
|
|
1338
1204
|
|
|
1339
|
-
ACCESS_SHARE = 'ACCESS SHARE'.freeze
|
|
1340
|
-
Sequel::Deprecation.deprecate_constant(self, :ACCESS_SHARE)
|
|
1341
|
-
ACCESS_EXCLUSIVE = 'ACCESS EXCLUSIVE'.freeze
|
|
1342
|
-
Sequel::Deprecation.deprecate_constant(self, :ACCESS_EXCLUSIVE)
|
|
1343
|
-
BOOL_FALSE = 'false'.freeze
|
|
1344
|
-
Sequel::Deprecation.deprecate_constant(self, :BOOL_FALSE)
|
|
1345
|
-
BOOL_TRUE = 'true'.freeze
|
|
1346
|
-
Sequel::Deprecation.deprecate_constant(self, :BOOL_TRUE)
|
|
1347
|
-
COMMA_SEPARATOR = ', '.freeze
|
|
1348
|
-
Sequel::Deprecation.deprecate_constant(self, :COMMA_SEPARATOR)
|
|
1349
|
-
EXCLUSIVE = 'EXCLUSIVE'.freeze
|
|
1350
|
-
Sequel::Deprecation.deprecate_constant(self, :EXCLUSIVE)
|
|
1351
|
-
EXPLAIN = 'EXPLAIN '.freeze
|
|
1352
|
-
Sequel::Deprecation.deprecate_constant(self, :EXPLAIN)
|
|
1353
|
-
EXPLAIN_ANALYZE = 'EXPLAIN ANALYZE '.freeze
|
|
1354
|
-
Sequel::Deprecation.deprecate_constant(self, :EXPLAIN_ANALYZE)
|
|
1355
|
-
FOR_SHARE = ' FOR SHARE'.freeze
|
|
1356
|
-
Sequel::Deprecation.deprecate_constant(self, :FOR_SHARE)
|
|
1357
|
-
PG_TIMESTAMP_FORMAT = "TIMESTAMP '%Y-%m-%d %H:%M:%S".freeze
|
|
1358
|
-
Sequel::Deprecation.deprecate_constant(self, :PG_TIMESTAMP_FORMAT)
|
|
1359
|
-
QUERY_PLAN = 'QUERY PLAN'.to_sym
|
|
1360
|
-
Sequel::Deprecation.deprecate_constant(self, :QUERY_PLAN)
|
|
1361
|
-
ROW_EXCLUSIVE = 'ROW EXCLUSIVE'.freeze
|
|
1362
|
-
Sequel::Deprecation.deprecate_constant(self, :ROW_EXCLUSIVE)
|
|
1363
|
-
ROW_SHARE = 'ROW SHARE'.freeze
|
|
1364
|
-
Sequel::Deprecation.deprecate_constant(self, :ROW_SHARE)
|
|
1365
|
-
SHARE = 'SHARE'.freeze
|
|
1366
|
-
Sequel::Deprecation.deprecate_constant(self, :SHARE)
|
|
1367
|
-
SHARE_ROW_EXCLUSIVE = 'SHARE ROW EXCLUSIVE'.freeze
|
|
1368
|
-
Sequel::Deprecation.deprecate_constant(self, :SHARE_ROW_EXCLUSIVE)
|
|
1369
|
-
SHARE_UPDATE_EXCLUSIVE = 'SHARE UPDATE EXCLUSIVE'.freeze
|
|
1370
|
-
Sequel::Deprecation.deprecate_constant(self, :SHARE_UPDATE_EXCLUSIVE)
|
|
1371
|
-
SQL_WITH_RECURSIVE = "WITH RECURSIVE ".freeze
|
|
1372
|
-
Sequel::Deprecation.deprecate_constant(self, :SQL_WITH_RECURSIVE)
|
|
1373
|
-
SPACE = ' '.freeze
|
|
1374
|
-
Sequel::Deprecation.deprecate_constant(self, :SPACE)
|
|
1375
|
-
FROM = ' FROM '.freeze
|
|
1376
|
-
Sequel::Deprecation.deprecate_constant(self, :FROM)
|
|
1377
|
-
APOS = "'".freeze
|
|
1378
|
-
Sequel::Deprecation.deprecate_constant(self, :APOS)
|
|
1379
|
-
APOS_RE = /'/.freeze
|
|
1380
|
-
Sequel::Deprecation.deprecate_constant(self, :APOS_RE)
|
|
1381
|
-
DOUBLE_APOS = "''".freeze
|
|
1382
|
-
Sequel::Deprecation.deprecate_constant(self, :DOUBLE_APOS)
|
|
1383
|
-
PAREN_CLOSE = ')'.freeze
|
|
1384
|
-
Sequel::Deprecation.deprecate_constant(self, :PAREN_CLOSE)
|
|
1385
|
-
PAREN_OPEN = '('.freeze
|
|
1386
|
-
Sequel::Deprecation.deprecate_constant(self, :PAREN_OPEN)
|
|
1387
|
-
COMMA = ', '.freeze
|
|
1388
|
-
Sequel::Deprecation.deprecate_constant(self, :COMMA)
|
|
1389
|
-
ESCAPE = " ESCAPE ".freeze
|
|
1390
|
-
Sequel::Deprecation.deprecate_constant(self, :ESCAPE)
|
|
1391
|
-
BACKSLASH = "\\".freeze
|
|
1392
|
-
Sequel::Deprecation.deprecate_constant(self, :BACKSLASH)
|
|
1393
|
-
AS = ' AS '.freeze
|
|
1394
|
-
Sequel::Deprecation.deprecate_constant(self, :AS)
|
|
1395
|
-
XOR_OP = ' # '.freeze
|
|
1396
|
-
Sequel::Deprecation.deprecate_constant(self, :XOR_OP)
|
|
1397
|
-
CRLF = "\r\n".freeze
|
|
1398
|
-
Sequel::Deprecation.deprecate_constant(self, :CRLF)
|
|
1399
|
-
BLOB_RE = /[\000-\037\047\134\177-\377]/n.freeze
|
|
1400
|
-
Sequel::Deprecation.deprecate_constant(self, :BLOB_RE)
|
|
1401
|
-
WINDOW = " WINDOW ".freeze
|
|
1402
|
-
Sequel::Deprecation.deprecate_constant(self, :WINDOW)
|
|
1403
|
-
SELECT_VALUES = "VALUES ".freeze
|
|
1404
|
-
Sequel::Deprecation.deprecate_constant(self, :SELECT_VALUES)
|
|
1405
|
-
EMPTY_STRING = ''.freeze
|
|
1406
|
-
Sequel::Deprecation.deprecate_constant(self, :EMPTY_STRING)
|
|
1407
|
-
SKIP_LOCKED = " SKIP LOCKED".freeze
|
|
1408
|
-
Sequel::Deprecation.deprecate_constant(self, :SKIP_LOCKED)
|
|
1409
|
-
NON_SQL_OPTIONS = (Dataset::NON_SQL_OPTIONS + [:cursor, :insert_conflict]).freeze
|
|
1410
|
-
Sequel::Deprecation.deprecate_constant(self, :NON_SQL_OPTIONS)
|
|
1411
|
-
|
|
1412
1205
|
NULL = LiteralString.new('NULL').freeze
|
|
1413
|
-
LOCK_MODES = ['ACCESS SHARE', 'ROW SHARE', 'ROW EXCLUSIVE', 'SHARE UPDATE EXCLUSIVE', 'SHARE', 'SHARE ROW EXCLUSIVE', 'EXCLUSIVE', 'ACCESS EXCLUSIVE'].each(&:freeze)
|
|
1206
|
+
LOCK_MODES = ['ACCESS SHARE', 'ROW SHARE', 'ROW EXCLUSIVE', 'SHARE UPDATE EXCLUSIVE', 'SHARE', 'SHARE ROW EXCLUSIVE', 'EXCLUSIVE', 'ACCESS EXCLUSIVE'].each(&:freeze).freeze
|
|
1414
1207
|
|
|
1415
1208
|
Dataset.def_sql_method(self, :delete, [['if server_version >= 90100', %w'with delete from using where returning'], ['else', %w'delete from using where returning']])
|
|
1416
1209
|
Dataset.def_sql_method(self, :insert, [['if server_version >= 90500', %w'with insert into columns values conflict returning'], ['elsif server_version >= 90100', %w'with insert into columns values returning'], ['else', %w'insert into columns values returning']])
|
|
@@ -1561,28 +1354,28 @@ module Sequel
|
|
|
1561
1354
|
#
|
|
1562
1355
|
# Examples:
|
|
1563
1356
|
#
|
|
1564
|
-
# DB[:table].insert_conflict.insert(:
|
|
1357
|
+
# DB[:table].insert_conflict.insert(a: 1, b: 2)
|
|
1565
1358
|
# # INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
1566
1359
|
# # ON CONFLICT DO NOTHING
|
|
1567
1360
|
#
|
|
1568
|
-
# DB[:table].insert_conflict(:
|
|
1361
|
+
# DB[:table].insert_conflict(constraint: :table_a_uidx).insert(a: 1, b: 2)
|
|
1569
1362
|
# # INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
1570
1363
|
# # ON CONFLICT ON CONSTRAINT table_a_uidx DO NOTHING
|
|
1571
1364
|
#
|
|
1572
|
-
# DB[:table].insert_conflict(:
|
|
1365
|
+
# DB[:table].insert_conflict(target: :a).insert(a: 1, b: 2)
|
|
1573
1366
|
# # INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
1574
1367
|
# # ON CONFLICT (a) DO NOTHING
|
|
1575
1368
|
#
|
|
1576
|
-
# DB[:table].insert_conflict(:
|
|
1369
|
+
# DB[:table].insert_conflict(target: :a, conflict_where: {c: true}).insert(a: 1, b: 2)
|
|
1577
1370
|
# # INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
1578
1371
|
# # ON CONFLICT (a) WHERE (c IS TRUE) DO NOTHING
|
|
1579
1372
|
#
|
|
1580
|
-
# DB[:table].insert_conflict(:
|
|
1373
|
+
# DB[:table].insert_conflict(target: :a, update: {b: Sequel[:excluded][:b]}).insert(a: 1, b: 2)
|
|
1581
1374
|
# # INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
1582
1375
|
# # ON CONFLICT (a) DO UPDATE SET b = excluded.b
|
|
1583
1376
|
#
|
|
1584
|
-
# DB[:table].insert_conflict(:
|
|
1585
|
-
# :
|
|
1377
|
+
# DB[:table].insert_conflict(constraint: :table_a_uidx,
|
|
1378
|
+
# update: {b: Sequel[:excluded][:b]}, update_where: {Sequel[:table][:status_id] => 1}).insert(a: 1, b: 2)
|
|
1586
1379
|
# # INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
1587
1380
|
# # ON CONFLICT ON CONSTRAINT table_a_uidx
|
|
1588
1381
|
# # DO UPDATE SET b = excluded.b WHERE (table.status_id = 1)
|
|
@@ -1593,7 +1386,7 @@ module Sequel
|
|
|
1593
1386
|
# Ignore uniqueness/exclusion violations when inserting, using ON CONFLICT DO NOTHING.
|
|
1594
1387
|
# Exists mostly for compatibility to MySQL's insert_ignore. Example:
|
|
1595
1388
|
#
|
|
1596
|
-
# DB[:table].insert_ignore.insert(:
|
|
1389
|
+
# DB[:table].insert_ignore.insert(a: 1, b: 2)
|
|
1597
1390
|
# # INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
1598
1391
|
# # ON CONFLICT DO NOTHING
|
|
1599
1392
|
def insert_ignore
|
|
@@ -1616,7 +1409,7 @@ module Sequel
|
|
|
1616
1409
|
|
|
1617
1410
|
# Locks all tables in the dataset's FROM clause (but not in JOINs) with
|
|
1618
1411
|
# the specified mode (e.g. 'EXCLUSIVE'). If a block is given, starts
|
|
1619
|
-
# a new transaction, locks the table, and yields. If a block is not given
|
|
1412
|
+
# a new transaction, locks the table, and yields. If a block is not given,
|
|
1620
1413
|
# just locks the tables. Note that PostgreSQL will probably raise an error
|
|
1621
1414
|
# if you lock the table outside of an existing transaction. Returns nil.
|
|
1622
1415
|
def lock(mode, opts=OPTS)
|
|
@@ -1679,7 +1472,7 @@ module Sequel
|
|
|
1679
1472
|
server_version >= 90500
|
|
1680
1473
|
end
|
|
1681
1474
|
|
|
1682
|
-
# PostgreSQL 9.
|
|
1475
|
+
# PostgreSQL 9.3+ supports lateral subqueries
|
|
1683
1476
|
def supports_lateral_subqueries?
|
|
1684
1477
|
server_version >= 90300
|
|
1685
1478
|
end
|
|
@@ -1725,10 +1518,11 @@ module Sequel
|
|
|
1725
1518
|
# :only and :restart only work correctly on PostgreSQL 8.4+.
|
|
1726
1519
|
#
|
|
1727
1520
|
# Usage:
|
|
1728
|
-
# DB[:table].truncate
|
|
1729
|
-
# #
|
|
1730
|
-
#
|
|
1731
|
-
#
|
|
1521
|
+
# DB[:table].truncate
|
|
1522
|
+
# # TRUNCATE TABLE "table"
|
|
1523
|
+
#
|
|
1524
|
+
# DB[:table].truncate(cascade: true, only: true, restart: true)
|
|
1525
|
+
# # TRUNCATE TABLE ONLY "table" RESTART IDENTITY CASCADE
|
|
1732
1526
|
def truncate(opts = OPTS)
|
|
1733
1527
|
if opts.empty?
|
|
1734
1528
|
super()
|