create table operation
(
  id bigserial primary key
, redo text not null
, undo text not null
, parent integer references operation(id) on delete cascade
, redo_child integer references operation(id) -- must update before delete
, redo_cs text not null
, undo_cs text not null
);

insert into operation (id, redo, undo, redo_cs, undo_cs) values (0, '', '', '', '');

create table current_operation
(
  id bigint primary key references operation(id) -- must update before delete
);

insert into current_operation (id) values (0);

create table snapshot_operation
(
  id bigint primary key references operation(id) on delete cascade
, tag text not null unique
);

create table restore_operation
(
  id bigint primary key references operation(id) -- set after reading inp
);

insert into restore_operation (id) values (0);


create table batch_operation
(
  id bigserial primary key
, redo text not null
, undo text not null
, parent integer references operation(id) on delete cascade
, redo_child integer references operation(id) -- must update before delete
, redo_cs text not null
, undo_cs text not null
);

insert into batch_operation (id, redo, undo, redo_cs, undo_cs) values (0, '', '', '', '');

create type operation_table_option as enum ('operation', 'batch_operation');

create table operation_table
(
  option operation_table_option primary key
);

insert into operation_table (option) values ('operation');
