mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
5b35562d8e
If the subtype provides custom schema dumping behavior, we need to defer to it. We purposely choose not to handle any values other than an array (which technically should only ever be `nil`, but I'd rather code defensively here). Fixes #20515.
112 lines
3.2 KiB
Ruby
112 lines
3.2 KiB
Ruby
ActiveRecord::Schema.define do
|
|
|
|
enable_extension!('uuid-ossp', ActiveRecord::Base.connection)
|
|
|
|
create_table :uuid_parents, id: :uuid, force: true do |t|
|
|
t.string :name
|
|
end
|
|
|
|
create_table :uuid_children, id: :uuid, force: true do |t|
|
|
t.string :name
|
|
t.uuid :uuid_parent_id
|
|
end
|
|
|
|
%w(postgresql_times postgresql_oids defaults postgresql_timestamp_with_zones
|
|
postgresql_partitioned_table postgresql_partitioned_table_parent).each do |table_name|
|
|
drop_table table_name, if_exists: true
|
|
end
|
|
|
|
execute 'DROP SEQUENCE IF EXISTS companies_nonstd_seq CASCADE'
|
|
execute 'CREATE SEQUENCE companies_nonstd_seq START 101 OWNED BY companies.id'
|
|
execute "ALTER TABLE companies ALTER COLUMN id SET DEFAULT nextval('companies_nonstd_seq')"
|
|
execute 'DROP SEQUENCE IF EXISTS companies_id_seq'
|
|
|
|
execute 'DROP FUNCTION IF EXISTS partitioned_insert_trigger()'
|
|
|
|
%w(accounts_id_seq developers_id_seq projects_id_seq topics_id_seq customers_id_seq orders_id_seq).each do |seq_name|
|
|
execute "SELECT setval('#{seq_name}', 100)"
|
|
end
|
|
|
|
execute <<_SQL
|
|
CREATE TABLE defaults (
|
|
id serial primary key,
|
|
modified_date date default CURRENT_DATE,
|
|
modified_date_function date default now(),
|
|
fixed_date date default '2004-01-01',
|
|
modified_time timestamp default CURRENT_TIMESTAMP,
|
|
modified_time_function timestamp default now(),
|
|
fixed_time timestamp default '2004-01-01 00:00:00.000000-00',
|
|
char1 char(1) default 'Y',
|
|
char2 character varying(50) default 'a varchar field',
|
|
char3 text default 'a text field',
|
|
bigint_default bigint default 0::bigint,
|
|
multiline_default text DEFAULT '--- []
|
|
|
|
'::text
|
|
);
|
|
_SQL
|
|
|
|
execute <<_SQL
|
|
CREATE TABLE postgresql_times (
|
|
id SERIAL PRIMARY KEY,
|
|
time_interval INTERVAL,
|
|
scaled_time_interval INTERVAL(6)
|
|
);
|
|
_SQL
|
|
|
|
execute <<_SQL
|
|
CREATE TABLE postgresql_oids (
|
|
id SERIAL PRIMARY KEY,
|
|
obj_id OID
|
|
);
|
|
_SQL
|
|
|
|
execute <<_SQL
|
|
CREATE TABLE postgresql_timestamp_with_zones (
|
|
id SERIAL PRIMARY KEY,
|
|
time TIMESTAMP WITH TIME ZONE
|
|
);
|
|
_SQL
|
|
|
|
begin
|
|
execute <<_SQL
|
|
CREATE TABLE postgresql_partitioned_table_parent (
|
|
id SERIAL PRIMARY KEY,
|
|
number integer
|
|
);
|
|
CREATE TABLE postgresql_partitioned_table ( )
|
|
INHERITS (postgresql_partitioned_table_parent);
|
|
|
|
CREATE OR REPLACE FUNCTION partitioned_insert_trigger()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
INSERT INTO postgresql_partitioned_table VALUES (NEW.*);
|
|
RETURN NULL;
|
|
END;
|
|
$$
|
|
LANGUAGE plpgsql;
|
|
|
|
CREATE TRIGGER insert_partitioning_trigger
|
|
BEFORE INSERT ON postgresql_partitioned_table_parent
|
|
FOR EACH ROW EXECUTE PROCEDURE partitioned_insert_trigger();
|
|
_SQL
|
|
rescue ActiveRecord::StatementInvalid => e
|
|
if e.message =~ /language "plpgsql" does not exist/
|
|
execute "CREATE LANGUAGE 'plpgsql';"
|
|
retry
|
|
else
|
|
raise e
|
|
end
|
|
end
|
|
|
|
# This table is to verify if the :limit option is being ignored for text and binary columns
|
|
create_table :limitless_fields, force: true do |t|
|
|
t.binary :binary, limit: 100_000
|
|
t.text :text, limit: 100_000
|
|
end
|
|
|
|
create_table :bigint_array, force: true do |t|
|
|
t.integer :big_int_data_points, limit: 8, array: true
|
|
t.decimal :decimal_array_default, array: true, default: [1.23, 3.45]
|
|
end
|
|
end
|