sequel 4.26.0 → 5.37.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 +5 -5
- data/CHANGELOG +405 -5656
- data/MIT-LICENSE +1 -1
- data/README.rdoc +232 -157
- data/bin/sequel +32 -9
- data/doc/advanced_associations.rdoc +252 -188
- data/doc/association_basics.rdoc +231 -273
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +75 -48
- data/doc/code_order.rdoc +28 -10
- data/doc/core_extensions.rdoc +104 -63
- data/doc/dataset_basics.rdoc +12 -21
- data/doc/dataset_filtering.rdoc +99 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +72 -46
- data/doc/model_dataset_method_design.rdoc +129 -0
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +12 -12
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +59 -69
- data/doc/opening_databases.rdoc +84 -94
- data/doc/postgresql.rdoc +268 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +184 -164
- 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.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.4.0.txt +80 -0
- data/doc/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/doc/release_notes/5.7.0.txt +108 -0
- data/doc/release_notes/5.8.0.txt +170 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/schema_modification.rdoc +102 -77
- data/doc/security.rdoc +160 -87
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +135 -122
- data/doc/testing.rdoc +34 -18
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +101 -19
- data/doc/validations.rdoc +64 -51
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel.rb +3 -1
- data/lib/sequel/adapters/ado.rb +154 -22
- data/lib/sequel/adapters/ado/access.rb +21 -21
- data/lib/sequel/adapters/ado/mssql.rb +8 -15
- data/lib/sequel/adapters/amalgalite.rb +17 -25
- data/lib/sequel/adapters/ibmdb.rb +52 -58
- data/lib/sequel/adapters/jdbc.rb +149 -127
- data/lib/sequel/adapters/jdbc/db2.rb +32 -40
- data/lib/sequel/adapters/jdbc/derby.rb +56 -58
- data/lib/sequel/adapters/jdbc/h2.rb +40 -30
- data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
- data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
- data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
- data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
- data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
- data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
- data/lib/sequel/adapters/mock.rb +104 -113
- data/lib/sequel/adapters/mysql.rb +42 -61
- data/lib/sequel/adapters/mysql2.rb +126 -35
- data/lib/sequel/adapters/odbc.rb +21 -28
- data/lib/sequel/adapters/odbc/db2.rb +3 -1
- data/lib/sequel/adapters/odbc/mssql.rb +11 -15
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/oracle.rb +62 -68
- data/lib/sequel/adapters/postgres.rb +257 -311
- data/lib/sequel/adapters/postgresql.rb +3 -1
- data/lib/sequel/adapters/shared/access.rb +75 -79
- data/lib/sequel/adapters/shared/db2.rb +96 -74
- data/lib/sequel/adapters/shared/mssql.rb +258 -213
- data/lib/sequel/adapters/shared/mysql.rb +284 -216
- data/lib/sequel/adapters/shared/oracle.rb +175 -60
- data/lib/sequel/adapters/shared/postgres.rb +829 -383
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
- data/lib/sequel/adapters/shared/sqlite.rb +382 -159
- data/lib/sequel/adapters/sqlanywhere.rb +53 -38
- data/lib/sequel/adapters/sqlite.rb +111 -105
- data/lib/sequel/adapters/tinytds.rb +38 -46
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
- data/lib/sequel/adapters/utils/replace.rb +3 -4
- data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +13 -89
- data/lib/sequel/connection_pool.rb +54 -26
- data/lib/sequel/connection_pool/sharded_single.rb +19 -12
- data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
- data/lib/sequel/connection_pool/single.rb +21 -12
- data/lib/sequel/connection_pool/threaded.rb +137 -119
- data/lib/sequel/core.rb +352 -320
- data/lib/sequel/database.rb +19 -2
- data/lib/sequel/database/connecting.rb +70 -55
- data/lib/sequel/database/dataset.rb +15 -5
- data/lib/sequel/database/dataset_defaults.rb +20 -102
- data/lib/sequel/database/features.rb +20 -4
- data/lib/sequel/database/logging.rb +25 -7
- data/lib/sequel/database/misc.rb +132 -118
- data/lib/sequel/database/query.rb +51 -28
- data/lib/sequel/database/schema_generator.rb +188 -75
- data/lib/sequel/database/schema_methods.rb +161 -92
- data/lib/sequel/database/transactions.rb +260 -58
- data/lib/sequel/dataset.rb +28 -12
- data/lib/sequel/dataset/actions.rb +354 -170
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +81 -34
- data/lib/sequel/dataset/graph.rb +82 -58
- data/lib/sequel/dataset/misc.rb +139 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +428 -214
- data/lib/sequel/dataset/sql.rb +446 -339
- data/lib/sequel/deprecated.rb +14 -2
- data/lib/sequel/exceptions.rb +48 -16
- data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
- data/lib/sequel/extensions/_model_pg_row.rb +43 -0
- data/lib/sequel/extensions/_pretty_table.rb +10 -9
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +2 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +9 -4
- data/lib/sequel/extensions/connection_expiration.rb +99 -0
- data/lib/sequel/extensions/connection_validator.rb +26 -13
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +93 -38
- data/lib/sequel/extensions/core_extensions.rb +45 -53
- data/lib/sequel/extensions/core_refinements.rb +44 -46
- data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
- data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
- data/lib/sequel/extensions/date_arithmetic.rb +42 -16
- data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
- data/lib/sequel/extensions/error_sql.rb +7 -3
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +14 -15
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/freeze_datasets.rb +3 -0
- data/lib/sequel/extensions/from_block.rb +2 -31
- data/lib/sequel/extensions/graph_each.rb +19 -6
- data/lib/sequel/extensions/identifier_mangling.rb +180 -0
- data/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/lib/sequel/extensions/index_caching.rb +109 -0
- data/lib/sequel/extensions/inflector.rb +8 -4
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/looser_typecasting.rb +19 -9
- data/lib/sequel/extensions/migration.rb +132 -80
- data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
- data/lib/sequel/extensions/null_dataset.rb +12 -8
- data/lib/sequel/extensions/pagination.rb +35 -28
- data/lib/sequel/extensions/pg_array.rb +227 -316
- data/lib/sequel/extensions/pg_array_ops.rb +19 -7
- data/lib/sequel/extensions/pg_enum.rb +69 -24
- data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
- data/lib/sequel/extensions/pg_hstore.rb +50 -59
- data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
- data/lib/sequel/extensions/pg_inet.rb +34 -15
- data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
- data/lib/sequel/extensions/pg_interval.rb +26 -26
- data/lib/sequel/extensions/pg_json.rb +422 -141
- data/lib/sequel/extensions/pg_json_ops.rb +248 -9
- data/lib/sequel/extensions/pg_loose_count.rb +5 -1
- data/lib/sequel/extensions/pg_range.rb +162 -146
- data/lib/sequel/extensions/pg_range_ops.rb +10 -5
- data/lib/sequel/extensions/pg_row.rb +53 -87
- data/lib/sequel/extensions/pg_row_ops.rb +36 -13
- data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/pretty_table.rb +4 -0
- data/lib/sequel/extensions/query.rb +12 -7
- data/lib/sequel/extensions/round_timestamps.rb +6 -9
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +59 -0
- data/lib/sequel/extensions/schema_caching.rb +14 -1
- data/lib/sequel/extensions/schema_dumper.rb +83 -55
- data/lib/sequel/extensions/select_remove.rb +8 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +50 -17
- data/lib/sequel/extensions/server_logging.rb +61 -0
- data/lib/sequel/extensions/split_array_nil.rb +8 -4
- data/lib/sequel/extensions/sql_comments.rb +96 -0
- data/lib/sequel/extensions/sql_expr.rb +4 -1
- data/lib/sequel/extensions/string_agg.rb +181 -0
- data/lib/sequel/extensions/string_date_time.rb +2 -0
- data/lib/sequel/extensions/symbol_aref.rb +53 -0
- data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
- data/lib/sequel/extensions/symbol_as.rb +23 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
- data/lib/sequel/extensions/to_dot.rb +15 -5
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model.rb +36 -126
- data/lib/sequel/model/associations.rb +850 -257
- data/lib/sequel/model/base.rb +652 -764
- data/lib/sequel/model/dataset_module.rb +13 -10
- data/lib/sequel/model/default_inflections.rb +3 -1
- data/lib/sequel/model/errors.rb +3 -3
- data/lib/sequel/model/exceptions.rb +12 -12
- data/lib/sequel/model/inflections.rb +8 -19
- data/lib/sequel/model/plugins.rb +111 -0
- data/lib/sequel/plugins/accessed_columns.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +32 -7
- data/lib/sequel/plugins/after_initialize.rb +3 -1
- data/lib/sequel/plugins/association_dependencies.rb +27 -18
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +181 -83
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/auto_validations.rb +58 -23
- data/lib/sequel/plugins/before_after_save.rb +8 -0
- data/lib/sequel/plugins/blacklist_security.rb +23 -12
- data/lib/sequel/plugins/boolean_readers.rb +9 -6
- data/lib/sequel/plugins/boolean_subsets.rb +64 -0
- data/lib/sequel/plugins/caching.rb +27 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
- data/lib/sequel/plugins/column_conflicts.rb +18 -3
- data/lib/sequel/plugins/column_select.rb +9 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +36 -24
- data/lib/sequel/plugins/constraint_validations.rb +37 -16
- data/lib/sequel/plugins/csv_serializer.rb +58 -35
- data/lib/sequel/plugins/dataset_associations.rb +60 -18
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +74 -13
- data/lib/sequel/plugins/delay_add_association.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +65 -24
- data/lib/sequel/plugins/eager_each.rb +27 -3
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/error_splitter.rb +19 -12
- data/lib/sequel/plugins/finder.rb +246 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/force_encoding.rb +9 -12
- data/lib/sequel/plugins/hook_class_methods.rb +39 -54
- data/lib/sequel/plugins/input_transformer.rb +20 -10
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/insert_returning_select.rb +4 -2
- data/lib/sequel/plugins/instance_filters.rb +12 -8
- data/lib/sequel/plugins/instance_hooks.rb +36 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +24 -13
- data/lib/sequel/plugins/json_serializer.rb +123 -47
- data/lib/sequel/plugins/lazy_attributes.rb +20 -14
- data/lib/sequel/plugins/list.rb +40 -26
- data/lib/sequel/plugins/many_through_many.rb +28 -12
- data/lib/sequel/plugins/modification_detection.rb +17 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
- data/lib/sequel/plugins/nested_attributes.rb +55 -28
- data/lib/sequel/plugins/optimistic_locking.rb +5 -3
- data/lib/sequel/plugins/pg_array_associations.rb +52 -18
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
- data/lib/sequel/plugins/pg_row.rb +7 -51
- data/lib/sequel/plugins/prepared_statements.rb +53 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
- data/lib/sequel/plugins/rcte_tree.rb +43 -63
- data/lib/sequel/plugins/serialization.rb +37 -44
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
- data/lib/sequel/plugins/sharding.rb +17 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
- data/lib/sequel/plugins/singular_table_names.rb +2 -0
- data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +13 -6
- data/lib/sequel/plugins/static_cache.rb +79 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +5 -3
- data/lib/sequel/plugins/subclasses.rb +20 -2
- data/lib/sequel/plugins/subset_conditions.rb +48 -0
- data/lib/sequel/plugins/table_select.rb +4 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +22 -8
- data/lib/sequel/plugins/touch.rb +21 -8
- data/lib/sequel/plugins/tree.rb +57 -30
- data/lib/sequel/plugins/typecast_on_load.rb +14 -4
- data/lib/sequel/plugins/unlimited_update.rb +3 -7
- data/lib/sequel/plugins/update_or_create.rb +6 -4
- data/lib/sequel/plugins/update_primary_key.rb +3 -1
- data/lib/sequel/plugins/update_refresh.rb +28 -15
- data/lib/sequel/plugins/uuid.rb +70 -0
- data/lib/sequel/plugins/validate_associated.rb +20 -0
- data/lib/sequel/plugins/validation_class_methods.rb +40 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +49 -31
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +31 -30
- data/lib/sequel/sql.rb +479 -329
- data/lib/sequel/timezones.rb +62 -32
- data/lib/sequel/version.rb +10 -3
- metadata +177 -477
- data/Rakefile +0 -165
- data/doc/active_record.rdoc +0 -912
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/lib/sequel/adapters/cubrid.rb +0 -142
- data/lib/sequel/adapters/do.rb +0 -156
- data/lib/sequel/adapters/do/mysql.rb +0 -64
- data/lib/sequel/adapters/do/postgres.rb +0 -42
- data/lib/sequel/adapters/do/sqlite3.rb +0 -40
- data/lib/sequel/adapters/jdbc/as400.rb +0 -82
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
- data/lib/sequel/adapters/odbc/progress.rb +0 -8
- data/lib/sequel/adapters/shared/cubrid.rb +0 -243
- data/lib/sequel/adapters/shared/firebird.rb +0 -245
- data/lib/sequel/adapters/shared/informix.rb +0 -52
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
- data/lib/sequel/adapters/shared/progress.rb +0 -38
- data/lib/sequel/adapters/swift.rb +0 -158
- data/lib/sequel/adapters/swift/mysql.rb +0 -47
- data/lib/sequel/adapters/swift/postgres.rb +0 -45
- data/lib/sequel/adapters/swift/sqlite.rb +0 -47
- data/lib/sequel/adapters/utils/pg_types.rb +0 -68
- data/lib/sequel/dataset/mutation.rb +0 -109
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
- data/lib/sequel/extensions/filter_having.rb +0 -59
- data/lib/sequel/extensions/hash_aliases.rb +0 -45
- data/lib/sequel/extensions/meta_def.rb +0 -31
- data/lib/sequel/extensions/query_literals.rb +0 -80
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
- data/lib/sequel/extensions/set_overrides.rb +0 -72
- data/lib/sequel/no_core_ext.rb +0 -1
- data/lib/sequel/plugins/association_autoreloading.rb +0 -7
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
- data/lib/sequel/plugins/schema.rb +0 -80
- data/lib/sequel/plugins/scissors.rb +0 -33
- data/spec/adapters/db2_spec.rb +0 -160
- data/spec/adapters/firebird_spec.rb +0 -411
- data/spec/adapters/informix_spec.rb +0 -100
- data/spec/adapters/mssql_spec.rb +0 -706
- data/spec/adapters/mysql_spec.rb +0 -1287
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3725
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -653
- data/spec/bin_spec.rb +0 -254
- data/spec/core/connection_pool_spec.rb +0 -1016
- data/spec/core/database_spec.rb +0 -2531
- data/spec/core/dataset_spec.rb +0 -5098
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1243
- data/spec/core/mock_adapter_spec.rb +0 -462
- data/spec/core/object_graph_spec.rb +0 -303
- data/spec/core/placeholder_literalizer_spec.rb +0 -163
- data/spec/core/schema_generator_spec.rb +0 -179
- data/spec/core/schema_spec.rb +0 -1659
- data/spec/core/spec_helper.rb +0 -34
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -699
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -123
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -117
- data/spec/extensions/association_pks_spec.rb +0 -365
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/blacklist_security_spec.rb +0 -88
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -420
- data/spec/extensions/column_conflicts_spec.rb +0 -60
- data/spec/extensions/column_select_spec.rb +0 -108
- data/spec/extensions/columns_introspection_spec.rb +0 -91
- data/spec/extensions/composition_spec.rb +0 -242
- data/spec/extensions/connection_validator_spec.rb +0 -120
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
- data/spec/extensions/constraint_validations_spec.rb +0 -325
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -173
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -311
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -150
- data/spec/extensions/defaults_setter_spec.rb +0 -101
- data/spec/extensions/delay_add_association_spec.rb +0 -52
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/eager_each_spec.rb +0 -42
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -73
- data/spec/extensions/filter_having_spec.rb +0 -40
- data/spec/extensions/force_encoding_spec.rb +0 -114
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/graph_each_spec.rb +0 -109
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -54
- data/spec/extensions/insert_returning_select_spec.rb +0 -46
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -276
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -291
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -267
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2172
- data/spec/extensions/meta_def_spec.rb +0 -21
- data/spec/extensions/migration_spec.rb +0 -712
- data/spec/extensions/modification_detection_spec.rb +0 -80
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
- data/spec/extensions/named_timezones_spec.rb +0 -108
- data/spec/extensions/nested_attributes_spec.rb +0 -697
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -128
- data/spec/extensions/pagination_spec.rb +0 -118
- data/spec/extensions/pg_array_associations_spec.rb +0 -736
- data/spec/extensions/pg_array_ops_spec.rb +0 -143
- data/spec/extensions/pg_array_spec.rb +0 -395
- data/spec/extensions/pg_enum_spec.rb +0 -92
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
- data/spec/extensions/pg_hstore_spec.rb +0 -206
- data/spec/extensions/pg_inet_ops_spec.rb +0 -101
- data/spec/extensions/pg_inet_spec.rb +0 -52
- data/spec/extensions/pg_interval_spec.rb +0 -76
- data/spec/extensions/pg_json_ops_spec.rb +0 -229
- data/spec/extensions/pg_json_spec.rb +0 -218
- data/spec/extensions/pg_loose_count_spec.rb +0 -17
- data/spec/extensions/pg_range_ops_spec.rb +0 -58
- data/spec/extensions/pg_range_spec.rb +0 -404
- data/spec/extensions/pg_row_ops_spec.rb +0 -60
- data/spec/extensions/pg_row_plugin_spec.rb +0 -62
- data/spec/extensions/pg_row_spec.rb +0 -360
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
- data/spec/extensions/prepared_statements_spec.rb +0 -103
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
- data/spec/extensions/pretty_table_spec.rb +0 -92
- data/spec/extensions/query_literals_spec.rb +0 -183
- data/spec/extensions/query_spec.rb +0 -102
- data/spec/extensions/rcte_tree_spec.rb +0 -392
- data/spec/extensions/round_timestamps_spec.rb +0 -43
- data/spec/extensions/schema_caching_spec.rb +0 -41
- data/spec/extensions/schema_dumper_spec.rb +0 -789
- data/spec/extensions/schema_spec.rb +0 -117
- data/spec/extensions/scissors_spec.rb +0 -26
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -362
- data/spec/extensions/server_block_spec.rb +0 -90
- data/spec/extensions/set_overrides_spec.rb +0 -61
- data/spec/extensions/sharding_spec.rb +0 -198
- data/spec/extensions/shared_caching_spec.rb +0 -175
- data/spec/extensions/single_table_inheritance_spec.rb +0 -297
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -17
- data/spec/extensions/spec_helper.rb +0 -71
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -22
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -66
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -175
- data/spec/extensions/to_dot_spec.rb +0 -154
- data/spec/extensions/touch_spec.rb +0 -203
- data/spec/extensions/tree_spec.rb +0 -274
- data/spec/extensions/typecast_on_load_spec.rb +0 -80
- data/spec/extensions/unlimited_update_spec.rb +0 -20
- data/spec/extensions/update_or_create_spec.rb +0 -87
- data/spec/extensions/update_primary_key_spec.rb +0 -100
- data/spec/extensions/update_refresh_spec.rb +0 -53
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1027
- data/spec/extensions/validation_helpers_spec.rb +0 -541
- data/spec/extensions/xml_serializer_spec.rb +0 -207
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -55
- data/spec/integration/associations_test.rb +0 -2454
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1808
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -240
- data/spec/integration/model_test.rb +0 -226
- data/spec/integration/plugin_test.rb +0 -2240
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -817
- data/spec/integration/spec_helper.rb +0 -48
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -374
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -525
- data/spec/model/associations_spec.rb +0 -4426
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2137
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -982
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2147
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- data/spec/sequel_coverage.rb +0 -15
- data/spec/spec_config.rb +0 -10
|
@@ -22,30 +22,30 @@ Columns are generally created by specifying the column type as the method
|
|
|
22
22
|
name, followed by the column name symbol to use, and after that any options that should be used.
|
|
23
23
|
If the method is a ruby class name that Sequel recognizes, Sequel will transform it into the appropriate
|
|
24
24
|
type for the given database. So while you specified +String+, Sequel will actually use +varchar+ or
|
|
25
|
-
+text+ depending on the underlying database. Here's a list of all
|
|
25
|
+
+text+ depending on the underlying database. Here's a list of all ruby classes that Sequel will
|
|
26
26
|
convert to database types:
|
|
27
27
|
|
|
28
|
-
create_table(:columns_types) do
|
|
29
|
-
Integer :a0
|
|
30
|
-
String :a1
|
|
31
|
-
String :a2, :
|
|
32
|
-
String :a3, :
|
|
33
|
-
String :a4, :
|
|
34
|
-
String :a5, :
|
|
35
|
-
File :b
|
|
36
|
-
Fixnum :c
|
|
37
|
-
Bignum :d
|
|
38
|
-
Float :e
|
|
39
|
-
BigDecimal :f
|
|
40
|
-
BigDecimal :f2, :
|
|
41
|
-
BigDecimal :f3, :
|
|
42
|
-
Date :g
|
|
43
|
-
DateTime :h
|
|
44
|
-
Time :i
|
|
45
|
-
Time :i2, :
|
|
46
|
-
Numeric :j
|
|
47
|
-
TrueClass :k
|
|
48
|
-
FalseClass :l
|
|
28
|
+
create_table(:columns_types) do # common database type used
|
|
29
|
+
Integer :a0 # integer
|
|
30
|
+
String :a1 # varchar(255)
|
|
31
|
+
String :a2, size: 50 # varchar(50)
|
|
32
|
+
String :a3, fixed: true # char(255)
|
|
33
|
+
String :a4, fixed: true, size: 50 # char(50)
|
|
34
|
+
String :a5, text: true # text
|
|
35
|
+
File :b # blob
|
|
36
|
+
Fixnum :c # integer
|
|
37
|
+
Bignum :d # bigint
|
|
38
|
+
Float :e # double precision
|
|
39
|
+
BigDecimal :f # numeric
|
|
40
|
+
BigDecimal :f2, size: 10 # numeric(10)
|
|
41
|
+
BigDecimal :f3, size: [10, 2] # numeric(10, 2)
|
|
42
|
+
Date :g # date
|
|
43
|
+
DateTime :h # timestamp
|
|
44
|
+
Time :i # timestamp
|
|
45
|
+
Time :i2, only_time: true # time
|
|
46
|
+
Numeric :j # numeric
|
|
47
|
+
TrueClass :k # boolean
|
|
48
|
+
FalseClass :l # boolean
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
Note that in addition to the ruby class name, Sequel also pays attention to the column options when
|
|
@@ -74,6 +74,11 @@ as the second argument, either as ruby classes, symbols, or strings:
|
|
|
74
74
|
column :a6, 'timestamp(6)' # timestamp(6)
|
|
75
75
|
end
|
|
76
76
|
|
|
77
|
+
If you use a ruby class as the type, Sequel will try to guess the appropriate type name for the
|
|
78
|
+
database you are using. If a symbol or string is used as the type, it is used verbatim as the type
|
|
79
|
+
name in SQL, with the exception of :Bignum. Using the symbol :Bignum as a type will use the
|
|
80
|
+
appropriate 64-bit integer type for the database you are using.
|
|
81
|
+
|
|
77
82
|
=== Column options
|
|
78
83
|
|
|
79
84
|
When using the type name as method, the third argument is an options hash, and when using the +column+
|
|
@@ -84,7 +89,7 @@ method, the fourth argument is the options hash. The following options are supp
|
|
|
84
89
|
options for the index.
|
|
85
90
|
:null :: Mark the column as allowing NULL values (if true),
|
|
86
91
|
or not allowing NULL values (if false). If unspecified, will default
|
|
87
|
-
to whatever the database default is.
|
|
92
|
+
to whatever the database default is (usually true).
|
|
88
93
|
:primary_key :: Mark this column as the primary key. This is used instead of the
|
|
89
94
|
primary key method if you want a non-autoincrementing primary key.
|
|
90
95
|
:primary_key_constraint_name :: The name to give the primary key constraint.
|
|
@@ -93,11 +98,11 @@ method, the fourth argument is the options hash. The following options are supp
|
|
|
93
98
|
as +primary_key+ or +foreign_key+.
|
|
94
99
|
:unique :: Mark the column as unique, generally has the same effect as
|
|
95
100
|
creating a unique index on the column.
|
|
96
|
-
:unique_constraint_name :: The name to give the unique
|
|
101
|
+
:unique_constraint_name :: The name to give the unique constraint.
|
|
97
102
|
|
|
98
103
|
=== Other methods
|
|
99
104
|
|
|
100
|
-
In addition to the +column+ method and other methods that create columns, there are
|
|
105
|
+
In addition to the +column+ method and other methods that create columns, there are other methods that can be used:
|
|
101
106
|
|
|
102
107
|
==== +primary_key+
|
|
103
108
|
|
|
@@ -107,14 +112,14 @@ You've seen this one used already. It's used to create an autoincrementing inte
|
|
|
107
112
|
|
|
108
113
|
If you want an autoincrementing 64-bit integer:
|
|
109
114
|
|
|
110
|
-
create_table(:a0){primary_key :id, :
|
|
115
|
+
create_table(:a0){primary_key :id, type: :Bignum}
|
|
111
116
|
|
|
112
117
|
If you want to create a primary key column that doesn't use an autoincrementing integer, you should
|
|
113
118
|
not use this method. Instead, you should use the :primary_key option to the +column+ method or type
|
|
114
119
|
method:
|
|
115
120
|
|
|
116
|
-
create_table(:a1){Integer :id, :
|
|
117
|
-
create_table(:a2){String :name, :
|
|
121
|
+
create_table(:a1){Integer :id, primary_key: true} # Non autoincrementing integer primary key
|
|
122
|
+
create_table(:a2){String :name, primary_key: true} # varchar(255) primary key
|
|
118
123
|
|
|
119
124
|
If you want to create a composite primary key, you should call the +primary_key+ method with an
|
|
120
125
|
array of column symbols. You can provide a specific name to use for the primary key constraint
|
|
@@ -123,8 +128,8 @@ via the :name option:
|
|
|
123
128
|
create_table(:items) do
|
|
124
129
|
Integer :group_id
|
|
125
130
|
Integer :position
|
|
126
|
-
primary_key [:group_id, :position], :
|
|
127
|
-
end
|
|
131
|
+
primary_key [:group_id, :position], name: :items_pk
|
|
132
|
+
end
|
|
128
133
|
|
|
129
134
|
If provided with an array, +primary_key+ does not create a column, it just sets up the primary key constraint.
|
|
130
135
|
|
|
@@ -132,7 +137,7 @@ If provided with an array, +primary_key+ does not create a column, it just sets
|
|
|
132
137
|
|
|
133
138
|
+foreign_key+ is used to create a foreign key column that references a column in another table (or the same table).
|
|
134
139
|
It takes the column name as the first argument, the table it references as the second argument, and an options hash
|
|
135
|
-
as
|
|
140
|
+
as its third argument. A simple example is:
|
|
136
141
|
|
|
137
142
|
create_table(:albums) do
|
|
138
143
|
primary_key :id
|
|
@@ -142,7 +147,7 @@ as it's third argument. A simple example is:
|
|
|
142
147
|
|
|
143
148
|
+foreign_key+ accepts the same options as +column+. For example, to have a unique foreign key with varchar(16) type:
|
|
144
149
|
|
|
145
|
-
foreign_key :column_name, :table, :
|
|
150
|
+
foreign_key :column_name, :table, unique: true, type: 'varchar(16)'
|
|
146
151
|
|
|
147
152
|
+foreign_key+ also accepts some specific options:
|
|
148
153
|
|
|
@@ -154,7 +159,7 @@ as it's third argument. A simple example is:
|
|
|
154
159
|
references the primary key of the associated table, at least
|
|
155
160
|
on most databases.
|
|
156
161
|
:on_delete :: Specify the behavior of this foreign key column when the row with the primary key
|
|
157
|
-
it references is deleted
|
|
162
|
+
it references is deleted, can be :restrict, :cascade, :set_null, or :set_default.
|
|
158
163
|
You can also use a string, which is used literally.
|
|
159
164
|
:on_update :: Specify the behavior of this foreign key column when the row with the primary key
|
|
160
165
|
it references modifies the value of the primary key. Takes the same options as
|
|
@@ -181,7 +186,7 @@ When using an array of symbols, you can also provide a :name option to name the
|
|
|
181
186
|
String :artist_name
|
|
182
187
|
String :artist_location
|
|
183
188
|
String :name
|
|
184
|
-
foreign_key [:artist_name, :artist_location], :artists, :
|
|
189
|
+
foreign_key [:artist_name, :artist_location], :artists, name: 'albums_artist_name_location_fkey'
|
|
185
190
|
end
|
|
186
191
|
|
|
187
192
|
If you want to add a foreign key for a single column with a named constraint, you must use
|
|
@@ -191,7 +196,7 @@ the array form with a single symbol:
|
|
|
191
196
|
primary_key :id
|
|
192
197
|
Integer :artist_id
|
|
193
198
|
String :name
|
|
194
|
-
foreign_key [:artist_id], :artists, :
|
|
199
|
+
foreign_key [:artist_id], :artists, name: 'albums_artist_id_fkey'
|
|
195
200
|
end
|
|
196
201
|
|
|
197
202
|
==== +index+
|
|
@@ -199,18 +204,18 @@ the array form with a single symbol:
|
|
|
199
204
|
+index+ creates indexes on the table. For single columns, calling index is the same as using the
|
|
200
205
|
<tt>:index</tt> option when creating the column:
|
|
201
206
|
|
|
202
|
-
create_table(:a){Integer :id, :
|
|
207
|
+
create_table(:a){Integer :id, index: true}
|
|
203
208
|
# Same as:
|
|
204
209
|
create_table(:a) do
|
|
205
210
|
Integer :id
|
|
206
211
|
index :id
|
|
207
212
|
end
|
|
208
213
|
|
|
209
|
-
create_table(:a){Integer :id, :
|
|
214
|
+
create_table(:a){Integer :id, index: {unique: true}}
|
|
210
215
|
# Same as:
|
|
211
216
|
create_table(:a) do
|
|
212
217
|
Integer :id
|
|
213
|
-
index :id, :
|
|
218
|
+
index :id, unique: true
|
|
214
219
|
end
|
|
215
220
|
|
|
216
221
|
Similar to the +primary_key+ and +foreign_key+ methods, calling +index+ with an array of symbols
|
|
@@ -236,11 +241,11 @@ The +unique+ method creates a unique constraint on the table. A unique constrai
|
|
|
236
241
|
operates identically to a unique index, so the following three +create_table+ blocks are
|
|
237
242
|
pretty much identical:
|
|
238
243
|
|
|
239
|
-
create_table(:a){Integer :a, :
|
|
244
|
+
create_table(:a){Integer :a, unique: true}
|
|
240
245
|
|
|
241
246
|
create_table(:a) do
|
|
242
247
|
Integer :a
|
|
243
|
-
index :a, :
|
|
248
|
+
index :a, unique: true
|
|
244
249
|
end
|
|
245
250
|
|
|
246
251
|
create_table(:a) do
|
|
@@ -271,7 +276,7 @@ both take the same options as +index+.
|
|
|
271
276
|
String :name
|
|
272
277
|
constraint(:name_min_length){char_length(name) > 2}
|
|
273
278
|
end
|
|
274
|
-
|
|
279
|
+
|
|
275
280
|
Instead of using a block, you can use arguments that will be handled similarly
|
|
276
281
|
to <tt>Dataset#where</tt>:
|
|
277
282
|
|
|
@@ -280,7 +285,7 @@ to <tt>Dataset#where</tt>:
|
|
|
280
285
|
String :name
|
|
281
286
|
constraint(:name_length_range, Sequel.function(:char_length, :name)=>3..50)
|
|
282
287
|
end
|
|
283
|
-
|
|
288
|
+
|
|
284
289
|
==== +check+
|
|
285
290
|
|
|
286
291
|
+check+ operates just like +constraint+, except that it doesn't take a name
|
|
@@ -291,7 +296,7 @@ and it creates an unnamed constraint:
|
|
|
291
296
|
String :name
|
|
292
297
|
check{char_length(name) > 2}
|
|
293
298
|
end
|
|
294
|
-
|
|
299
|
+
|
|
295
300
|
It's recommended that you use the +constraint+ method and provide a name for the
|
|
296
301
|
constraint, as that makes it easier to drop the constraint later if necessary.
|
|
297
302
|
|
|
@@ -299,23 +304,23 @@ constraint, as that makes it easier to drop the constraint later if necessary.
|
|
|
299
304
|
|
|
300
305
|
+create_join_table+ is a shortcut that you can use to create simple many-to-many join tables:
|
|
301
306
|
|
|
302
|
-
create_join_table(:
|
|
307
|
+
create_join_table(artist_id: :artists, album_id: :albums)
|
|
303
308
|
|
|
304
309
|
which expands to:
|
|
305
310
|
|
|
306
311
|
create_table(:albums_artists) do
|
|
307
|
-
foreign_key :album_id, :albums
|
|
308
|
-
foreign_key :artist_id, :artists
|
|
312
|
+
foreign_key :album_id, :albums
|
|
313
|
+
foreign_key :artist_id, :artists
|
|
309
314
|
primary_key [:album_id, :artist_id]
|
|
310
315
|
index [:artist_id, :album_id]
|
|
311
316
|
end
|
|
312
317
|
|
|
313
|
-
== <tt>create_table :as
|
|
318
|
+
== <tt>create_table :as</tt>
|
|
314
319
|
|
|
315
320
|
To create a table from the result of a SELECT query, instead of passing a block
|
|
316
321
|
to +create_table+, provide a dataset to the :as option:
|
|
317
322
|
|
|
318
|
-
create_table(:older_items, :
|
|
323
|
+
create_table(:older_items, as: DB[:items].where{updated_at < Date.today << 6})
|
|
319
324
|
|
|
320
325
|
== +alter_table+
|
|
321
326
|
|
|
@@ -331,7 +336,7 @@ argument is the column name, the second is the type, and the third is an options
|
|
|
331
336
|
hash:
|
|
332
337
|
|
|
333
338
|
alter_table(:albums) do
|
|
334
|
-
add_column :copies_sold, Integer, :
|
|
339
|
+
add_column :copies_sold, Integer, default: 0
|
|
335
340
|
end
|
|
336
341
|
|
|
337
342
|
=== +drop_column+
|
|
@@ -369,6 +374,12 @@ Sequel will not add a column, but will add a composite primary key constraint:
|
|
|
369
374
|
add_primary_key [:album_id, :artist_id]
|
|
370
375
|
end
|
|
371
376
|
|
|
377
|
+
It is possible to specify a name for the primary key constraint: via the :name option:
|
|
378
|
+
|
|
379
|
+
alter_table(:albums_artists) do
|
|
380
|
+
add_primary_key [:album_id, :artist_id], :name=>:albums_artists_pkey
|
|
381
|
+
end
|
|
382
|
+
|
|
372
383
|
If you just want to take an existing single column and make it a primary key, call
|
|
373
384
|
+add_primary_key+ with an array with a single symbol:
|
|
374
385
|
|
|
@@ -387,18 +398,29 @@ creates a new column:
|
|
|
387
398
|
end
|
|
388
399
|
|
|
389
400
|
If you want to add a new foreign key constraint to an existing column, you provide an
|
|
390
|
-
array with a single element
|
|
391
|
-
|
|
401
|
+
array with a single element:
|
|
402
|
+
|
|
403
|
+
alter_table(:albums) do
|
|
404
|
+
add_foreign_key [:artist_id], :artists
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
It's encouraged to provide a name when adding the constraint, via the :foreign_key_constraint_name
|
|
408
|
+
option if adding the column and the constraint:
|
|
392
409
|
|
|
393
410
|
alter_table(:albums) do
|
|
394
|
-
add_foreign_key
|
|
411
|
+
add_foreign_key :artist_id, :artists, foreign_key_constraint_name: :albums_artist_id_fkey
|
|
395
412
|
end
|
|
396
413
|
|
|
397
|
-
|
|
398
|
-
symbols:
|
|
414
|
+
or via the :name option if just adding the constraint:
|
|
399
415
|
|
|
400
416
|
alter_table(:albums) do
|
|
401
|
-
add_foreign_key [:
|
|
417
|
+
add_foreign_key [:artist_id], :artists, name: :albums_artist_id_fkey
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
To set up a multiple column foreign key constraint, use an array with multiple column symbols:
|
|
421
|
+
|
|
422
|
+
alter_table(:albums) do
|
|
423
|
+
add_foreign_key [:artist_name, :artist_location], :artists, name: :albums_artist_name_location_fkey
|
|
402
424
|
end
|
|
403
425
|
|
|
404
426
|
=== +drop_foreign_key+
|
|
@@ -415,13 +437,13 @@ an array. It's encouraged to use the :name option to provide the constraint nam
|
|
|
415
437
|
drop, though on some databases Sequel may be able to find the name through introspection:
|
|
416
438
|
|
|
417
439
|
alter_table(:albums) do
|
|
418
|
-
drop_foreign_key [:artist_id], :
|
|
440
|
+
drop_foreign_key [:artist_id], name: :albums_artist_id_fkey
|
|
419
441
|
end
|
|
420
442
|
|
|
421
443
|
An array is also used to drop a composite foreign key constraint:
|
|
422
444
|
|
|
423
445
|
alter_table(:albums) do
|
|
424
|
-
drop_foreign_key [:artist_name, :artist_location], :
|
|
446
|
+
drop_foreign_key [:artist_name, :artist_location], name: :albums_artist_name_location_fkey
|
|
425
447
|
end
|
|
426
448
|
|
|
427
449
|
If you do not provide a :name option and Sequel is not able to determine the name
|
|
@@ -440,7 +462,7 @@ It accepts the same options as +create_table+'s +index+ method, and you can set
|
|
|
440
462
|
a multiple column index using an array:
|
|
441
463
|
|
|
442
464
|
alter_table(:albums_artists) do
|
|
443
|
-
add_index [:album_id, :artist_id], :
|
|
465
|
+
add_index [:album_id, :artist_id], unique: true
|
|
444
466
|
end
|
|
445
467
|
|
|
446
468
|
=== +drop_index+
|
|
@@ -456,7 +478,7 @@ Just like +drop_column+, it is often used in the +down+ block of a migration.
|
|
|
456
478
|
To drop an index with a specific name, use the <tt>:name</tt> option:
|
|
457
479
|
|
|
458
480
|
alter_table(:albums) do
|
|
459
|
-
drop_index :artist_id, :
|
|
481
|
+
drop_index :artist_id, name: :artists_id_index
|
|
460
482
|
end
|
|
461
483
|
|
|
462
484
|
=== +add_full_text_index+, +add_spatial_index+
|
|
@@ -473,9 +495,9 @@ method:
|
|
|
473
495
|
add_constraint(:name_min_length){char_length(name) > 2}
|
|
474
496
|
end
|
|
475
497
|
|
|
476
|
-
There is no method to add an unnamed constraint, but you can pass nil as the first
|
|
477
|
-
argument of +add_constraint+ to do so. However, it's not
|
|
478
|
-
as it is difficult to drop such a constraint.
|
|
498
|
+
There is no method to add an unnamed constraint, but you can pass +nil+ as the first
|
|
499
|
+
argument of +add_constraint+ to do so. However, it's not recommended to do that
|
|
500
|
+
as it is more difficult to drop such a constraint.
|
|
479
501
|
|
|
480
502
|
=== +add_unique_constraint+
|
|
481
503
|
|
|
@@ -486,6 +508,12 @@ method. This usually has the same effect as adding a unique index.
|
|
|
486
508
|
add_unique_constraint [:artist_id, :name]
|
|
487
509
|
end
|
|
488
510
|
|
|
511
|
+
You can also specify a name via the :name option when adding the constraint:
|
|
512
|
+
|
|
513
|
+
alter_table(:albums) do
|
|
514
|
+
add_unique_constraint [:artist_id, :name], name: :albums_artist_id_name_ukey
|
|
515
|
+
end
|
|
516
|
+
|
|
489
517
|
=== +drop_constraint+
|
|
490
518
|
|
|
491
519
|
This method drops an existing named constraint:
|
|
@@ -501,9 +529,9 @@ For that reason, you should not add unnamed constraints that you ever might need
|
|
|
501
529
|
On some databases, you must specify the type of constraint via a <tt>:type</tt> option:
|
|
502
530
|
|
|
503
531
|
alter_table(:albums) do
|
|
504
|
-
drop_constraint(:albums_pk, :
|
|
505
|
-
drop_constraint(:albums_fk, :
|
|
506
|
-
drop_constraint(:albums_uk, :
|
|
532
|
+
drop_constraint(:albums_pk, type: :primary_key)
|
|
533
|
+
drop_constraint(:albums_fk, type: :foreign_key)
|
|
534
|
+
drop_constraint(:albums_uk, type: :unique)
|
|
507
535
|
end
|
|
508
536
|
|
|
509
537
|
=== +set_column_default+
|
|
@@ -514,17 +542,23 @@ This modifies the default value of a column:
|
|
|
514
542
|
set_column_default :copies_sold, 0
|
|
515
543
|
end
|
|
516
544
|
|
|
545
|
+
To remove a default value for a column, use +nil+ as the value:
|
|
546
|
+
|
|
547
|
+
alter_table(:albums) do
|
|
548
|
+
set_column_default :copies_sold, nil
|
|
549
|
+
end
|
|
550
|
+
|
|
517
551
|
=== +set_column_type+
|
|
518
552
|
|
|
519
553
|
This modifies a column's type. Most databases will attempt to convert existing values in
|
|
520
554
|
the columns to the new type:
|
|
521
555
|
|
|
522
556
|
alter_table(:albums) do
|
|
523
|
-
set_column_type :copies_sold, Bignum
|
|
557
|
+
set_column_type :copies_sold, :Bignum
|
|
524
558
|
end
|
|
525
559
|
|
|
526
560
|
You can specify the type as a string or symbol, in which case it is used verbatim, or as a supported
|
|
527
|
-
ruby class, in which case it gets converted to an appropriate database type.
|
|
561
|
+
ruby class or the :Bignum symbol, in which case it gets converted to an appropriate database type.
|
|
528
562
|
|
|
529
563
|
=== +set_column_allow_null+
|
|
530
564
|
|
|
@@ -586,9 +620,6 @@ the table if the table already exists. On some databases, it uses
|
|
|
586
620
|
<tt>IF NOT EXISTS</tt>, on others it does a separate query to check for
|
|
587
621
|
existence.
|
|
588
622
|
|
|
589
|
-
This should not be used inside migrations, as if the table does not
|
|
590
|
-
exist, it may mess up the migration.
|
|
591
|
-
|
|
592
623
|
=== +rename_table+
|
|
593
624
|
|
|
594
625
|
You can rename an existing table using +rename_table+. Like +rename_column+,
|
|
@@ -612,9 +643,6 @@ is the same as:
|
|
|
612
643
|
primary_key :id
|
|
613
644
|
end
|
|
614
645
|
|
|
615
|
-
It should not be used inside migrations, as if the table does not exist, it may
|
|
616
|
-
mess up the migration.
|
|
617
|
-
|
|
618
646
|
=== <tt>create_table?</tt>
|
|
619
647
|
|
|
620
648
|
<tt>create_table?</tt> only creates the table if it does
|
|
@@ -629,11 +657,9 @@ is the same as:
|
|
|
629
657
|
unless table_exists?(:artists)
|
|
630
658
|
create_table(:artists) do
|
|
631
659
|
primary_key :id
|
|
632
|
-
end
|
|
660
|
+
end
|
|
633
661
|
end
|
|
634
662
|
|
|
635
|
-
Like <tt>create_table!</tt>, it should not be used inside migrations.
|
|
636
|
-
|
|
637
663
|
=== +create_view+ and +create_or_replace_view+
|
|
638
664
|
|
|
639
665
|
These can be used to create views. The difference between them is that
|
|
@@ -651,4 +677,3 @@ second argument:
|
|
|
651
677
|
arguments:
|
|
652
678
|
|
|
653
679
|
drop_view(:gold_albums, :platinum_albums)
|
|
654
|
-
|
data/doc/security.rdoc
CHANGED
|
@@ -16,13 +16,11 @@ as it never calls eval on a string that is derived from user input.
|
|
|
16
16
|
However, some Sequel methods used for creating methods via metaprogramming
|
|
17
17
|
could conceivably be abused to do so:
|
|
18
18
|
|
|
19
|
-
* Sequel::Schema::CreateTableGenerator.add_type_method
|
|
20
|
-
* Sequel::Dataset.def_mutation_method
|
|
21
19
|
* Sequel::Dataset.def_sql_method
|
|
22
|
-
* Sequel::
|
|
23
|
-
* Sequel.
|
|
20
|
+
* Sequel::JDBC.load_driver
|
|
21
|
+
* Sequel::Plugins.def_dataset_methods
|
|
22
|
+
* Sequel::Dataset.prepared_statements_module (private)
|
|
24
23
|
* Sequel::SQL::Expression.to_s_method (private)
|
|
25
|
-
* Sequel::Plugins::HookClassMethods::ClassMethods#add_hook_type
|
|
26
24
|
|
|
27
25
|
As long as you don't call those with user input, you should not be
|
|
28
26
|
vulnerable to code execution.
|
|
@@ -44,34 +42,62 @@ There are basically two kinds of possible SQL injections in Sequel:
|
|
|
44
42
|
|
|
45
43
|
==== Full SQL Strings
|
|
46
44
|
|
|
47
|
-
Some Sequel methods are designed to execute raw SQL, including:
|
|
45
|
+
Some Sequel methods are designed to execute raw SQL strings, including:
|
|
48
46
|
|
|
49
47
|
* Sequel::Database#execute
|
|
48
|
+
* Sequel::Database#execute_ddl
|
|
49
|
+
* Sequel::Database#execute_dui
|
|
50
|
+
* Sequel::Database#execute_insert
|
|
50
51
|
* Sequel::Database#run
|
|
51
52
|
* Sequel::Database#<<
|
|
52
|
-
* Sequel::
|
|
53
|
-
* Sequel::
|
|
54
|
-
* Sequel::Dataset#
|
|
53
|
+
* Sequel::Dataset#fetch_rows
|
|
54
|
+
* Sequel::Dataset#with_sql_all
|
|
55
|
+
* Sequel::Dataset#with_sql_delete
|
|
56
|
+
* Sequel::Dataset#with_sql_each
|
|
57
|
+
* Sequel::Dataset#with_sql_first
|
|
58
|
+
* Sequel::Dataset#with_sql_insert
|
|
59
|
+
* Sequel::Dataset#with_sql_single_value
|
|
60
|
+
* Sequel::Dataset#with_sql_update
|
|
55
61
|
|
|
56
62
|
Here are some examples of use:
|
|
57
63
|
|
|
64
|
+
DB.execute 'SQL'
|
|
65
|
+
DB.execute_ddl 'SQL'
|
|
66
|
+
DB.execute_dui 'SQL'
|
|
67
|
+
DB.execute_insert 'SQL'
|
|
58
68
|
DB.run 'SQL'
|
|
59
69
|
DB << 'SQL'
|
|
60
|
-
DB.
|
|
61
|
-
DB
|
|
62
|
-
DB.
|
|
63
|
-
DB.dataset.
|
|
70
|
+
DB.fetch_rows('SQL'){|row| }
|
|
71
|
+
DB.dataset.with_sql_all('SQL')
|
|
72
|
+
DB.dataset.with_sql_delete('SQL')
|
|
73
|
+
DB.dataset.with_sql_each('SQL'){|row| }
|
|
74
|
+
DB.dataset.with_sql_first('SQL')
|
|
75
|
+
DB.dataset.with_sql_insert('SQL')
|
|
76
|
+
DB.dataset.with_sql_single_value('SQL')
|
|
77
|
+
DB.dataset.with_sql_update('SQL')
|
|
64
78
|
|
|
65
79
|
If you pass a string to these methods that is derived from user input, you open
|
|
66
|
-
yourself up to SQL injection.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
via Sequel::Database#literal. Example:
|
|
80
|
+
yourself up to SQL injection. These methods are not designed to work at all
|
|
81
|
+
with user input. If you must call them with user input, you should escape the
|
|
82
|
+
user input manually via Sequel::Database#literal. Example:
|
|
70
83
|
|
|
71
84
|
DB.run "SOME SQL #{DB.literal(params[:user].to_s)}"
|
|
72
85
|
|
|
73
|
-
|
|
74
|
-
|
|
86
|
+
==== Full SQL Strings, With Possible Placeholders
|
|
87
|
+
|
|
88
|
+
Other Sequel methods are designed to support execution of raw SQL strings that may contain placeholders:
|
|
89
|
+
|
|
90
|
+
* Sequel::Database#[]
|
|
91
|
+
* Sequel::Database#fetch
|
|
92
|
+
* Sequel::Dataset#with_sql
|
|
93
|
+
|
|
94
|
+
Here are some examples of use:
|
|
95
|
+
|
|
96
|
+
DB['SQL'].all
|
|
97
|
+
DB.fetch('SQL').all
|
|
98
|
+
DB.dataset.with_sql('SQL').all
|
|
99
|
+
|
|
100
|
+
With these methods you should use placeholders, in which case Sequel automatically escapes the input:
|
|
75
101
|
|
|
76
102
|
DB['SELECT * FROM foo WHERE bar = ?', params[:user].to_s]
|
|
77
103
|
|
|
@@ -79,19 +105,16 @@ in which case Sequel automatically literalizes the input:
|
|
|
79
105
|
|
|
80
106
|
Sequel generally treats ruby strings as SQL strings (escaping them correctly), and
|
|
81
107
|
not as raw SQL. However, you can convert a ruby string to a literal string, and
|
|
82
|
-
Sequel will then treat it as raw SQL. This is typically done through
|
|
83
|
-
|
|
84
|
-
or Sequel.lit[rdoc-ref:Sequel::SQL::Builders#lit] if they are not in use.
|
|
108
|
+
Sequel will then treat it as raw SQL. This is typically done through
|
|
109
|
+
Sequel.lit[rdoc-ref:Sequel::SQL::Builders#lit].
|
|
85
110
|
|
|
86
|
-
'a'.lit
|
|
87
111
|
Sequel.lit('a')
|
|
88
112
|
|
|
89
|
-
Using
|
|
113
|
+
Using Sequel.lit[rdoc-ref:Sequel::SQL::Builders#lit] to turn a ruby string into a literal string results
|
|
90
114
|
in SQL injection if the string is derived from user input. With both of these
|
|
91
115
|
methods, the strings can contain placeholders, which you can use to safely include
|
|
92
116
|
user input inside a literal string:
|
|
93
117
|
|
|
94
|
-
'a = ?'.lit(params[:user_id].to_s)
|
|
95
118
|
Sequel.lit('a = ?', params[:user_id].to_s)
|
|
96
119
|
|
|
97
120
|
Even though they have similar names, note that Sequel::Database#literal operates very differently from
|
|
@@ -109,78 +132,117 @@ a ruby string as raw SQL. For example:
|
|
|
109
132
|
|
|
110
133
|
==== SQL Filter Fragments
|
|
111
134
|
|
|
112
|
-
|
|
135
|
+
Starting in Sequel 5, Sequel does not automatically convert plain strings to
|
|
136
|
+
literal strings in typical code. Instead, you can use Sequel.lit to
|
|
137
|
+
create literal strings:
|
|
113
138
|
|
|
114
|
-
|
|
139
|
+
Sequel.lit("name > 'A'")
|
|
115
140
|
|
|
116
|
-
|
|
117
|
-
|
|
141
|
+
To safely include user input as part of an SQL filter fragment, use Sequel.lit
|
|
142
|
+
with placeholders:
|
|
118
143
|
|
|
119
|
-
DB[:table].where("name >
|
|
144
|
+
DB[:table].where(Sequel.lit("name > ?", params[:id].to_s)) # Safe
|
|
120
145
|
|
|
121
|
-
|
|
146
|
+
Be careful to never call Sequel.lit where the first argument is derived from
|
|
147
|
+
user input.
|
|
122
148
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
149
|
+
There are a few uncommon cases where Sequel will still convert
|
|
150
|
+
plain strings to literal strings.
|
|
151
|
+
|
|
152
|
+
==== SQL Fragment passed to Dataset#lock_style and Model#lock!
|
|
153
|
+
|
|
154
|
+
The Sequel::Dataset#lock_style and Sequel::Model#lock! methods also treat
|
|
155
|
+
an input string as SQL code. These methods should not be called with user input.
|
|
156
|
+
|
|
157
|
+
DB[:table].lock_style(params[:id]) # SQL injection!
|
|
158
|
+
Album.first.lock!(params[:id]) # SQL injection!
|
|
159
|
+
|
|
160
|
+
==== SQL Type Names
|
|
126
161
|
|
|
127
|
-
|
|
162
|
+
In general, most places where Sequel needs to use an SQL type that should
|
|
163
|
+
be specified by the user, it allows you to use a ruby string, and that
|
|
164
|
+
string is used verbatim as the SQL type. You should not use user input
|
|
165
|
+
for type strings.
|
|
128
166
|
|
|
129
|
-
Sequel
|
|
130
|
-
code most applications without ever using raw SQL.
|
|
167
|
+
DB[:table].select(Sequel.cast(:a, params[:id])) # SQL injection!
|
|
131
168
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
169
|
+
==== SQL Function Names
|
|
170
|
+
|
|
171
|
+
In most cases, Sequel does not quote SQL function names. You should not use
|
|
172
|
+
user input for function names.
|
|
173
|
+
|
|
174
|
+
DB[:table].select(Sequel.function(params[:id])) # SQL injection!
|
|
175
|
+
|
|
176
|
+
==== SQL Window Frames
|
|
177
|
+
|
|
178
|
+
For backwards compatibility, Sequel supports regular strings in the
|
|
179
|
+
window function :frame option, which will be treated as a literal string:
|
|
180
|
+
|
|
181
|
+
DB[:table].select{fun(arg).over(:frame=>'SQL Here')}
|
|
182
|
+
|
|
183
|
+
You should make sure the frame argument is not derived from user input,
|
|
184
|
+
or switch to using a hash as the :frame option value.
|
|
185
|
+
|
|
186
|
+
==== auto_literal_strings extension
|
|
187
|
+
|
|
188
|
+
If the auto_literal_strings extension is used for backwards compatibility,
|
|
189
|
+
then Sequel will treat plain strings as literal strings if they are used
|
|
190
|
+
as the first argument to a filtering method. This can lead to SQL
|
|
191
|
+
injection:
|
|
192
|
+
|
|
193
|
+
DB[:table].where("name > #{params[:id].to_s}")
|
|
194
|
+
# SQL injection when using auto_literal_strings extension
|
|
195
|
+
|
|
196
|
+
If you are using the auto_literal_strings extension, you need to be very careful,
|
|
197
|
+
as the following methods will treat a plain string given as the first argument
|
|
198
|
+
as a literal string:
|
|
135
199
|
|
|
136
200
|
* Sequel::Dataset#where
|
|
137
201
|
* Sequel::Dataset#having
|
|
138
202
|
* Sequel::Dataset#filter
|
|
139
203
|
* Sequel::Dataset#exclude
|
|
140
|
-
* Sequel::Dataset#exclude_where
|
|
141
204
|
* Sequel::Dataset#exclude_having
|
|
142
|
-
* Sequel::Dataset#and
|
|
143
205
|
* Sequel::Dataset#or
|
|
144
206
|
* Sequel::Dataset#first
|
|
145
207
|
* Sequel::Dataset#last
|
|
146
208
|
* Sequel::Dataset#[]
|
|
147
|
-
* Sequel::Dataset#[]=
|
|
148
|
-
|
|
149
|
-
The Model.find[rdoc-ref:Sequel::Model::ClassMethods#find] and Model.find_or_create[rdoc-ref:Sequel::Model::ClassMethods#find_or_create]
|
|
150
|
-
class methods also call down to the filter methods.
|
|
151
|
-
|
|
152
|
-
==== SQL Fragment passed to Dataset#update
|
|
153
209
|
|
|
154
|
-
|
|
155
|
-
string argument as raw SQL:
|
|
210
|
+
Even stuff that looks like it may be safe isn't:
|
|
156
211
|
|
|
157
|
-
DB[:table].
|
|
212
|
+
DB[:table].first(params[:num_rows])
|
|
213
|
+
# SQL injection when using auto_literal_strings extension
|
|
158
214
|
|
|
159
|
-
|
|
215
|
+
The Model.find[rdoc-ref:Sequel::Model::ClassMethods#find] and
|
|
216
|
+
Model.find_or_create[rdoc-ref:Sequel::Model::ClassMethods#find_or_create]
|
|
217
|
+
class methods will also treat string arguments as literal strings if the
|
|
218
|
+
auto_literal_strings extension is used:
|
|
160
219
|
|
|
161
|
-
|
|
220
|
+
Album.find(params[:id])
|
|
221
|
+
# SQL injection when using auto_literal_strings extension
|
|
162
222
|
|
|
163
|
-
|
|
223
|
+
Similar to the filter methods, the auto_literal_strings extension
|
|
224
|
+
also makes Sequel::Dataset#update treats a string argument as raw SQL:
|
|
164
225
|
|
|
165
|
-
DB[:table].update(
|
|
226
|
+
DB[:table].update("column = 1")
|
|
166
227
|
|
|
167
|
-
|
|
228
|
+
So you should not do:
|
|
168
229
|
|
|
169
|
-
|
|
170
|
-
|
|
230
|
+
DB[:table].update(params[:changes])
|
|
231
|
+
# SQL injection when using auto_literal_strings extension
|
|
171
232
|
|
|
172
|
-
|
|
233
|
+
or:
|
|
173
234
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
string is used verbatim as the SQL type. You should not use user input
|
|
177
|
-
for type strings.
|
|
235
|
+
DB[:table].update("column = #{params[:value].to_s}")
|
|
236
|
+
# SQL injection when using auto_literal_strings extension
|
|
178
237
|
|
|
179
|
-
|
|
238
|
+
Instead, you should do:
|
|
180
239
|
|
|
181
|
-
|
|
182
|
-
user input for function names.
|
|
240
|
+
DB[:table].update(:column => params[:value].to_s) # Safe
|
|
183
241
|
|
|
242
|
+
Because using the auto_literal_strings extension makes SQL injection
|
|
243
|
+
so much eaiser, it is recommended to not use it, and instead
|
|
244
|
+
use Sequel.lit with placeholders.
|
|
245
|
+
|
|
184
246
|
=== SQL Identifier Injections
|
|
185
247
|
|
|
186
248
|
Usually, Sequel treats ruby symbols as SQL identifiers, and ruby
|
|
@@ -200,7 +262,7 @@ the Sequel::Dataset#insert and Sequel::Dataset#update methods:
|
|
|
200
262
|
DB[:t].insert('b'=>1) # INSERT INTO "t" ("b") VALUES (1)
|
|
201
263
|
|
|
202
264
|
Note how the identifier is still quoted in these cases. Sequel quotes identifiers by default
|
|
203
|
-
on most databases. However, it does not quote identifiers by default on DB2
|
|
265
|
+
on most databases. However, it does not quote identifiers by default on DB2.
|
|
204
266
|
On those databases using an identifier derived from user input can lead to SQL injection.
|
|
205
267
|
Similarly, if you turn off identifier quoting manually on other databases, you open yourself
|
|
206
268
|
up to SQL injection if you use identifiers derived from user input.
|
|
@@ -215,19 +277,24 @@ derived from user input unless absolutely necessary.
|
|
|
215
277
|
|
|
216
278
|
Sequel also allows you to create identifiers using
|
|
217
279
|
Sequel.identifier[rdoc-ref:Sequel::SQL::Builders#identifier] for plain identifiers,
|
|
218
|
-
Sequel.qualify[rdoc-ref:Sequel::SQL::Builders#qualify]
|
|
280
|
+
Sequel.qualify[rdoc-ref:Sequel::SQL::Builders#qualify] and
|
|
281
|
+
Sequel::SQL::Indentifier#[][rdoc-ref:Sequel::SQL::QualifyingMethods#[]] for qualified identifiers, and
|
|
219
282
|
Sequel.as[rdoc-ref:Sequel::SQL::Builders#as] for aliased expressions. So if you
|
|
220
283
|
pass any of those values derived from user input, you are dealing with the same scenario.
|
|
221
284
|
|
|
222
285
|
Note that the issues with SQL identifiers do not just apply to places where
|
|
223
286
|
strings are used as identifiers, they also apply to all places where Sequel
|
|
224
287
|
uses symbols as identifiers. However, if you are creating symbols from user input,
|
|
225
|
-
you at least have a denial of service vulnerability, and possibly a
|
|
226
|
-
vulnerability.
|
|
288
|
+
you at least have a denial of service vulnerability in ruby <2.2, and possibly a
|
|
289
|
+
more serious vulnerability.
|
|
290
|
+
|
|
291
|
+
Note that many Database schema modification methods (e.g. create_table, add_column)
|
|
292
|
+
also allow for SQL identifier injections, and possibly also SQL code injections.
|
|
293
|
+
These methods should never be called with user input.
|
|
227
294
|
|
|
228
295
|
== Denial of Service
|
|
229
296
|
|
|
230
|
-
Sequel converts some strings to symbols. Because symbols in ruby are not
|
|
297
|
+
Sequel converts some strings to symbols. Because symbols in ruby <2.2 are not
|
|
231
298
|
garbage collected, if the strings that are converted to symbols are
|
|
232
299
|
derived from user input, you have a denial of service vulnerability due to
|
|
233
300
|
memory exhaustion.
|
|
@@ -256,7 +323,7 @@ if you allow the user to control the alias name:
|
|
|
256
323
|
|
|
257
324
|
DB[:table].select(:column.as(params[:alias]))
|
|
258
325
|
|
|
259
|
-
Then you have a denial of service vulnerability. In general, such a vulnerability
|
|
326
|
+
Then you can have a denial of service vulnerability. In general, such a vulnerability
|
|
260
327
|
is unlikely, because you are probably indexing into the returned hash(es) by name,
|
|
261
328
|
and if an alias was used and you didn't expect it, your application wouldn't work.
|
|
262
329
|
|
|
@@ -302,25 +369,31 @@ they also allow mass assignment:
|
|
|
302
369
|
Album.new(params[:album]) # Mass Assignment
|
|
303
370
|
Album.create(params[:album]) # Mass Assignment
|
|
304
371
|
|
|
305
|
-
|
|
306
|
-
Model#
|
|
307
|
-
Model#
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
to allow on a per-call basis. This pretty much eliminates the chance that the
|
|
312
|
-
user will be able to set a column you did not intend to allow:
|
|
372
|
+
When the argument is derived from user input, instead of these methods, it is encouraged to either use
|
|
373
|
+
Model#set_fields[rdoc-ref:Sequel::Model::InstanceMethods#set_fields] or
|
|
374
|
+
Model#update_fields[rdoc-ref:Sequel::Model::InstanceMethods#update_fields],
|
|
375
|
+
which allow you to specify which fields to allow on a per-call basis. This
|
|
376
|
+
pretty much eliminates the chance that the user will be able to set a column
|
|
377
|
+
you did not intend to allow:
|
|
313
378
|
|
|
314
|
-
album.set_only(params[:album], [:name, :copies_sold])
|
|
315
379
|
album.set_fields(params[:album], [:name, :copies_sold])
|
|
380
|
+
album.update_fields(params[:album], [:name, :copies_sold])
|
|
316
381
|
|
|
317
|
-
|
|
318
|
-
the
|
|
319
|
-
|
|
382
|
+
These two methods iterate over the second argument (+:name+ and +:copies_sold+ in
|
|
383
|
+
this example) instead of iterating over the entries in the first argument
|
|
384
|
+
(<tt>params[:album]</tt> in this example).
|
|
320
385
|
|
|
386
|
+
If you want to override the columns that Model#set[rdoc-ref:Sequel::Model::InstanceMethods#set]
|
|
387
|
+
allows by default during mass assignment, you can use the whitelist_security plugin, then call
|
|
388
|
+
the set_allowed_columns class method.
|
|
389
|
+
|
|
390
|
+
Album.plugin :whitelist_security
|
|
321
391
|
Album.set_allowed_columns(:name, :copies_sold)
|
|
322
392
|
Album.create(params[:album]) # Only name and copies_sold set
|
|
323
393
|
|
|
394
|
+
Being explicit on a per-call basis using the set_fields and update_fields methods is recommended
|
|
395
|
+
instead of using the whitelist_security plugin and setting a global whitelist.
|
|
396
|
+
|
|
324
397
|
For more details on the mass assignment methods, see the {Mass Assignment Guide}[rdoc-ref:doc/mass_assignment.rdoc].
|
|
325
398
|
|
|
326
399
|
== General Parameter Handling
|
|
@@ -331,8 +404,8 @@ their type. For example:
|
|
|
331
404
|
|
|
332
405
|
Album.where(:id=>params[:id])
|
|
333
406
|
|
|
334
|
-
is probably a bad idea. Assuming you are using a web framework, params
|
|
335
|
-
be a string, an array, a hash, or
|
|
407
|
+
is probably a bad idea. Assuming you are using a web framework, <tt>params[:id]</tt> could
|
|
408
|
+
be a string, an array, a hash, nil, or potentially something else.
|
|
336
409
|
|
|
337
410
|
Assuming that +id+ is an integer field, you probably want to do:
|
|
338
411
|
|
|
@@ -346,7 +419,7 @@ a string:
|
|
|
346
419
|
If you are trying to use an IN clause with a list of id values based on input provided
|
|
347
420
|
on a web form:
|
|
348
421
|
|
|
349
|
-
Album.where(:id=>params[:ids].to_a.map
|
|
422
|
+
Album.where(:id=>params[:ids].to_a.map(&:to_i))
|
|
350
423
|
|
|
351
424
|
Basically, be as explicit as possible. While there aren't any known security issues
|
|
352
425
|
in Sequel when you do:
|