SQL-Admin

 view release on metacpan or  search on metacpan

lib/SQL/Admin/Driver/Base/Keywords.pm  view on Meta::CPAN

our %SQL_KEYWORDS = map +( $_ => 1 ), (
    qw( a             abs           absolute      action        ada             ),
    qw( add           admin         after         aggregate     alias           ),
    qw( all           allocate      alter         always        and             ),
    qw( any           are           array         as            asc             ),
    qw( asensitive    assertion     assignment    assymetric    at              ),
    qw( atomic        attribute     attributes    authorization avg             ),
    qw( before        begin         bernoulli     between       begin           ),
    qw( binary        bit           bitvar        bit_length    blob            ),
    qw( boolean       both          breadth       by            c               ),
    qw( cache         call          called        cardinality   cascade         ),
    qw( cascaded      case          cast          catalog       catalog_name    ),
    qw( ceil          cailing       char          character     characteristics ),
    qw( char_length   check         checked       class         ),
    # qw( characters    character_length
);

lib/SQL/Admin/Driver/DB2/DBI.pm  view on Meta::CPAN

        [ 'syscat.references fk', 'syscat.keycoluse tc', 'syscat.keycoluse rc' ],
        [
            'fk.constname    as constraint_name',
            'fk.tabschema    as table_schema',
            'fk.tabname      as table_name',
            'tc.colname      as column_name',
            'fk.reftabschema as reftable_schema',
            'fk.reftabname   as reftable_name',
            'rc.colname      as refcolumn_name',
            'case when fk.deleterule = \'A\' then \'no_action\'
                  when fk.deleterule = \'C\' then \'cascade\'
                  when fk.deleterule = \'N\' then \'set_null\'
                  when fk.deleterule = \'R\' then \'restrict\'
             end as delete_rule',
            'case when fk.updaterule = \'A\' then \'no_action\'
                  when fk.updaterule = \'C\' then \'cascade\'
                  when fk.updaterule = \'N\' then \'set_null\'
                  when fk.updaterule = \'R\' then \'restrict\'
             end as update_rule',

            'tc.colseq       as colno',
            'fk.colcount',
        ],
        {
            'fk.tabschema'  => ( @schemas ? \ @schemas : { not_like => 'SYS%' }),
            'fk.constname'  => \ ' = tc.constname',

lib/SQL/Admin/Driver/DB2/Grammar.pm  view on Meta::CPAN

APPEND        : /^\b (?: append           ) \b/ix { $item[0] }
AS            : /^\b (?: as               ) \b/ix { $item[0] }
ASC           : /^\b (?: asc              ) \b/ix { $item[0] }
ALL           : /^\b (?: all              ) \b/ix { $item[0] }
ALLOW         : /^\b (?: allow            ) \b/ix { $item[0] }
BIGINT        : /^\b (?: bigint           ) \b/ix { $item[0] }
BUILD         : /^\b (?: build            ) \b/ix { $item[0] }
BY            : /^\b (?: by               ) \b/ix { $item[0] }
CACHE         : /^\b (?: cache            ) \b/ix { $item[0] }
CAPTURE       : /^\b (?: capture          ) \b/ix { $item[0] }
CASCADE       : /^\b (?: cascade          ) \b/ix { $item[0] }
CHANGES       : /^\b (?: changes          ) \b/ix { $item[0] }
CHAR          : /^\b (?: character | char ) \b/ix { $item[0] }
COLUMN        : /^\b (?: column           ) \b/ix { $item[0] }
COMMENT       : /^\b (?: comment          ) \b/ix { $item[0] }
COMMIT        : /^\b (?: commit           ) \b/ix { $item[0] }
CONNECT       : /^\b (?: connect          ) \b/ix { $item[0] }
CONSTRAINT    : /^\b (?: constraint       ) \b/ix { $item[0] }
CREATE        : /^\b (?: create           ) \b/ix { $item[0] }
CURRENT       : /^\b (?: current          ) \b/ix { $item[0] }
CYCLE         : /^\b (?: cycle            ) \b/ix { $item[0] }

lib/SQL/Admin/Driver/DB2/Grammar.pm  view on Meta::CPAN

    | { +{} }

generated_column_spec :                  # TEST parts
      default_clause
    | autoincrement
#    | generated_expression

######################################################################

referential_delete_action :              # TEST OK
      CASCADE                               { 'cascade' }
    | SET NULL                              { 'set_null' }
    | RESTRICT                              { 'restrict' }
    | NO ACTION                             { 'no_action' }

referential_update_action :              # TEST OK
      RESTRICT                              { 'restrict' }
    | NO ACTION                             { 'no_action' }

update_rule:                             # TEST OK
    ON UPDATE referential_update_action

lib/SQL/Admin/Driver/DB2/Producer.pm  view on Meta::CPAN


######################################################################

our $ESCAPE_ALL_IDENTIFIERS      = 0;
our $ESCAPE_NONRESERVED_KEYWORDS = 0;
our $ESCAPE_SQL_KEYWORDS         = 0;

######################################################################

our %REFERENTIAL_ACTION = (
    cascade   => [ 'CASCADE' ],
    no_action => [ 'NO', 'ACTION' ],
    restrict  => [ 'RESTRICT' ],
    set_null  => [ 'SET', 'NULL' ],
);

######################################################################
######################################################################

sub _escape_identifier {                 # ;
    my ($self, $identifier) = @_;

lib/SQL/Admin/Driver/Pg/DBI.pm  view on Meta::CPAN

        [ 'syscat.references fk', 'syscat.keycoluse tc', 'syscat.keycoluse rc' ],
        [
            'fk.constname    as constraint_name',
            'fk.tabschema    as table_schema',
            'fk.tabname      as table_name',
            'tc.colname      as column_name',
            'fk.reftabschema as reftable_schema',
            'fk.reftabname   as reftable_name',
            'rc.colname      as refcolumn_name',
            'case when fk.deleterule = \'A\' then \'no_action\'
                  when fk.deleterule = \'C\' then \'cascade\'
                  when fk.deleterule = \'N\' then \'set_null\'
                  when fk.deleterule = \'R\' then \'restrict\'
             end as delete_rule',
            'case when fk.updaterule = \'A\' then \'no_action\'
                  when fk.updaterule = \'C\' then \'cascade\'
                  when fk.updaterule = \'N\' then \'set_null\'
                  when fk.updaterule = \'R\' then \'restrict\'
             end as update_rule',

            'tc.colseq       as colno',
            'fk.colcount',
        ],
        {
            'fk.tabschema'  => ( @schemas ? \ @schemas : { not_like => 'SYS%' }),
            'fk.constname'  => \ ' = tc.constname',

lib/SQL/Admin/Driver/Pg/Grammar.pm  view on Meta::CPAN

SEQUENCE          : /^\b (?: sequence              ) \b/ix { $item[0] }
UNIQUE            : /^\b (?: unique                ) \b/ix { $item[0] }
INDEX             : /^\b (?: index                 ) \b/ix { $item[0] }
CONCURRENTLY      : /^\b (?: concurrently          ) \b/ix { $item[0] }
GLOBAL            : /^\b (?: global                ) \b/ix { $item[0] }
LOCAL             : /^\b (?: local                 ) \b/ix { $item[0] }
ON                : /^\b (?: on                    ) \b/ix { $item[0] }
DEFAULT           : /^\b (?: default               ) \b/ix { $item[0] }
ACTION            : /^\b (?: action                ) \b/ix { $item[0] }
RESTRICT          : /^\b (?: restrict              ) \b/ix { $item[0] }
CASCADE           : /^\b (?: cascade               ) \b/ix { $item[0] }
SET               : /^\b (?: set                   ) \b/ix { $item[0] }
UPDATE            : /^\b (?: update                ) \b/ix { $item[0] }
DELETE            : /^\b (?: delete                ) \b/ix { $item[0] }
REFERENCES        : /^\b (?: references            ) \b/ix { $item[0] }
CONSTRAINT        : /^\b (?: constraint            ) \b/ix { $item[0] }
DEFERRABLE        : /^\b (?: deferrable            ) \b/ix { $item[0] }
DEFERRED          : /^\b (?: deferred              ) \b/ix { $item[0] }
IMMEDIATE         : /^\b (?: immediate             ) \b/ix { $item[0] }
INITIALLY         : /^\b (?: initially             ) \b/ix { $item[0] }
PRIMARY           : /^\b (?: primary               ) \b/ix { $item[0] }

lib/SQL/Admin/Driver/Pg/Grammar.pm  view on Meta::CPAN

default_clause :                         # TEST OK
    DEFAULT
    default_clause_value(?)
    { href aexp @item[0,-1] }


default_clause_value:                    # TEST OK
      constant

referential_action :                     # TEST OK
      CASCADE                               { 'cascade' }
    | SET NULL                              { 'set_null' }
    | SET DEFAULT                           { 'set_default' }
    | RESTRICT                              { 'restrict' }
    | NO ACTION                             { 'no_action' }


update_rule:                             # TEST OK
    ON UPDATE referential_action
    { expr @item }

lib/SQL/Admin/Driver/Pg/Grammar.pm  view on Meta::CPAN

    add_column
  | drop_column
  | add_constraint
  | alter_column

add_column :                             # TEST OK
    ADD COLUMN(?) column_definition         { expr_stm @item }

drop_column_restriction :
    RESTRICT                                { expr @item, 'restrict' }
  | CASCADE                                 { expr @item, 'cascade' }

drop_column :                            # TEST OK
    DROP COLUMN(?)
    if_exists(?)
    column_name
    drop_column_restriction(?)
    { expr_stm @item }

alter_column :                           # TEST OK
    ALTER COLUMN(?)

lib/SQL/Admin/Driver/Pg/Keywords.pm  view on Meta::CPAN

    qw( symmetric table then to trailing ),
    qw( true union unique user using ),
    qw( verbose when where ),
);

our %NONRESERVED_KEYWORDS = map +( $_ => 1 ), (
    qw( abort absolute access     action add ),
    qw( admin after    aggreggate also   alter ),
    qw( assertion assignment at bacward before ),
    qw( begin bigint bit boolean by ),
    qw( cache called cascade chain char ),
    qw( character characteristics checkpoint class close ),
    qw( cluster coalesce comment commit committed ),
    qw( connection constraints conversion convert copy ),
    qw( createdb createrole createuser csv cursor cycle ),
    qw( database day deallocate dec decimal ),
    qw( declare defaults deferred definer delete ),
    qw( delimiter delimiters disable domain double ),
    qw( drop each enable encoding encrypted ),
    qw( escape excluding exclusive execute exists ),
    qw( explain external extract fetch first ),

lib/SQL/Admin/Driver/Pg/Producer.pm  view on Meta::CPAN


######################################################################

our $ESCAPE_ALL_IDENTIFIERS      = 0;
our $ESCAPE_NONRESERVED_KEYWORDS = 0;
our $ESCAPE_SQL_KEYWORDS         = 0;

######################################################################

our %REFERENTIAL_ACTION = (
    cascade   => [ 'CASCADE' ],
    no_action => [ 'NO', 'ACTION' ],
    restrict  => [ 'RESTRICT' ],
    set_null  => [ 'SET', 'NULL' ],
);

######################################################################
######################################################################

sub _escape_identifier {                 # ;
    my ($self, $identifier) = @_;

t/02-driver-base-evaluate.t  view on Meta::CPAN

sub alter_table_foreign_key {            # ;
    my $cat = $CAT->new;

    $evl->evaluate ($cat, {
        alter_table => {
            table_name => { name => 'aaa', 'schema' => 'bbb' },
            alter_table_actions => [ {
                add_constraint => { foreign_key_constraint => {
                    constraint_name  => 'SQL050926155612920',
                    update_rule      => 'no_action',
                    delete_rule      => 'cascade',
                    referenced_table => { schema => 'bbb', name => 'rrr' },
                    referenced_column_list  => [ 'zzz' ],
                    referencing_column_list => [ 'xxx' ]
                } }
            } ],
        }
    });

    {
        ok (exists $cat->{table}{'bbb.aaa'}, 'alter table FK-1: table exists');

t/02-driver-base-evaluate.t  view on Meta::CPAN


        ok ($obj->foreign_key, 'alter table FK-1: foreign_key defined');
        my $map = $obj->foreign_key;
        is (ref $map, 'HASH', 'alter table FK-1: foreign_key is HASH');
        my ($c) = values %$map;

        is ($c->fullname, 'bbb.aaa.foreign_key.xxx{bbb.rrr.zzz}', 'alter table FK-1: fullname');
        is_deeply ($c->referenced_column_list, ['zzz'], 'alter table FK-1: referenced column list');
        is_deeply ($c->referencing_column_list, ['xxx'], 'alter table FK-1: referencing column list');
        is ($c->update_rule => 'no_action', 'alter table FK-1: update rule');
        is ($c->delete_rule => 'cascade', 'alter table FK-1: delete rule');
    }
}


######################################################################
######################################################################
sub alter_table_add_column {             # ;
    my $cat = $CAT->new;

    $evl->evaluate ($cat, {

t/02-driver-db2-parser.t  view on Meta::CPAN

        [ 'NO ACTION'   => 'no_action' ],
    );
}


######################################################################
######################################################################
sub referential_delete_action     : Rule { # ;
    (
        [ 'SET DEFAULT' => undef ],      # not supported by DB2
        [ 'CASCADE'     => 'cascade' ],
        [ 'SET NULL'    => 'set_null' ],
        [ 'RESTRICT'    => 'restrict' ],
        [ 'NO ACTION'   => 'no_action' ],
    );
}


######################################################################
######################################################################
sub update_rule                   : Rule { # ;

t/02-driver-db2-parser.t  view on Meta::CPAN

        [ 'ON UPDATE NO ACTION', { update_rule => 'no_action' } ],
    );
}

######################################################################
######################################################################
sub delete_rule                   : Rule { # ;
    (
        [ 'ON DELETE RESTRICT',  { _ => 'restrict'  } ],
        [ 'ON DELETE NO ACTION', { _ => 'no_action' } ],
        [ 'ON DELETE CASCADE',   { _ => 'cascade'   } ],
        [ 'ON DELETE SET NULL',  { _ => 'set_null'  } ],
    );
}

######################################################################
######################################################################
sub referential_triggered_actions : Rule { # ;
    (
        [ 'on delete cascade'   => { delete_rule => 'cascade'   } ],
        [ 'on update no action' => { update_rule => 'no_action' } ],
        [ 'on delete cascade on update no action' => { delete_rule => 'cascade', update_rule => 'no_action' } ],
        [ 'on update no action on delete cascade' => { delete_rule => 'cascade', update_rule => 'no_action' } ],
    );
}


######################################################################
######################################################################
sub referencing_column_list       : Rule { # ;
    (
        [ '(aaa)',      { _ => [ 'aaa' ]  } ],
        [ '(aaa, bbb)', { _ => [ 'aaa', 'bbb' ] } ],

t/02-driver-db2-parser.t  view on Meta::CPAN

            referenced_column_list => [ 'bbb', 'ccc' ],
        }],
        [ 'REFERENCES aaa (bbb) ENABLE QUERY OPTIMIZATION' => {
            referenced_table  => { name => 'aaa' },
            referenced_column_list => [ 'bbb' ],
        }],
        [ 'REFERENCES aaa (bbb) ON UPDATE RESTRICT ON DELETE CASCADE' => {
            referenced_table  => { name => 'aaa' },
            referenced_column_list => [ 'bbb' ],
            update_rule            => 'restrict',
            delete_rule            => 'cascade',
        }],
    );
}


######################################################################
######################################################################

sub constraint_name_definition    : Rule { # ;
    (

t/02-driver-db2-parser.t  view on Meta::CPAN

sub foreign_key_constraint        : Rule { # ;
    (
        [ 'FOREIGN KEY (aaa) REFERENCES bbb' => { _ => {
            referencing_column_list => [ 'aaa' ],
            referenced_table => { name => 'bbb' },
        }}],
        [ 'FOREIGN KEY (aaa) REFERENCES bbb.ccc (ddd) ON DELETE CASCADE' => { _ => {
            referencing_column_list => [ 'aaa' ],
            referenced_table   => { name => 'ccc', schema => 'bbb' },
            referenced_column_list  => [ 'ddd' ],
            delete_rule             => 'cascade',
        }}],
    );
}


######################################################################
######################################################################
sub table_constraint_definition   : Rule { # ;
    (
        [ 'UNIQUE (aaa)', {

t/02-driver-db2-parser.t  view on Meta::CPAN

            autoincrement => {
                sequence_start_with => 1000,
            },
        }}],
        [ 'aaa INT NOT NULL PRIMARY KEY REFERENCES bbb ON DELETE CASCADE', { _ => {
            column_name => 'aaa',
            data_type   => 'int4',
            column_not_null    => 1,
            column_primary_key => 1,
            referenced_table => { name => 'bbb' },
            delete_rule      => 'cascade',
        }}],
        [ 'aaa GENERATED AS IDENTITY', { _ => {
            column_name => 'aaa',
            autoincrement => {},
        }}],
        [ 'aaa varchar(32) WITH DEFAULT', { _ => {
            column_name => 'aaa',
            data_type   => 'varchar',
            size        => 32,
            default_clause => {},

t/02-driver-db2-parser.t  view on Meta::CPAN

            'ENFORCED ENABLE QUERY OPTIMIZATION',
        )), { _ => {
            table_name => { schema => 'bbb', name => 'aaa' },
            alter_table_actions => [
                { add_constraint => { foreign_key_constraint => {
                    constraint_name => 'ccc',
                    referencing_column_list => [ 'ddd', 'eee' ],
                    referenced_table        => { schema => 'bbb', name => 'fff' },
                    referenced_column_list  => [ 'ggg', 'hhh' ],
                    update_rule             => 'no_action',
                    delete_rule             => 'cascade',
                }}},
            ],
        }} ],


    );
}


sub comment_on                    : Rule { # ;

t/02-driver-db2-producer.t  view on Meta::CPAN

    [ 'add constraint xyz primary key (aaa, bbb)', {
        add_constraint => { primary_key_constraint => {
            constraint_name => 'xyz',
            column_list     => [ 'aaa', 'bbb' ],
        } } } ],
    [ 'add constraint xyz unique (APP_ID, MSISDN)', {
        add_constraint => { unique_constraint => {
            constraint_name => 'xyz',
            column_list     => [ 'APP_ID', 'MSISDN' ],
        } } } ],
    [ 'add constraint xyz foreign key (aaa) references bbb.ccc (ddd) on delete cascade on update no action', {
        add_constraint => { foreign_key_constraint => {
            constraint_name  => 'xyz',
            db2_enforced     => 1,
            db2_optimize     => 0,
            update_rule      => 'no_action',
            delete_rule      => 'cascade',
            referenced_table => { schema => 'bbb', name => 'ccc' },
            referenced_column_list  => [ 'ddd' ],
            referencing_column_list => [ 'aaa' ],
        } } } ],
);

test_products alter_table => (
    [ '', {
        table_name => { schema => 'aaa', name => 'bbb' },
        alter_table_actions => [

t/02-driver-pg-parser.t  view on Meta::CPAN

        [ 'default \'\''              => { _ => { string => '' } } ],
        [ 'default \'2042-04-02\''    => { _ => { string => '2042-04-02' } } ],
    );
}


######################################################################
######################################################################
sub referential_action            : Rule { # ;
    (
        [ 'CASCADE'     => 'cascade' ],
        [ 'SET NULL'    => 'set_null' ],
        [ 'SET DEFAULT' => 'set_default' ],
        [ 'RESTRICT'    => 'restrict' ],
        [ 'NO ACTION'   => 'no_action' ],
    );
}


######################################################################
######################################################################

sub update_rule                   : Rule { # ;
    (
        [ 'ON UPDATE RESTRICT',    { _ => 'restrict' } ],
        [ 'ON UPDATE NO ACTION',   { _ => 'no_action' } ],
        [ 'ON UPDATE CASCADE',     { _ => 'cascade'   } ],
        [ 'ON UPDATE SET NULL',    { _ => 'set_null'  } ],
        [ 'ON UPDATE SET DEFAULT', { _ => 'set_default'  } ],
    );
}

######################################################################
######################################################################
sub delete_rule                   : Rule { # ;
    (
        [ 'ON DELETE RESTRICT',    { _ => 'restrict'  } ],
        [ 'ON DELETE NO ACTION',   { _ => 'no_action' } ],
        [ 'ON DELETE CASCADE',     { _ => 'cascade'   } ],
        [ 'ON DELETE SET NULL',    { _ => 'set_null'  } ],
        [ 'ON DELETE SET DEFAULT', { _ => 'set_default'  } ],
    );
}

######################################################################
######################################################################
sub referential_triggered_actions : Rule { # ;
    (
        [ 'on delete cascade'   => { delete_rule => 'cascade'   } ],
        [ 'on update no action' => { update_rule => 'no_action' } ],
        [ 'on delete cascade on update no action' => { delete_rule => 'cascade', update_rule => 'no_action' } ],
        [ 'on update no action on delete cascade' => { delete_rule => 'cascade', update_rule => 'no_action' } ],
    );
}


######################################################################
######################################################################
sub referenced_table_and_columns  : Rule { # ;
    (
        [ 'aaa' => { referenced_table => { name => 'aaa' } }],
        [ 'aaa (bbb, ccc)' => {

t/02-driver-pg-parser.t  view on Meta::CPAN

            referenced_column_list => [ 'bbb', 'ccc' ],
        }],
        [ 'REFERENCES aaa (bbb)' => {
            referenced_table  => { name => 'aaa' },
            referenced_column_list => [ 'bbb' ],
        }],
        [ 'REFERENCES aaa (bbb) ON UPDATE RESTRICT ON DELETE CASCADE' => {
            referenced_table  => { name => 'aaa' },
            referenced_column_list => [ 'bbb' ],
            update_rule            => 'restrict',
            delete_rule            => 'cascade',
        }],
    );
}


######################################################################
######################################################################
sub constraint_name_definition    : Rule { # ;
    (
        [ 'CONSTRAINT aaa',      { constraint_name => 'aaa' } ],

t/02-driver-pg-parser.t  view on Meta::CPAN

sub foreign_key_constraint        : Rule { # ;
    (
        [ 'FOREIGN KEY (refid) REFERENCES aaa' => { _ => {
            referencing_column_list => [ 'refid' ],
            referenced_table => { name => 'aaa' },
        }}],
        [ 'FOREIGN KEY (aaa_id) REFERENCES bbb.aaa (ccc, ddd) ON DELETE CASCADE' => { _ => {
            referencing_column_list => [ 'aaa_id' ],
            referenced_table   => { name => 'aaa', schema => 'bbb' },
            referenced_column_list  => [ 'ccc', 'ddd' ],
            delete_rule             => 'cascade',
        }}],
    );
}


######################################################################
######################################################################
sub constraint_characteristics    : Rule { # ;
    (
        [ 'DEFERRABLE' => { constraint_deferrable => 1 } ],

t/02-driver-pg-parser.t  view on Meta::CPAN

            data_type       => 'int4',
            column_not_null => 0,
            autoincrement   => {},
        }}],
        [ 'aaa INT NOT NULL PRIMARY KEY REFERENCES bbb ON DELETE CASCADE', { _ => {
            column_name => 'aaa',
            data_type   => 'int4',
            column_not_null    => 1,
            column_primary_key => 1,
            referenced_table => { name => 'bbb' },
            delete_rule      => 'cascade',
        }}],
        [ 'aaa bigserial', { _ => {
            column_name => 'aaa',
            data_type   => 'int8',
            autoincrement => {},
        }}],
        [ 'aaa varchar(32) DEFAULT NULL', { _ => {
            column_name => 'aaa',
            data_type   => 'varchar',
            size        => 32,

t/02-driver-pg-parser.t  view on Meta::CPAN


######################################################################
######################################################################
sub drop_column                   : Rule { # ; Pg
    (
        [ 'DROP aaa' => { _ => { column_name => 'aaa' }}],
        [ 'DROP COLUMN aaa' => { _ => { column_name => 'aaa' }}],
        [ 'DROP IF EXISTS aaa' => { _ => { column_name => 'aaa', if_exists => 1 }}],
        [ 'DROP COLUMN IF EXISTS aaa' => { _ => { column_name => 'aaa', if_exists => 1 }}],
        [ 'DROP aaa RESTRICT' => { _ => { column_name => 'aaa', drop_column_restriction => 'restrict', }}],
        [ 'DROP aaa CASCADE'  => { _ => { column_name => 'aaa', drop_column_restriction => 'cascade', }}],
    );
}


######################################################################
######################################################################
sub alter_column_set_data_type    : Rule { # ; Pg; incomplete; TODO: USING expression
    (
        [ 'TYPE int' => { _ => { data_type => 'int4' }}],
        [ 'SET DATA TYPE int' => { _ => { data_type => 'int4' }}],



( run in 0.662 second using v1.01-cache-2.11-cpan-49f99fa48dc )