--- /dev/null
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+my @chr = (1..22,
+ qw(AltOnly MT NewSs NotOn PAR Un X Y)
+ );
+my %chr;
+@chr{@chr} = @chr;
+$chr{NewSs} = 'ss';
+
+my %args;
+@args{map {my $a = $_; lc($a)} @ARGV} = 1;
+
+if ($args{drop}) {
+ for my $chr (@chr) {
+ print "DROP TABLE SubInd_ch${chr};\n";
+ }
+ print "DROP TABLE SubInd;\n";
+}
+if ($args{create}) {
+ print <<END;
+CREATE TABLE SubInd (
+ chr VARCHAR NOT NULL ,
+ batch_id int NOT NULL ,
+ subsnp_id int NOT NULL ,
+ submitted_ind_id int NOT NULL ,
+ submitted_strand_code int NULL ,
+ allele_flag int NULL ,
+ gty_id int NULL ,
+ submitted_rs int NULL
+);
+END
+ for my $chr (@chr) {
+ print "CREATE TABLE SubInd_ch${chr} (CHECK (chr = '$chr{${chr}}')) INHERITS (SubInd);\n";
+ }
+}
+if ($args{trigger}) {
+ print <<EOF;
+CREATE OR REPLACE FUNCTION subind_insert_trigger()
+RETURNS TRIGGER AS \$\$
+BEGIN
+EOF
+ for my $chr (@chr) {
+ print <<EOF;
+IF (NEW.chr = '${chr}') THEN
+ INSERT INTO SubInd_ch${chr} VALUES (NEW.*);
+EOF
+ print "ELS";
+ }
+ print <<EOF;
+E
+RAISE EXCEPTION 'chr out of range!';
+END IF;
+RETURN NULL;
+END;
+\$\$
+LANGUAGE plpgsql;
+EOF
+}
+if ($args{index}) {
+ for my $chr (@chr) {
+ print "CREATE INDEX ON SubInd_ch${chr}(subsnp_id);\n";
+ print "CREATE INDEX ON SubInd_ch${chr}(submitted_ind_id,subsnp_id,gty_id);\n";
+ }
+}
+