@@ -2139,7 +2139,7 @@ sub get_keys {
2139
2139
my $clustered_key = undef ;
2140
2140
2141
2141
KEY:
2142
- foreach my $key ( $ddl =~ m / ^ ((?:[A-Z]+ )?KEY [\s\S ]*?)$ / gm ) {
2142
+ foreach my $key ( $ddl =~ m / ^ ((?:[A-Z]+ )?KEY [\s\S ]*?\) ,?.* )$ / gm ) {
2143
2143
next KEY if $key =~ m / FOREIGN/ ;
2144
2144
2145
2145
my $key_ddl = $key ;
@@ -2149,7 +2149,7 @@ sub get_keys {
2149
2149
$key =~ s / USING HASH/ USING BTREE/ ;
2150
2150
}
2151
2151
2152
- my ( $type , $cols ) = $key =~ m / (?:USING (\w +))? \( ([\s\S ]+)\) / ;
2152
+ my ( $type , $cols ) = $key =~ m / (?:USING (\w +))? \( ([\s\S ]+)\) / ;
2153
2153
my ( $special ) = $key =~ m / (FULLTEXT|SPATIAL)/ ;
2154
2154
$type = $type || $special || ' BTREE' ;
2155
2155
my ($name ) = $key =~ m / (PRIMARY|`[^`]*`)/ ;
@@ -3220,7 +3220,7 @@ sub generate_cmp_where {
3220
3220
push @clause , " ($val IS NULL OR $quo $type $val )" ;
3221
3221
}
3222
3222
elsif ( $type =~ m / >/ ) {
3223
- push @clause , " ($val IS NULL AND $quo IS NOT NULL) OR ($quo $cmp $val )" ;
3223
+ push @clause , " (( $val IS NULL AND $quo IS NOT NULL) OR ($quo $cmp $val ) )" ;
3224
3224
}
3225
3225
else { # If $type =~ m/</ ) {
3226
3226
push @clauses , " (($val IS NOT NULL AND $quo IS NULL) OR ($quo $cmp $val ))" ;
@@ -4600,7 +4600,7 @@ sub connect {
4600
4600
my $dp = $self -> {DSNParser };
4601
4601
4602
4602
my $dbh = $self -> {dbh };
4603
- if ( !$dbh || ! $dbh -> ping( ) ) {
4603
+ if ( !$dbh || ( $dbh && $self -> { dbh_set } && ! $self -> _ping( $dbh ) ) ) {
4604
4604
if ( $self -> {ask_pass } && !$self -> {asked_for_pass } && !defined $dsn -> {p } ) {
4605
4605
$dsn -> {p } = OptionParser::prompt_noecho(" Enter MySQL password: " );
4606
4606
$self -> {asked_for_pass } = 1;
@@ -4629,19 +4629,20 @@ sub connect {
4629
4629
sub set_dbh {
4630
4630
my ($self , $dbh ) = @_ ;
4631
4631
4632
- if ( $self -> {dbh } && $self -> {dbh } == $dbh && $self -> {dbh_set } ) {
4633
- PTDEBUG && _d($dbh , ' Already set dbh' );
4634
- return $dbh ;
4635
- }
4636
-
4637
4632
PTDEBUG && _d($dbh , ' Setting dbh' );
4638
4633
4639
4634
$dbh -> {FetchHashKeyName } = ' NAME_lc' if $self -> {NAME_lc };
4640
4635
4641
- my $sql = ' SELECT @@server_id /*!50038 , @@hostname*/' ;
4636
+ my $sql = ' SELECT @@server_id /*!50038 , @@hostname*/, CONNECTION_ID() as connection_id ' ;
4642
4637
PTDEBUG && _d($dbh , $sql );
4643
- my ($server_id , $hostname ) = $dbh -> selectrow_array($sql );
4638
+ my ($server_id , $hostname , $connection_id ) = $dbh -> selectrow_array($sql );
4644
4639
PTDEBUG && _d($dbh , ' hostname:' , $hostname , $server_id );
4640
+
4641
+ if ( $self -> {dbh } && $self -> {dbh } == $dbh && $self -> {dbh_set } && $self -> {dbh_set } == $connection_id ) {
4642
+ PTDEBUG && _d($dbh , ' Already set dbh' );
4643
+ return $dbh ;
4644
+ }
4645
+
4645
4646
if ( $hostname ) {
4646
4647
$self -> {hostname } = $hostname ;
4647
4648
}
@@ -4656,7 +4657,7 @@ sub set_dbh {
4656
4657
}
4657
4658
4658
4659
$self -> {dbh } = $dbh ;
4659
- $self -> {dbh_set } = 1 ;
4660
+ $self -> {dbh_set } = $connection_id ;
4660
4661
return $dbh ;
4661
4662
}
4662
4663
@@ -4782,6 +4783,17 @@ sub DESTROY {
4782
4783
return ;
4783
4784
}
4784
4785
4786
+ sub _ping () {
4787
+ my ( $self , $dbh ) = @_ ;
4788
+ if (!$dbh -> ping()) {
4789
+ return 0;
4790
+ }
4791
+ my $sql = ' SELECT CONNECTION_ID() as connection_id' ;
4792
+ PTDEBUG && _d($dbh , $sql );
4793
+ my ($connection_id ) = $dbh -> selectrow_array($sql );
4794
+ return $self -> {dbh_set } == $connection_id ;
4795
+ }
4796
+
4785
4797
sub _d {
4786
4798
my ($package , undef , $line ) = caller 0;
4787
4799
@_ = map { (my $temp = $_ ) =~ s /\n / \n # / g ; $temp ; }
0 commit comments