| ... | ... | 
                  @@ -262,12 +262,17 @@ sub delete {
                 | 
              
| 262 | 262 | 
                       croak qq{"where" must be specified}
                 | 
              
| 263 | 263 | 
                  if $swhere eq '' && !$allow_delete_all;  | 
              
| 264 | 264 | 
                   | 
              
| 265 | 
                  - # Source of SQL  | 
              |
| 266 | 
                  - my $source = "delete from $table $swhere";  | 
              |
| 267 | 
                  - $source .= " $append" if $append;  | 
              |
| 265 | 
                  + # SQL stack  | 
              |
| 266 | 
                  + my @sql;  | 
              |
| 267 | 
                  +  | 
              |
| 268 | 
                  + # Delete  | 
              |
| 269 | 
                  + push @sql, "delete from $table $swhere";  | 
              |
| 270 | 
                  + push @sql, $append if $append;  | 
              |
| 271 | 
                  +  | 
              |
| 272 | 
                  +    my $sql = join(' ', @sql);
                 | 
              |
| 268 | 273 | 
                   | 
              
| 269 | 274 | 
                  # Create query  | 
              
| 270 | 
                  - my $query = $self->create_query($source);  | 
              |
| 275 | 
                  + my $query = $self->create_query($sql);  | 
              |
| 271 | 276 | 
                       return $query if $args{query};
                 | 
              
| 272 | 277 | 
                   | 
              
| 273 | 278 | 
                  # Execute query  | 
              
| ... | ... | 
                  @@ -389,13 +394,18 @@ sub insert {
                 | 
              
| 389 | 394 | 
                  push @columns, $column;  | 
              
| 390 | 395 | 
                  }  | 
              
| 391 | 396 | 
                   | 
              
| 397 | 
                  + # SQL stack  | 
              |
| 398 | 
                  + my @sql;  | 
              |
| 399 | 
                  +  | 
              |
| 400 | 
                  + # Insert  | 
              |
| 401 | 
                  +    push @sql, "insert into $table {insert_param ". join(' ', @columns) . '}';
                 | 
              |
| 402 | 
                  + push @sql, $append if $append;  | 
              |
| 403 | 
                  +  | 
              |
| 392 | 404 | 
                  # SQL  | 
              
| 393 | 
                  -    my $source = "insert into $table {insert_param "
                 | 
              |
| 394 | 
                  -               . join(' ', @columns) . '}';
                 | 
              |
| 395 | 
                  - $source .= " $append" if $append;  | 
              |
| 405 | 
                  +    my $sql = join (' ', @sql);
                 | 
              |
| 396 | 406 | 
                   | 
              
| 397 | 407 | 
                  # Create query  | 
              
| 398 | 
                  - my $query = $self->create_query($source);  | 
              |
| 408 | 
                  + my $query = $self->create_query($sql);  | 
              |
| 399 | 409 | 
                       return $query if $args{query};
                 | 
              
| 400 | 410 | 
                   | 
              
| 401 | 411 | 
                  # Execute query  | 
              
| ... | ... | 
                  @@ -493,26 +503,26 @@ sub select {
                 | 
              
| 493 | 503 | 
                       my $append   = $args{append};
                 | 
              
| 494 | 504 | 
                       my $filter   = $args{filter};
                 | 
              
| 495 | 505 | 
                   | 
              
| 496 | 
                  - # Source of SQL  | 
              |
| 497 | 
                  - my $source = 'select ';  | 
              |
| 506 | 
                  + # SQL stack  | 
              |
| 507 | 
                  + my @sql;  | 
              |
| 508 | 
                  +  | 
              |
| 509 | 
                  + push @sql, 'select';  | 
              |
| 498 | 510 | 
                   | 
              
| 499 | 511 | 
                  # Column clause  | 
              
| 500 | 512 | 
                       if (@$columns) {
                 | 
              
| 501 | 513 | 
                           foreach my $column (@$columns) {
                 | 
              
| 502 | 
                  - $source .= "$column, ";  | 
              |
| 514 | 
                  + push @sql, ($column, ',');  | 
              |
| 503 | 515 | 
                  }  | 
              
| 504 | 
                  - $source =~ s/, $/ /;  | 
              |
| 505 | 
                  - }  | 
              |
| 506 | 
                  -    else {
                 | 
              |
| 507 | 
                  - $source .= '* ';  | 
              |
| 516 | 
                  + pop @sql if $sql[-1] eq ',';  | 
              |
| 508 | 517 | 
                  }  | 
              
| 518 | 
                  +    else { push @sql, '*' }
                 | 
              |
| 509 | 519 | 
                   | 
              
| 510 | 520 | 
                  # Table  | 
              
| 511 | 
                  - $source .= 'from ';  | 
              |
| 521 | 
                  + push @sql, 'from';  | 
              |
| 512 | 522 | 
                       foreach my $table (@$tables) {
                 | 
              
| 513 | 
                  - $source .= "$table, ";  | 
              |
| 523 | 
                  + push @sql, ($table, ',');  | 
              |
| 514 | 524 | 
                  }  | 
              
| 515 | 
                  - $source =~ s/, $/ /;  | 
              |
| 525 | 
                  + pop @sql if $sql[-1] eq ',';  | 
              |
| 516 | 526 | 
                   | 
              
| 517 | 527 | 
                  # Where  | 
              
| 518 | 528 | 
                  my $w;  | 
              
| ... | ... | 
                  @@ -533,22 +543,25 @@ sub select {
                 | 
              
| 533 | 543 | 
                   | 
              
| 534 | 544 | 
                  # String where  | 
              
| 535 | 545 | 
                  my $swhere = "$w";  | 
              
| 536 | 
                  - $source .= "$swhere ";  | 
              |
| 546 | 
                  + push @sql, $swhere;  | 
              |
| 537 | 547 | 
                   | 
              
| 538 | 548 | 
                  # Relation  | 
              
| 539 | 549 | 
                       if ($relation) {
                 | 
              
| 540 | 
                  - $source .= $swhere eq '' ? "where " : "and ";  | 
              |
| 541 | 
                  -        foreach my $rkey (keys %$relation) {
                 | 
              |
| 542 | 
                  -            $source .= "$rkey = " . $relation->{$rkey} . " and ";
                 | 
              |
| 550 | 
                  + push @sql, $swhere eq '' ? 'where' : 'and';  | 
              |
| 551 | 
                  +        foreach my $rcolumn (keys %$relation) {
                 | 
              |
| 552 | 
                  +            push @sql, ("$rcolumn = " . $relation->{$rcolumn},  'and');
                 | 
              |
| 543 | 553 | 
                  }  | 
              
| 544 | 554 | 
                  }  | 
              
| 545 | 
                  - $source =~ s/ and $//;  | 
              |
| 555 | 
                  + pop @sql if $sql[-1] eq 'and';  | 
              |
| 556 | 
                  +  | 
              |
| 557 | 
                  + # Append statement  | 
              |
| 558 | 
                  + push @sql, $append if $append;  | 
              |
| 546 | 559 | 
                   | 
              
| 547 | 
                  - # Append some statement  | 
              |
| 548 | 
                  - $source .= " $append" if $append;  | 
              |
| 560 | 
                  + # SQL  | 
              |
| 561 | 
                  +    my $sql = join (' ', @sql);
                 | 
              |
| 549 | 562 | 
                   | 
              
| 550 | 563 | 
                  # Create query  | 
              
| 551 | 
                  - my $query = $self->create_query($source);  | 
              |
| 564 | 
                  + my $query = $self->create_query($sql);  | 
              |
| 552 | 565 | 
                       return $query if $args{query};
                 | 
              
| 553 | 566 | 
                   | 
              
| 554 | 567 | 
                  # Execute query  | 
              
| ... | ... | 
                  @@ -651,9 +664,12 @@ sub update {
                 | 
              
| 651 | 664 | 
                       croak qq{"where" must be specified}
                 | 
              
| 652 | 665 | 
                  if "$swhere" eq '' && !$allow_update_all;  | 
              
| 653 | 666 | 
                   | 
              
| 654 | 
                  - # Source of SQL  | 
              |
| 655 | 
                  - my $source = "update $table $update_clause $swhere";  | 
              |
| 656 | 
                  - $source .= " $append" if $append;  | 
              |
| 667 | 
                  + # SQL stack  | 
              |
| 668 | 
                  + my @sql;  | 
              |
| 669 | 
                  +  | 
              |
| 670 | 
                  + # Update  | 
              |
| 671 | 
                  + push @sql, "update $table $update_clause $swhere";  | 
              |
| 672 | 
                  + push @sql, $append if $append;  | 
              |
| 657 | 673 | 
                   | 
              
| 658 | 674 | 
                  # Rearrange parameters  | 
              
| 659 | 675 | 
                       foreach my $wkey (keys %$where) {
                 | 
              
| ... | ... | 
                  @@ -669,8 +685,11 @@ sub update {
                 | 
              
| 669 | 685 | 
                  }  | 
              
| 670 | 686 | 
                  }  | 
              
| 671 | 687 | 
                   | 
              
| 688 | 
                  + # SQL  | 
              |
| 689 | 
                  +    my $sql = join(' ', @sql);
                 | 
              |
| 690 | 
                  +  | 
              |
| 672 | 691 | 
                  # Create query  | 
              
| 673 | 
                  - my $query = $self->create_query($source);  | 
              |
| 692 | 
                  + my $query = $self->create_query($sql);  | 
              |
| 674 | 693 | 
                       return $query if $args{query};
                 | 
              
| 675 | 694 | 
                   | 
              
| 676 | 695 | 
                  # Execute query  |