[Bps-public-commit] dbix-searchbuilder branch driver-mariadb created. 1.79-4-gf316709

BPS Git Server git at git.bestpractical.com
Fri Jan 5 22:06:13 UTC 2024


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "dbix-searchbuilder".

The branch, driver-mariadb has been created
        at  f31670918dce989dc535fdeff7a9177ba0370493 (commit)

- Log -----------------------------------------------------------------
commit f31670918dce989dc535fdeff7a9177ba0370493
Author: Jim Brandt <jbrandt at bestpractical.com>
Date:   Fri Jan 5 17:03:38 2024 -0500

    Add explicit support for MariaDB in addition to MySQL
    
    Starting with version 5.001, DBD::mysql will no longer support
    MariaDB. Add explicit support in DBIx::SearchBuilder for
    MariaDB and DBD::MariaDB independent of mysql and DBD::mysql.

diff --git a/lib/DBIx/SearchBuilder/Handle/MariaDB.pm b/lib/DBIx/SearchBuilder/Handle/MariaDB.pm
new file mode 100755
index 0000000..fcba526
--- /dev/null
+++ b/lib/DBIx/SearchBuilder/Handle/MariaDB.pm
@@ -0,0 +1,376 @@
+package DBIx::SearchBuilder::Handle::MariaDB;
+
+use strict;
+use warnings;
+use version;
+
+use base qw(DBIx::SearchBuilder::Handle);
+
+=head1 NAME
+
+  DBIx::SearchBuilder::Handle::MariaDB - A MariaDB specific Handle object
+
+=head1 SYNOPSIS
+
+
+=head1 DESCRIPTION
+
+This module provides a subclass of DBIx::SearchBuilder::Handle that 
+compensates for some of the idiosyncrasies of MySQL.
+
+=head1 METHODS
+
+=head2 Insert
+
+Takes a table name as the first argument and assumes that the rest of the arguments are an array of key-value pairs to be inserted.
+
+If the insert succeeds, returns the id of the insert, otherwise, returns
+a Class::ReturnValue object with the error reported.
+
+=cut
+
+sub Insert  {
+    my $self = shift;
+
+    my $sth = $self->SUPER::Insert(@_);
+    if (!$sth) {
+        return ($sth);
+    }
+
+    # Follow the advice in the docs and use last_insert_id rather than
+    # {'mariadb_insertid'}.
+    #
+    # https://metacpan.org/dist/DBD-MariaDB/view/lib/DBD/MariaDB.pod#mariadb_insertid
+
+    $self->{'id'}=$self->dbh->last_insert_id();
+
+    # Docs say last_insert_id could still return undef, so keeping this code
+    unless ($self->{'id'}) {
+        $self->{'id'} =  $self->FetchResult('SELECT LAST_INSERT_ID()');
+    }
+    warn "$self no row id returned on row creation" unless ($self->{'id'});
+
+    return( $self->{'id'}); #Add Succeded. return the id
+}
+
+=head2 SimpleUpdateFromSelect
+
+Customization of L<DBIx::SearchBuilder::Handle/SimpleUpdateFromSelect>.
+Mysql doesn't support update with subqueries when those fetch data from
+the table that is updated.
+
+=cut
+
+sub SimpleUpdateFromSelect {
+    my ($self, $table, $values, $query, @query_binds) = @_;
+
+    return $self->SUPER::SimpleUpdateFromSelect(
+        $table, $values, $query, @query_binds
+    ) unless $query =~ /\b\Q$table\E\b/i;
+
+    my $sth = $self->SimpleQuery( $query, @query_binds );
+    return $sth unless $sth;
+
+    my (@binds, @columns);
+    for my $k (sort keys %$values) {
+        push @columns, $k;
+        push @binds, $values->{$k};
+    }
+
+    $table = $self->QuoteName($table) if $self->{'QuoteTableNames'};
+    my $update_query = "UPDATE $table SET "
+        . join( ', ', map "$_ = ?", @columns )
+        .' WHERE ID IN ';
+
+    return $self->SimpleMassChangeFromSelect(
+        $update_query, \@binds,
+        $query, @query_binds
+    );
+}
+
+
+sub DeleteFromSelect {
+    my ($self, $table, $query, @query_binds) = @_;
+
+    return $self->SUPER::DeleteFromSelect(
+        $table, $query, @query_binds
+    ) unless $query =~ /\b\Q$table\E\b/i;
+
+    $table = $self->QuoteName($table) if $self->{'QuoteTableNames'};
+    return $self->SimpleMassChangeFromSelect(
+        "DELETE FROM $table WHERE id IN ", [],
+        $query, @query_binds
+    );
+}
+
+sub SimpleMassChangeFromSelect {
+    my ($self, $update_query, $update_binds, $search, @search_binds) = @_;
+
+    my $sth = $self->SimpleQuery( $search, @search_binds );
+    return $sth unless $sth;
+
+
+    # tried TEMPORARY tables, much slower than fetching and delete
+    # also size of ENGINE=MEMORY is limitted by option, on disk
+    # tables more slower than in memory
+    my $res = 0;
+
+    my @ids;
+    while ( my $id = ($sth->fetchrow_array)[0] ) {
+        push @ids, $id;
+        next if @ids < 1000;
+
+        my $q = $update_query .'('. join( ',', ('?')x at ids ) .')';
+        my $sth = $self->SimpleQuery( $q, @$update_binds, splice @ids );
+        return $sth unless $sth;
+
+        $res += $sth->rows;
+    }
+    if ( @ids ) {
+        my $q = $update_query .'('. join( ',', ('?')x at ids ) .')';
+        my $sth = $self->SimpleQuery( $q, @$update_binds, splice @ids );
+        return $sth unless $sth;
+
+        $res += $sth->rows;
+    }
+    return $res == 0? '0E0': $res;
+}
+
+=head2 DatabaseVersion
+
+Returns the MariaDB version, trimming off any -foo identifier
+
+=cut
+
+sub DatabaseVersion {
+    my $self = shift;
+    my $v = $self->SUPER::DatabaseVersion();
+
+    $v =~ s/\-.*$//;
+    return ($v);
+}
+
+=head2 CaseSensitive
+
+Returns undef, since MariaDB's searches are not case sensitive by default
+
+=cut
+
+sub CaseSensitive {
+    my $self = shift;
+    return(undef);
+}
+
+sub DistinctQuery {
+    my $self = shift;
+    my $statementref = shift;
+    my $sb = shift;
+
+    return $self->SUPER::DistinctQuery( $statementref, $sb, @_ )
+        if $sb->_OrderClause !~ /(?<!main)\./;
+
+    if ( substr($self->DatabaseVersion, 0, 1) == 4 ) {
+        local $sb->{'group_by'} = [{FIELD => 'id'}];
+
+        my ($idx, @tmp, @specials) = (0, ());
+        foreach ( @{$sb->{'order_by'}} ) {
+            if ( !exists $_->{'ALIAS'} || ($_->{'ALIAS'}||'') eq "main" ) {
+                push @tmp, $_; next;
+            }
+
+            push @specials,
+                ((($_->{'ORDER'}||'') =~ /^des/i)?'MAX':'MIN')
+                ."(". $_->{'ALIAS'} .".". $_->{'FIELD'} .")"
+                ." __special_sort_$idx";
+            push @tmp, { ALIAS => '', FIELD => "__special_sort_$idx", ORDER => $_->{'ORDER'} };
+            $idx++;
+        }
+
+        local $sb->{'order_by'} = \@tmp;
+        $$statementref = "SELECT ". join( ", ", 'main.*', @specials ) ." FROM $$statementref";
+        $$statementref .= $sb->_GroupClause;
+        $$statementref .= $sb->_OrderClause;
+    } else {
+        local $sb->{'group_by'} = [{FIELD => 'id'}];
+        local $sb->{'order_by'} = [
+            map {
+                ($_->{'ALIAS'}||'') ne "main"
+                ? { %{$_}, FIELD => ((($_->{'ORDER'}||'') =~ /^des/i)?'MAX':'MIN') ."(".$_->{FIELD}.")" }
+                : $_
+            }
+            @{$sb->{'order_by'}}
+        ];
+        $$statementref = "SELECT main.* FROM $$statementref";
+        $$statementref .= $sb->_GroupClause;
+        $$statementref .= $sb->_OrderClause;
+    }
+}
+
+sub Fields {
+    my $self  = shift;
+    my $table = shift;
+
+    my $cache = \%DBIx::SearchBuilder::Handle::FIELDS_IN_TABLE;
+    unless ( $cache->{ lc $table } ) {
+        my $sth = $self->dbh->column_info( undef, undef, $table, '%' )
+            or return ();
+        my $info = $sth->fetchall_arrayref({});
+        foreach my $e ( sort {$a->{'ORDINAL_POSITION'} <=> $b->{'ORDINAL_POSITION'}} @$info ) {
+            push @{ $cache->{ lc $e->{'TABLE_NAME'} } ||= [] }, lc $e->{'COLUMN_NAME'};
+        }
+    }
+    return @{ $cache->{ lc $table } || [] };
+}
+
+=head2 SimpleDateTimeFunctions
+
+Returns hash reference with specific date time functions of this
+database for L<DBIx::SearchBuilder::Handle/DateTimeFunction>.
+
+=cut
+
+sub SimpleDateTimeFunctions {
+    my $self = shift;
+    return $self->{'_simple_date_time_functions'} ||= {
+        %{ $self->SUPER::SimpleDateTimeFunctions(@_) },
+        datetime   => '?',
+        time       => 'TIME(?)',
+
+        hourly     => "DATE_FORMAT(?, '%Y-%m-%d %H')",
+        hour       => 'HOUR(?)',
+
+        date       => 'DATE(?)',
+        daily      => 'DATE(?)',
+
+        day        => 'DAYOFMONTH(?)',
+        dayofmonth => 'DAYOFMONTH(?)',
+
+        monthly    => "DATE_FORMAT(?, '%Y-%m')",
+        month      => 'MONTH(?)',
+
+        annually   => 'YEAR(?)',
+        year       => 'YEAR(?)',
+
+        dayofweek  => "DAYOFWEEK(?) - 1", # 1-7, 1 - Sunday
+        dayofyear  => "DAYOFYEAR(?)", # 1-366
+        weekofyear => "WEEK(?)", # skip mode argument, so it can be controlled in MariaDB config
+    };
+}
+
+
+=head2 ConvertTimezoneFunction
+
+Custom implementation of L<DBIx::SearchBuilder::Handle/ConvertTimezoneFunction>.
+
+Use the following query to get list of timezones:
+
+    SELECT Name FROM mysql.time_zone_name;
+
+See also details on how MariaDB works with mysql timezone tables
+
+    https://mariadb.com/kb/en/time-zones/
+
+=cut
+
+sub ConvertTimezoneFunction {
+    my $self = shift;
+    my %args = (
+        From  => 'UTC',
+        To    => undef,
+        Field => '',
+        @_
+    );
+    return $args{'Field'} unless $args{From} && $args{'To'};
+    return $args{'Field'} if lc $args{From} eq lc $args{'To'};
+    my $dbh = $self->dbh;
+    $_ = $dbh->quote( $_ ) foreach @args{'From', 'To'};
+    return "CONVERT_TZ( $args{'Field'}, $args{'From'}, $args{'To'} )";
+}
+
+sub _DateTimeIntervalFunction {
+    my $self = shift;
+    my %args = ( From => undef, To => undef, @_ );
+
+    return "TIMESTAMPDIFF(SECOND, $args{'From'}, $args{'To'})";
+}
+
+
+=head2 QuoteName
+
+Quote table or column name to avoid reserved word errors.
+
+=cut
+
+# over-rides inherited method
+sub QuoteName {
+    my ($self, $name) = @_;
+    # use dbi built in quoting if we have a connection,
+    if ($self->dbh) {
+        return $self->SUPER::QuoteName($name);
+    }
+
+    return sprintf('`%s`', $name);
+}
+
+sub DequoteName {
+    my ($self, $name) = @_;
+
+    # If we have a handle, the base class can do it for us
+    if ($self->dbh) {
+        return $self->SUPER::DequoteName($name);
+    }
+
+    if ($name =~ /^`(.*)`$/) {
+        return $1;
+    }
+    return $name;
+}
+
+sub _ExtractBindValues {
+    my $self  = shift;
+    my $value = shift;
+    return $self->SUPER::_ExtractBindValues( $value, '\\' );
+}
+
+sub _IsMariaDB {
+    my $self = shift;
+
+    # We override DatabaseVersion to chop off "-MariaDB-whatever", so
+    # call super here to get the original version
+    my $v = $self->SUPER::DatabaseVersion();
+
+    return ($v =~ /mariadb/i);
+}
+
+sub _RequireQuotedTables {
+    my $self = shift;
+
+    # MariaDB version does not match mysql, and hasn't added new reserved words
+    # like "groups".
+    return 0;
+}
+
+=head2 HasSupportForCombineSearchAndCount
+
+MariaDB 10.2+ supports this.
+
+=cut
+
+sub HasSupportForCombineSearchAndCount {
+    my $self = shift;
+    my ($version) = $self->DatabaseVersion =~ /^(\d+\.\d+)/;
+
+    return (version->parse('v'.$version) >= version->parse('v10.2')) ? 1 : 0;
+}
+
+sub CastAsDecimal {
+    my $self  = shift;
+    my $field = shift or return;
+
+    # CAST($field AS DECIMAL) rounds values to integers by default. It supports
+    # specific precisions like CAST($field AS DECIMAL(5,2)), but we don't know
+    # the precisions in advance. +0 works like other dbs.
+    return "($field+0)";
+}
+
+1;
diff --git a/t/00.load.t b/t/00.load.t
index cfc6dcb..c03ba27 100644
--- a/t/00.load.t
+++ b/t/00.load.t
@@ -1,4 +1,4 @@
-use Test::More tests => 12;
+use Test::More tests => 13;
 
 BEGIN { use_ok("DBIx::SearchBuilder"); }
 BEGIN { use_ok("DBIx::SearchBuilder::Handle"); }
@@ -19,4 +19,4 @@ BEGIN { use_ok("DBIx::SearchBuilder::Handle::Sybase"); }
 BEGIN { use_ok("DBIx::SearchBuilder::Handle::SQLite"); }
 BEGIN { use_ok("DBIx::SearchBuilder::Record"); }
 BEGIN { use_ok("DBIx::SearchBuilder::Record::Cachable"); }
-
+BEGIN { use_ok("DBIx::SearchBuilder::Handle::MariaDB"); }
diff --git a/t/01records.t b/t/01records.t
index dd143ca..c175267 100644
--- a/t/01records.t
+++ b/t/01records.t
@@ -270,6 +270,18 @@ EOF
 
 }
 
+sub schema_mariadb {
+<<EOF;
+CREATE TEMPORARY TABLE Address (
+        id integer AUTO_INCREMENT,
+        Name varchar(36),
+        Phone varchar(18),
+        EmployeeId int(8),
+  	PRIMARY KEY (id)) CHARACTER SET utf8mb4
+EOF
+
+}
+
 sub schema_pg {
 <<EOF;
 CREATE TEMPORARY TABLE Address (
diff --git a/t/01searches.t b/t/01searches.t
index 3320061..a7addbe 100644
--- a/t/01searches.t
+++ b/t/01searches.t
@@ -479,6 +479,21 @@ sub cleanup_schema_mysql { [
     "DROP TABLE Users", 
 ] }
 
+sub schema_mariadb {[
+	"DROP TABLE IF EXISTS Users",
+<<EOF
+CREATE TABLE Users (
+        id integer AUTO_INCREMENT,
+        Login varchar(18) NOT NULL,
+        Name varchar(36),
+	Phone varchar(18),
+  	PRIMARY KEY (id))
+EOF
+]}
+sub cleanup_schema_mariadb { [
+    "DROP TABLE Users", 
+] }
+
 sub schema_pg {
 <<EOF;
 CREATE TEMPORARY TABLE Users (
diff --git a/t/02distinct_values.t b/t/02distinct_values.t
index 826db21..59d0d85 100644
--- a/t/02distinct_values.t
+++ b/t/02distinct_values.t
@@ -88,6 +88,17 @@ EOF
 
 }
 
+sub schema_mariadb {
+<<EOF;
+CREATE TEMPORARY TABLE Users (
+        id integer AUTO_INCREMENT,
+        Login varchar(18) NOT NULL,
+        GroupName varchar(36),
+  	PRIMARY KEY (id))
+EOF
+
+}
+
 sub schema_pg {
 <<EOF;
 CREATE TEMPORARY TABLE Users (
diff --git a/t/02null_order.t b/t/02null_order.t
index fab111d..6bdea9e 100644
--- a/t/02null_order.t
+++ b/t/02null_order.t
@@ -110,6 +110,20 @@ sub cleanup_schema_mysql { [
     "DROP TABLE Users", 
 ] }
 
+sub schema_mariadb {[
+    "DROP TABLE IF EXISTS Users",
+<<EOF
+CREATE TABLE Users (
+    id integer AUTO_INCREMENT,
+    Value integer,
+    PRIMARY KEY (id)
+)
+EOF
+]}
+sub cleanup_schema_mariadb { [
+    "DROP TABLE Users", 
+] }
+
 sub schema_pg {
 <<EOF;
 CREATE TEMPORARY TABLE Users (
diff --git a/t/02order.t b/t/02order.t
index e1eff21..677d8eb 100644
--- a/t/02order.t
+++ b/t/02order.t
@@ -57,7 +57,7 @@ diag "generate data" if $ENV{TEST_VERBOSE};
 
 my @fields = (
     'Name',
-    $d eq 'Oracle' ? 'TO_CHAR(Name)' : $d eq 'mysql' ? 'BINARY(Name)' : 'CAST(Name AS TEXT)'
+    $d eq 'Oracle' ? 'TO_CHAR(Name)' : ($d eq 'mysql' || $d eq 'MariaDB') ? 'BINARY(Name)' : 'CAST(Name AS TEXT)'
 );
 
 diag "test ordering objects by fields on Tags table" if $ENV{TEST_VERBOSE};
@@ -172,6 +172,21 @@ sub schema_mysql { [
     "CREATE INDEX Tags1 ON Tags (Name)"
 ] }
 
+sub schema_mariadb { [
+    "CREATE TEMPORARY TABLE Objects (
+        id integer AUTO_INCREMENT,
+        Name varchar(36),
+      	PRIMARY KEY (id)
+    )",
+    "CREATE TEMPORARY TABLE Tags (
+        id integer AUTO_INCREMENT,
+        Object integer NOT NULL,
+        Name varchar(36),
+      	PRIMARY KEY (id)
+    )",
+    "CREATE INDEX Tags1 ON Tags (Name)"
+] }
+
 sub schema_pg { [
     "CREATE TEMPORARY TABLE Objects (
         id serial PRIMARY KEY,
diff --git a/t/02records_cachable.t b/t/02records_cachable.t
index 9418990..69546a1 100644
--- a/t/02records_cachable.t
+++ b/t/02records_cachable.t
@@ -106,6 +106,18 @@ EOF
 
 }
 
+sub schema_mariadb {
+<<EOF;
+CREATE TEMPORARY TABLE Address (
+        id integer AUTO_INCREMENT,
+        Name varchar(36),
+        Phone varchar(18),
+        EmployeeId int(8),
+  	PRIMARY KEY (id))
+EOF
+
+}
+
 sub schema_pg {
 <<EOF;
 CREATE TEMPORARY TABLE Address (
diff --git a/t/02records_datetime.t b/t/02records_datetime.t
index 6882729..ddbae31 100644
--- a/t/02records_datetime.t
+++ b/t/02records_datetime.t
@@ -49,7 +49,7 @@ SKIP: {
         my ($got) = $handle->dbh->selectrow_array("SELECT datetime(?,'localtime')", undef, $check);
         $skip_tz_tests = 1 if $got eq $check;
     }
-    elsif ($d eq 'mysql') {
+    elsif ( $d eq 'mysql' || $d eq 'MariaDB' ) {
         my $check = '2013-04-01 16:00:00';
         my ($got) = $handle->dbh->selectrow_array(
             "SELECT CONVERT_TZ(?, ?, ?)", undef, $check, 'UTC', 'Europe/Moscow'
@@ -289,6 +289,17 @@ EOF
 
 }
 
+sub schema_mariadb {
+<<EOF;
+CREATE TEMPORARY TABLE Users (
+    id integer AUTO_INCREMENT,
+    Expires DATETIME NULL,
+    PRIMARY KEY (id)
+)
+EOF
+
+}
+
 sub schema_pg {
 <<EOF;
 CREATE TEMPORARY TABLE Users (
diff --git a/t/02records_dt_interval.t b/t/02records_dt_interval.t
index fa5abbf..f08ea50 100644
--- a/t/02records_dt_interval.t
+++ b/t/02records_dt_interval.t
@@ -94,6 +94,19 @@ EOF
 
 }
 
+sub schema_mariadb {
+<<EOF;
+CREATE TEMPORARY TABLE Users (
+    id integer AUTO_INCREMENT,
+    Created DATETIME NULL,
+    Resolved DATETIME NULL,
+    Result integer NULL,
+    PRIMARY KEY (id)
+)
+EOF
+
+}
+
 sub schema_pg {
 <<EOF;
 CREATE TEMPORARY TABLE Users (
diff --git a/t/02records_integers.t b/t/02records_integers.t
index 95b8504..5ec2382 100644
--- a/t/02records_integers.t
+++ b/t/02records_integers.t
@@ -148,6 +148,17 @@ EOF
 
 }
 
+sub schema_mariadb {
+<<EOF;
+CREATE TEMPORARY TABLE MyTable (
+        id integer PRIMARY KEY AUTO_INCREMENT,
+        Optional integer NULL,
+        Mandatory integer NOT NULL DEFAULT 1
+)
+EOF
+
+}
+
 sub schema_pg {
 <<EOF;
 CREATE TEMPORARY TABLE MyTable (
diff --git a/t/02records_object.t b/t/02records_object.t
index 34576db..4799fe8 100644
--- a/t/02records_object.t
+++ b/t/02records_object.t
@@ -88,6 +88,21 @@ CREATE TEMPORARY TABLE Phones (
 } ]
 }
 
+sub schema_mariadb {
+[ q{
+CREATE TEMPORARY TABLE Employees (
+	id integer AUTO_INCREMENT primary key,
+	Name varchar(36)
+)
+}, q{
+CREATE TEMPORARY TABLE Phones (
+	id integer AUTO_INCREMENT primary key,
+	Employee integer NOT NULL,
+	Phone varchar(18)
+)
+} ]
+}
+
 sub schema_pg {
 [ q{
 CREATE TEMPORARY TABLE Employees (
diff --git a/t/02searches_function.t b/t/02searches_function.t
index e9a25a9..94f5d4c 100644
--- a/t/02searches_function.t
+++ b/t/02searches_function.t
@@ -190,6 +190,28 @@ CREATE TEMPORARY TABLE `Groups` (
 ]
 }
 
+sub schema_mariadb {
+[
+q{
+CREATE TEMPORARY TABLE Users (
+    id integer primary key AUTO_INCREMENT,
+    Login varchar(36),
+    DeptNumber varchar(36)
+) },
+q{
+CREATE TEMPORARY TABLE UsersToGroups (
+    id integer primary key AUTO_INCREMENT,
+    UserId  integer,
+    GroupId integer
+) },
+q{
+CREATE TEMPORARY TABLE `Groups` (
+    id integer primary key AUTO_INCREMENT,
+    Name varchar(36)
+) },
+]
+}
+
 sub schema_pg {
 [
 q{
diff --git a/t/02searches_joins.t b/t/02searches_joins.t
index cbec237..64b86cc 100644
--- a/t/02searches_joins.t
+++ b/t/02searches_joins.t
@@ -343,6 +343,27 @@ CREATE TEMPORARY TABLE `Groups` (
 ]
 }
 
+sub schema_mariadb {
+[
+q{
+CREATE TEMPORARY TABLE Users (
+    id integer primary key AUTO_INCREMENT,
+    Login varchar(36)
+) },
+q{
+CREATE TEMPORARY TABLE UsersToGroups (
+    id integer primary key AUTO_INCREMENT,
+    UserId  integer,
+    GroupId integer
+) },
+q{
+CREATE TEMPORARY TABLE `Groups` (
+    id integer primary key AUTO_INCREMENT,
+    Name varchar(36)
+) },
+]
+}
+
 sub schema_pg {
 [
 q{
diff --git a/t/03cud_from_select.t b/t/03cud_from_select.t
index 9f1aed4..aa2b6d9 100644
--- a/t/03cud_from_select.t
+++ b/t/03cud_from_select.t
@@ -184,6 +184,33 @@ sub cleanup_schema_mysql { [
     "DROP TABLE UsersToGroups", 
 ] }
 
+# TEMPORARY tables can not be referenced more than once
+# in the same query, use real table for UsersToGroups
+sub schema_mariadb {
+[
+q{
+CREATE TEMPORARY TABLE Users (
+    id integer primary key AUTO_INCREMENT,
+    Login varchar(36)
+) },
+q{
+CREATE TABLE UsersToGroups (
+    id integer primary key AUTO_INCREMENT,
+    UserId  integer,
+    GroupId integer
+) },
+q{
+CREATE TEMPORARY TABLE `Groups` (
+    id integer primary key AUTO_INCREMENT,
+    Name varchar(36)
+) },
+]
+}
+
+sub cleanup_schema_mariadb { [
+    "DROP TABLE UsersToGroups", 
+] }
+
 sub schema_pg {
 [
 q{
diff --git a/t/03searches_bind.t b/t/03searches_bind.t
index 30d4739..05de4e6 100644
--- a/t/03searches_bind.t
+++ b/t/03searches_bind.t
@@ -189,6 +189,26 @@ CREATE TEMPORARY TABLE `Groups` (
     ]
 }
 
+sub schema_mariadb {
+    [   q{
+CREATE TEMPORARY TABLE Users (
+    id integer primary key AUTO_INCREMENT,
+    Login varchar(36)
+) },
+        q{
+CREATE TEMPORARY TABLE UsersToGroups (
+    id integer primary key AUTO_INCREMENT,
+    UserId  integer,
+    GroupId integer
+) },
+        q{
+CREATE TEMPORARY TABLE `Groups` (
+    id integer primary key AUTO_INCREMENT,
+    Name varchar(36)
+) },
+    ]
+}
+
 sub schema_pg {
     [   q{
 CREATE TEMPORARY TABLE Users (
diff --git a/t/03searches_combine.t b/t/03searches_combine.t
index 3b28c5d..8250abe 100644
--- a/t/03searches_combine.t
+++ b/t/03searches_combine.t
@@ -141,6 +141,26 @@ CREATE TEMPORARY TABLE `Groups` (
     ]
 }
 
+sub schema_mariadb {
+    [   q{
+CREATE TEMPORARY TABLE Users (
+    id integer primary key AUTO_INCREMENT,
+    Login varchar(36)
+) },
+        q{
+CREATE TEMPORARY TABLE UsersToGroups (
+    id integer primary key AUTO_INCREMENT,
+    UserId  integer,
+    GroupId integer
+) },
+        q{
+CREATE TEMPORARY TABLE `Groups` (
+    id integer primary key AUTO_INCREMENT,
+    Name varchar(36)
+) },
+    ]
+}
+
 sub schema_pg {
     [   q{
 CREATE TEMPORARY TABLE Users (
diff --git a/t/03transactions.t b/t/03transactions.t
index ef0f973..fe68a9f 100644
--- a/t/03transactions.t
+++ b/t/03transactions.t
@@ -170,6 +170,18 @@ EOF
 
 }
 
+sub schema_mariadb {
+<<EOF;
+CREATE TEMPORARY TABLE Address (
+        id integer AUTO_INCREMENT,
+        Name varchar(36),
+        Phone varchar(18),
+        EmployeeId int(8),
+  	PRIMARY KEY (id)) ENGINE='InnoDB'
+EOF
+
+}
+
 sub schema_pg {
 <<EOF;
 CREATE TEMPORARY TABLE Address (
diff --git a/t/11schema_records.t b/t/11schema_records.t
index 313f127..5d83a78 100644
--- a/t/11schema_records.t
+++ b/t/11schema_records.t
@@ -235,6 +235,26 @@ q{CREATE TEMPORARY TABLE `Groups` (
 ]
 }
 
+sub schema_mariadb {
+[ q{
+CREATE TEMPORARY TABLE Employees (
+	id integer AUTO_INCREMENT primary key,
+	Name varchar(36)
+)
+}, q{
+CREATE TEMPORARY TABLE Phones (
+	id integer AUTO_INCREMENT primary key,
+	Employee integer NOT NULL,
+	Phone varchar(18)
+)
+},
+q{CREATE TEMPORARY TABLE `Groups` (
+	id integer AUTO_INCREMENT primary key,
+	Name varchar(36)
+) }
+]
+}
+
 sub schema_pg {
 [ q{
 CREATE TEMPORARY TABLE Employees (
diff --git a/t/20set_edge_cases.t b/t/20set_edge_cases.t
index d22b1ee..ee0651e 100644
--- a/t/20set_edge_cases.t
+++ b/t/20set_edge_cases.t
@@ -104,6 +104,17 @@ EOF
 
 }
 
+sub schema_mariadb {
+    <<EOF;
+CREATE TEMPORARY TABLE Address (
+        id integer AUTO_INCREMENT,
+        Name varchar(36) NOT NULL,
+        Counter int(8) NOT NULL,
+  	PRIMARY KEY (id))
+EOF
+
+}
+
 sub schema_pg {
     <<EOF;
 CREATE TEMPORARY TABLE Address (
diff --git a/t/utils.pl b/t/utils.pl
index e21e3f9..fc1a9bf 100644
--- a/t/utils.pl
+++ b/t/utils.pl
@@ -12,14 +12,15 @@ Array of all supported DBD drivers.
 =cut
 
 our @SupportedDrivers = qw(
-	Informix
-	mysql
-	mysqlPP
-	ODBC
-	Oracle
-	Pg
-	SQLite
-	Sybase
+    Informix
+    MariaDB
+    mysql
+    mysqlPP
+    ODBC
+    Oracle
+    Pg
+    SQLite
+    Sybase
 );
 
 =head2 @AvailableDrivers
@@ -117,6 +118,19 @@ sub connect_mysql
 	);
 }
 
+sub connect_mariadb
+{
+    my $handle = shift;
+    return $handle->Connect(
+        Driver => 'MariaDB',
+        Database => $ENV{'SB_TEST_MARIADB'},
+        Host => $ENV{'SB_TEST_MARIADB_HOST'},
+        Port => $ENV{'SB_TEST_MARIADB_PORT'},
+        User => $ENV{'SB_TEST_MARIADB_USER'} || 'root',
+        Password => $ENV{'SB_TEST_MARIADB_PASS'} || '',
+    );
+}
+
 sub connect_pg
 {
 	my $handle = shift;

-----------------------------------------------------------------------


hooks/post-receive
-- 
dbix-searchbuilder


More information about the Bps-public-commit mailing list