jeremyevans / sequel

Sequel: The Database Toolkit for Ruby
http://sequel.jeremyevans.net
Other
4.98k stars 1.07k forks source link

Unique constraints with class_table_inheritance are not converted into validation errors by pg_auto_constraint_validations #2027

Closed rolftimmermans closed 1 year ago

rolftimmermans commented 1 year ago

Complete Description of Issue

This issue occurs when using both the class_table_inheritance and the pg_auto_constraint_validations plugin.

I would expect Sequel::ValidationFailed in both cases.

Simplest Possible Self-Contained Example Showing the Bug

Sequel.migration do
  up do
    run %(create extension if not exists "uuid-ossp")

    create_table :publications do
      uuid :id, null: false, default: Sequel.function(:uuid_generate_v4), primary_key: true
      text :type, null: false
      text :title, null: false, unique: true
    end

    create_table :books do
      uuid :id, null: false, table: :publications, index: true, primary_key: true
      text :isbn, null: false
    end
  end
end
Sequel::DB = Sequel.connect("postgres://localhost/sequel_pg_auto_constraint_validations")

Sequel::Model.class_eval do
  plugin :pg_auto_constraint_validations
end

class Publication < Sequel::Model(:publications)
  plugin :class_table_inheritance, key: :type,
    table_map: {
      Book: :books,
    },
    model_map: {
      book: :Book,
    }
end

class Book < Publication
end

Publication.create(title: "pub test", type: "unused")
Publication.create(title: "pub test", type: "unused") # => Sequel::ValidationFailed (as expected)

Book.create(title: "book test", isbn: "1234")
Book.create(title: "book test", isbn: "2345") # => Sequel::UniqueConstraintViolation (not expected)

Full Backtrace of Exception (if any)

Traceback (most recent call last):
    42: from foo.rb:23:in `<main>'
    41: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:254:in `create'
    40: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1497:in `save'
    39: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1937:in `checked_save_failure'
    38: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1497:in `block in save'
    37: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1949:in `checked_transaction'
    36: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/transactions.rb:195:in `transaction'
    35: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/connecting.rb:293:in `synchronize'
    34: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/connection_pool/threaded.rb:92:in `hold'
    33: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/transactions.rb:233:in `block in transaction'
    32: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/transactions.rb:258:in `_transaction'
    31: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1949:in `block in checked_transaction'
    30: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1497:in `block (2 levels) in save'
    29: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1783:in `_save'
    28: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1047:in `around_save'
    27: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1788:in `block in _save'
    26: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1047:in `around_create'
    25: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1791:in `block (2 levels) in _save'
    24: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/class_table_inheritance.rb:408:in `_insert'
    23: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1719:in `_insert'
    22: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/pg_auto_constraint_validations.rb:339:in `_insert_select_raw'
    21: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/pg_auto_constraint_validations.rb:227:in `check_pg_constraint_error'
    20: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/pg_auto_constraint_validations.rb:339:in `block in _insert_select_raw'
    19: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1746:in `_insert_select_raw'
    18: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/shared/postgres.rb:1920:in `insert_select'
    17: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/dataset/actions.rb:1036:in `with_sql_first'
    16: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/dataset/actions.rb:1028:in `with_sql_each'
    15: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:651:in `fetch_rows'
    14: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/dataset/actions.rb:1187:in `execute'
    13: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:348:in `execute'
    12: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/connecting.rb:293:in `synchronize'
    11: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/connection_pool/threaded.rb:88:in `hold'
    10: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:348:in `block in execute'
     9: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:555:in `check_database_errors'
     8: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:348:in `block (2 levels) in execute'
     7: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:532:in `_execute'
     6: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:159:in `execute'
     5: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:136:in `check_disconnect_errors'
     4: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:159:in `block in execute'
     3: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:171:in `execute_query'
     2: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/logging.rb:38:in `log_connection_yield'
     1: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:171:in `block in execute_query'
/Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:171:in `exec': ERROR:  duplicate key value violates unique constraint "publications_title_key" (PG::UniqueViolation)
DETAIL:  Key (title)=(pub test) already exists.
    42: from foo.rb:23:in `<main>'
    41: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:254:in `create'
    40: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1497:in `save'
    39: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1937:in `checked_save_failure'
    38: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1497:in `block in save'
    37: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1949:in `checked_transaction'
    36: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/transactions.rb:195:in `transaction'
    35: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/connecting.rb:293:in `synchronize'
    34: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/connection_pool/threaded.rb:92:in `hold'
    33: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/transactions.rb:233:in `block in transaction'
    32: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/transactions.rb:258:in `_transaction'
    31: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1949:in `block in checked_transaction'
    30: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1497:in `block (2 levels) in save'
    29: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1783:in `_save'
    28: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1047:in `around_save'
    27: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1788:in `block in _save'
    26: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1047:in `around_create'
    25: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1791:in `block (2 levels) in _save'
    24: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/class_table_inheritance.rb:408:in `_insert'
    23: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1719:in `_insert'
    22: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/pg_auto_constraint_validations.rb:339:in `_insert_select_raw'
    21: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/pg_auto_constraint_validations.rb:227:in `check_pg_constraint_error'
    20: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/pg_auto_constraint_validations.rb:339:in `block in _insert_select_raw'
    19: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1746:in `_insert_select_raw'
    18: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/shared/postgres.rb:1920:in `insert_select'
    17: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/dataset/actions.rb:1036:in `with_sql_first'
    16: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/dataset/actions.rb:1028:in `with_sql_each'
    15: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:651:in `fetch_rows'
    14: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/dataset/actions.rb:1187:in `execute'
    13: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:348:in `execute'
    12: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/connecting.rb:293:in `synchronize'
    11: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/connection_pool/threaded.rb:88:in `hold'
    10: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:348:in `block in execute'
     9: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:555:in `check_database_errors'
     8: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:348:in `block (2 levels) in execute'
     7: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:532:in `_execute'
     6: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:159:in `execute'
     5: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:136:in `check_disconnect_errors'
     4: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:159:in `block in execute'
     3: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:171:in `execute_query'
     2: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/logging.rb:38:in `log_connection_yield'
     1: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:171:in `block in execute_query'
/Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:171:in `exec': PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "publications_title_key" (Sequel::UniqueConstraintViolation)
DETAIL:  Key (title)=(pub test) already exists.
    42: from foo.rb:23:in `<main>'
    41: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:254:in `create'
    40: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1497:in `save'
    39: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1937:in `checked_save_failure'
    38: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1497:in `block in save'
    37: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1949:in `checked_transaction'
    36: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/transactions.rb:195:in `transaction'
    35: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/connecting.rb:293:in `synchronize'
    34: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/connection_pool/threaded.rb:92:in `hold'
    33: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/transactions.rb:233:in `block in transaction'
    32: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/transactions.rb:258:in `_transaction'
    31: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1949:in `block in checked_transaction'
    30: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1497:in `block (2 levels) in save'
    29: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1783:in `_save'
    28: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1047:in `around_save'
    27: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1788:in `block in _save'
    26: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1047:in `around_create'
    25: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1791:in `block (2 levels) in _save'
    24: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/class_table_inheritance.rb:408:in `_insert'
    23: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1719:in `_insert'
    22: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/pg_auto_constraint_validations.rb:339:in `_insert_select_raw'
    21: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/pg_auto_constraint_validations.rb:227:in `check_pg_constraint_error'
    20: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/pg_auto_constraint_validations.rb:339:in `block in _insert_select_raw'
    19: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1746:in `_insert_select_raw'
    18: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/shared/postgres.rb:1920:in `insert_select'
    17: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/dataset/actions.rb:1036:in `with_sql_first'
    16: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/dataset/actions.rb:1028:in `with_sql_each'
    15: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:651:in `fetch_rows'
    14: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/dataset/actions.rb:1187:in `execute'
    13: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:348:in `execute'
    12: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/connecting.rb:293:in `synchronize'
    11: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/connection_pool/threaded.rb:88:in `hold'
    10: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:348:in `block in execute'
     9: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:555:in `check_database_errors'
     8: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:348:in `block (2 levels) in execute'
     7: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:532:in `_execute'
     6: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:159:in `execute'
     5: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:136:in `check_disconnect_errors'
     4: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:159:in `block in execute'
     3: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:171:in `execute_query'
     2: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/logging.rb:38:in `log_connection_yield'
     1: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:171:in `block in execute_query'
/Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:171:in `exec': title is already taken (Sequel::ValidationFailed)
Traceback (most recent call last):
    39: from foo.rb:26:in `<main>'
    38: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:254:in `create'
    37: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1497:in `save'
    36: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1937:in `checked_save_failure'
    35: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1497:in `block in save'
    34: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1949:in `checked_transaction'
    33: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/transactions.rb:195:in `transaction'
    32: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/connecting.rb:293:in `synchronize'
    31: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/connection_pool/threaded.rb:92:in `hold'
    30: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/transactions.rb:233:in `block in transaction'
    29: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/transactions.rb:258:in `_transaction'
    28: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1949:in `block in checked_transaction'
    27: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1497:in `block (2 levels) in save'
    26: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1783:in `_save'
    25: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1047:in `around_save'
    24: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1788:in `block in _save'
    23: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1047:in `around_create'
    22: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1791:in `block (2 levels) in _save'
    21: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/class_table_inheritance.rb:409:in `_insert'
    20: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/class_table_inheritance.rb:409:in `each'
    19: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/class_table_inheritance.rb:413:in `block in _insert'
    18: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/shared/postgres.rb:1920:in `insert_select'
    17: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/dataset/actions.rb:1036:in `with_sql_first'
    16: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/dataset/actions.rb:1028:in `with_sql_each'
    15: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:651:in `fetch_rows'
    14: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/dataset/actions.rb:1187:in `execute'
    13: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:348:in `execute'
    12: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/connecting.rb:293:in `synchronize'
    11: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/connection_pool/threaded.rb:88:in `hold'
    10: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:348:in `block in execute'
     9: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:555:in `check_database_errors'
     8: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:348:in `block (2 levels) in execute'
     7: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:532:in `_execute'
     6: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:159:in `execute'
     5: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:136:in `check_disconnect_errors'
     4: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:159:in `block in execute'
     3: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:171:in `execute_query'
     2: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/logging.rb:38:in `log_connection_yield'
     1: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:171:in `block in execute_query'
/Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:171:in `exec': ERROR:  duplicate key value violates unique constraint "publications_title_key" (PG::UniqueViolation)
DETAIL:  Key (title)=(book test) already exists.
    39: from foo.rb:26:in `<main>'
    38: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:254:in `create'
    37: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1497:in `save'
    36: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1937:in `checked_save_failure'
    35: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1497:in `block in save'
    34: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1949:in `checked_transaction'
    33: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/transactions.rb:195:in `transaction'
    32: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/connecting.rb:293:in `synchronize'
    31: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/connection_pool/threaded.rb:92:in `hold'
    30: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/transactions.rb:233:in `block in transaction'
    29: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/transactions.rb:258:in `_transaction'
    28: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1949:in `block in checked_transaction'
    27: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1497:in `block (2 levels) in save'
    26: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1783:in `_save'
    25: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1047:in `around_save'
    24: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1788:in `block in _save'
    23: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1047:in `around_create'
    22: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/model/base.rb:1791:in `block (2 levels) in _save'
    21: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/class_table_inheritance.rb:409:in `_insert'
    20: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/class_table_inheritance.rb:409:in `each'
    19: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/plugins/class_table_inheritance.rb:413:in `block in _insert'
    18: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/shared/postgres.rb:1920:in `insert_select'
    17: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/dataset/actions.rb:1036:in `with_sql_first'
    16: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/dataset/actions.rb:1028:in `with_sql_each'
    15: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:651:in `fetch_rows'
    14: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/dataset/actions.rb:1187:in `execute'
    13: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:348:in `execute'
    12: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/connecting.rb:293:in `synchronize'
    11: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/connection_pool/threaded.rb:88:in `hold'
    10: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:348:in `block in execute'
     9: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:555:in `check_database_errors'
     8: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:348:in `block (2 levels) in execute'
     7: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:532:in `_execute'
     6: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:159:in `execute'
     5: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:136:in `check_disconnect_errors'
     4: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:159:in `block in execute'
     3: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:171:in `execute_query'
     2: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/database/logging.rb:38:in `log_connection_yield'
     1: from /Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:171:in `block in execute_query'
/Users/rolftimmermans/Code/vendor/sequel/lib/sequel/adapters/postgres.rb:171:in `exec': PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "publications_title_key" (Sequel::UniqueConstraintViolation)
DETAIL:  Key (title)=(book test) already exists.

SQL Log (if any)

No response

Ruby Version

2.7.5

Sequel Version

master

jeremyevans commented 1 year ago

Thank you for the report. In this case, this is not a bug. The cause is the subclass's dataset selects from a subquery, and the pg_auto_constraint_validations plugin does not work with such datasets.

In your example, you want the subclasses to pick up constraint violations in every inserted table, not just the first inserted table, so class_table_inheritance subclasses cannot just inherit the pg_auto_constraint_validations metadata of the superclass, they need separate support that handles every table in the model's dataset, which is not something that pg_auto_constraint_validations handles (it is limited to a single table).

In this case, you would want to add a separate plugin that specifically handles this case. The implementation would be similar to but significantly more complicated than pg_auto_constraint_validations.

Looks like the pg_auto_constraint_validations plugin does not currently document that it only works with model datasets that select from a single table. I'll update the documentation to fix that.

rolftimmermans commented 1 year ago

Thank you for the clarification! I'll handle this in a custom plugin in that case.