@@ -2519,6 +2519,8 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond)
2519
2519
char *body= filp->Body ;
2520
2520
unsigned int i;
2521
2521
bool ismul= false , x= (tty == TYPE_AM_MYX || tty == TYPE_AM_XDBC);
2522
+ bool nonul= (tty == TYPE_AM_ODBC && (tdbp->GetMode () == MODE_INSERT ||
2523
+ tdbp->GetMode () == MODE_DELETE));
2522
2524
OPVAL vop= OP_XX;
2523
2525
2524
2526
if (!cond)
@@ -2536,7 +2538,7 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond)
2536
2538
2537
2539
if (trace)
2538
2540
htrc (" Cond: Ftype=%d name=%s\n " , cond_item->functype (),
2539
- cond_item->func_name ());
2541
+ cond_item->func_name ());
2540
2542
2541
2543
switch (cond_item->functype ()) {
2542
2544
case Item_func::COND_AND_FUNC: vop= OP_AND; break ;
@@ -2555,7 +2557,7 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond)
2555
2557
for (i= 0 ; i < arglist->elements ; i++)
2556
2558
if ((subitem= li++)) {
2557
2559
if (!CheckCond (g, filp, tty, subitem)) {
2558
- if (vop == OP_OR)
2560
+ if (vop == OP_OR || nonul )
2559
2561
return NULL ;
2560
2562
else
2561
2563
*p2= 0 ;
@@ -2651,6 +2653,8 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond)
2651
2653
if (trace) {
2652
2654
htrc (" Field index=%d\n " , pField->field ->field_index );
2653
2655
htrc (" Field name=%s\n " , pField->field ->field_name );
2656
+ htrc (" Field type=%d\n " , pField->field ->type ());
2657
+ htrc (" Field_type=%d\n " , args[i]->field_type ());
2654
2658
} // endif trace
2655
2659
2656
2660
// IN and BETWEEN clauses should be col VOP list
@@ -2670,8 +2674,9 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond)
2670
2674
char buff[256 ];
2671
2675
String *res, tmp (buff, sizeof (buff), &my_charset_bin);
2672
2676
Item_basic_constant *pval= (Item_basic_constant *)args[i];
2677
+ Item::Type type= args[i]->real_type ();
2673
2678
2674
- switch (args[i]-> real_type () ) {
2679
+ switch (type ) {
2675
2680
case COND::STRING_ITEM:
2676
2681
case COND::INT_ITEM:
2677
2682
case COND::REAL_ITEM:
@@ -2696,10 +2701,64 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond)
2696
2701
2697
2702
if (!x) {
2698
2703
// Append the value to the filter
2699
- if (args[i]->field_type () == MYSQL_TYPE_VARCHAR)
2700
- strcat (strncat (strcat (body, " '" ), res->ptr (), res->length ()), " '" );
2701
- else
2702
- strncat (body, res->ptr (), res->length ());
2704
+ switch (args[i]->field_type ()) {
2705
+ case MYSQL_TYPE_TIMESTAMP:
2706
+ case MYSQL_TYPE_DATETIME:
2707
+ if (tty == TYPE_AM_ODBC) {
2708
+ strcat (body, " {ts '" );
2709
+ strcat (strncat (body, res->ptr (), res->length ()), " '}" );
2710
+ break ;
2711
+ } // endif ODBC
2712
+
2713
+ case MYSQL_TYPE_DATE:
2714
+ if (tty == TYPE_AM_ODBC) {
2715
+ strcat (body, " {d '" );
2716
+ strcat (strncat (body, res->ptr (), res->length ()), " '}" );
2717
+ break ;
2718
+ } // endif ODBC
2719
+
2720
+ case MYSQL_TYPE_TIME:
2721
+ if (tty == TYPE_AM_ODBC) {
2722
+ strcat (body, " {t '" );
2723
+ strcat (strncat (body, res->ptr (), res->length ()), " '}" );
2724
+ break ;
2725
+ } // endif ODBC
2726
+
2727
+ case MYSQL_TYPE_VARCHAR:
2728
+ if (tty == TYPE_AM_ODBC && i) {
2729
+ switch (args[0 ]->field_type ()) {
2730
+ case MYSQL_TYPE_TIMESTAMP:
2731
+ case MYSQL_TYPE_DATETIME:
2732
+ strcat (body, " {ts '" );
2733
+ strncat (body, res->ptr (), res->length ());
2734
+ strcat (body, " '}" );
2735
+ break ;
2736
+ case MYSQL_TYPE_DATE:
2737
+ strcat (body, " {d '" );
2738
+ strncat (body, res->ptr (), res->length ());
2739
+ strcat (body, " '}" );
2740
+ break ;
2741
+ case MYSQL_TYPE_TIME:
2742
+ strcat (body, " {t '" );
2743
+ strncat (body, res->ptr (), res->length ());
2744
+ strcat (body, " '}" );
2745
+ break ;
2746
+ default :
2747
+ strcat (body, " '" );
2748
+ strncat (body, res->ptr (), res->length ());
2749
+ strcat (body, " '" );
2750
+ } // endswitch field type
2751
+
2752
+ } else {
2753
+ strcat (body, " '" );
2754
+ strncat (body, res->ptr (), res->length ());
2755
+ strcat (body, " '" );
2756
+ } // endif tty
2757
+
2758
+ break ;
2759
+ default :
2760
+ strncat (body, res->ptr (), res->length ());
2761
+ } // endswitch field type
2703
2762
2704
2763
} else {
2705
2764
if (args[i]->field_type () == MYSQL_TYPE_VARCHAR) {
0 commit comments