Commit f80e4ed9 authored by Alexander Barkov's avatar Alexander Barkov

Merge 10.0-connect -> 10.0

parents e2567fb6 38c3fd20
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <string.h> #include <string.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <stdint.h> // for uintprt_h
#endif // !WIN32 #endif // !WIN32
/***********************************************************************/ /***********************************************************************/
...@@ -129,7 +130,7 @@ PARRAY MakeValueArray(PGLOBAL g, PPARM pp) ...@@ -129,7 +130,7 @@ PARRAY MakeValueArray(PGLOBAL g, PPARM pp)
break; break;
case TYPE_VOID: case TYPE_VOID:
// Integer stored inside pp->Value // Integer stored inside pp->Value
par->AddValue(g, (int)parmp->Value); par->AddValue(g, parmp->Intval);
break; break;
} // endswitch valtyp } // endswitch valtyp
...@@ -585,7 +586,7 @@ bool ARRAY::CanBeShort(void) ...@@ -585,7 +586,7 @@ bool ARRAY::CanBeShort(void)
/***********************************************************************/ /***********************************************************************/
int ARRAY::Convert(PGLOBAL g, int k, PVAL vp) int ARRAY::Convert(PGLOBAL g, int k, PVAL vp)
{ {
int i; int i, prec = 0;
bool b = FALSE; bool b = FALSE;
PMBV ovblk = Valblk; PMBV ovblk = Valblk;
PVBLK ovblp = Vblp; PVBLK ovblp = Vblp;
...@@ -595,6 +596,7 @@ int ARRAY::Convert(PGLOBAL g, int k, PVAL vp) ...@@ -595,6 +596,7 @@ int ARRAY::Convert(PGLOBAL g, int k, PVAL vp)
switch (Type) { switch (Type) {
case TYPE_DOUBLE: case TYPE_DOUBLE:
prec = 2;
case TYPE_SHORT: case TYPE_SHORT:
case TYPE_INT: case TYPE_INT:
case TYPE_DATE: case TYPE_DATE:
...@@ -607,13 +609,13 @@ int ARRAY::Convert(PGLOBAL g, int k, PVAL vp) ...@@ -607,13 +609,13 @@ int ARRAY::Convert(PGLOBAL g, int k, PVAL vp)
Size = Nval; Size = Nval;
Nval = 0; Nval = 0;
Vblp = Valblk->Allocate(g, Type, Len, 0, Size); Vblp = Valblk->Allocate(g, Type, Len, prec, Size);
if (!Valblk->GetMemp()) if (!Valblk->GetMemp())
// The error message was built by PlgDBalloc // The error message was built by PlgDBalloc
return TYPE_ERROR; return TYPE_ERROR;
else else
Value = AllocateValue(g, Type, Len, 0, NULL); Value = AllocateValue(g, Type, Len, prec, NULL);
/*********************************************************************/ /*********************************************************************/
/* Converting STRING to DATE can be done according to date format. */ /* Converting STRING to DATE can be done according to date format. */
......
...@@ -290,8 +290,8 @@ bool MAPFAM::RecordPos(PGLOBAL g) ...@@ -290,8 +290,8 @@ bool MAPFAM::RecordPos(PGLOBAL g)
/***********************************************************************/ /***********************************************************************/
int MAPFAM::InitDelete(PGLOBAL g, int fpos, int spos) int MAPFAM::InitDelete(PGLOBAL g, int fpos, int spos)
{ {
Fpos = Memory + fpos; Fpos = Memory + (ptrdiff_t)fpos;
Mempos = Memory + spos; Mempos = Memory + (ptrdiff_t)spos;
return RC_OK; return RC_OK;
} // end of InitDelete } // end of InitDelete
...@@ -685,7 +685,7 @@ bool MPXFAM::SetPos(PGLOBAL g, int pos) ...@@ -685,7 +685,7 @@ bool MPXFAM::SetPos(PGLOBAL g, int pos)
/***********************************************************************/ /***********************************************************************/
int MPXFAM::InitDelete(PGLOBAL g, int fpos, int spos) int MPXFAM::InitDelete(PGLOBAL g, int fpos, int spos)
{ {
Fpos = Memory + Headlen + fpos * Lrecl; Fpos = Memory + Headlen + (ptrdiff_t)fpos * Lrecl;
Mempos = Fpos + Lrecl; Mempos = Fpos + Lrecl;
return RC_OK; return RC_OK;
} // end of InitDelete } // end of InitDelete
......
...@@ -104,7 +104,7 @@ class DllExport MPXFAM : public MBKFAM { ...@@ -104,7 +104,7 @@ class DllExport MPXFAM : public MBKFAM {
virtual int MaxBlkSize(PGLOBAL g, int s) virtual int MaxBlkSize(PGLOBAL g, int s)
{return TXTFAM::MaxBlkSize(g, s);} {return TXTFAM::MaxBlkSize(g, s);}
virtual bool SetPos(PGLOBAL g, int recpos); virtual bool SetPos(PGLOBAL g, int recpos);
virtual int GetNextPos(void) {return (int)Fpos + Nrec;} virtual int GetNextPos(void) {return GetPos() + 1;}
virtual bool DeferReading(void) {return false;} virtual bool DeferReading(void) {return false;}
virtual int ReadBuffer(PGLOBAL g); virtual int ReadBuffer(PGLOBAL g);
virtual int WriteBuffer(PGLOBAL g); virtual int WriteBuffer(PGLOBAL g);
......
...@@ -287,7 +287,7 @@ bool TXTFAM::AddListValue(PGLOBAL g, int type, void *val, PPARM *top) ...@@ -287,7 +287,7 @@ bool TXTFAM::AddListValue(PGLOBAL g, int type, void *val, PPARM *top)
// *((int*)pp->Value) = *((int*)val); // *((int*)pp->Value) = *((int*)val);
// break; // break;
case TYPE_VOID: case TYPE_VOID:
pp->Value = (void*)(intptr)*(int*)val; pp->Intval = *(int*)val;
break; break;
// case TYPE_STRING: // case TYPE_STRING:
// pp->Value = PlugSubAlloc(g, NULL, strlen((char*)val) + 1); // pp->Value = PlugSubAlloc(g, NULL, strlen((char*)val) + 1);
......
...@@ -63,7 +63,7 @@ static PPARM MakeParm(PGLOBAL g, PXOB xp) ...@@ -63,7 +63,7 @@ static PPARM MakeParm(PGLOBAL g, PXOB xp)
} // end of MakeParm } // end of MakeParm
/***********************************************************************/ /***********************************************************************/
/* Routines called externally by FILTER function. */ /* Routines called internally/externally by FILTER functions. */
/***********************************************************************/ /***********************************************************************/
bool PlugEvalLike(PGLOBAL, LPCSTR, LPCSTR, bool); bool PlugEvalLike(PGLOBAL, LPCSTR, LPCSTR, bool);
//bool ReadSubQuery(PGLOBAL, PSUBQ); //bool ReadSubQuery(PGLOBAL, PSUBQ);
...@@ -72,6 +72,32 @@ bool PlugEvalLike(PGLOBAL, LPCSTR, LPCSTR, bool); ...@@ -72,6 +72,32 @@ bool PlugEvalLike(PGLOBAL, LPCSTR, LPCSTR, bool);
BYTE OpBmp(PGLOBAL g, OPVAL opc); BYTE OpBmp(PGLOBAL g, OPVAL opc);
PARRAY MakeValueArray(PGLOBAL g, PPARM pp); PARRAY MakeValueArray(PGLOBAL g, PPARM pp);
/***********************************************************************/
/* Returns the bitmap representing the conditions that must not be */
/* met when returning from TestValue for a given operator. */
/* Bit one is EQ, bit 2 is LT, and bit 3 is GT. */
/***********************************************************************/
BYTE OpBmp(PGLOBAL g, OPVAL opc)
{
BYTE bt;
switch (opc) {
case OP_IN:
case OP_EQ: bt = 0x06; break;
case OP_NE: bt = 0x01; break;
case OP_GT: bt = 0x03; break;
case OP_GE: bt = 0x02; break;
case OP_LT: bt = 0x05; break;
case OP_LE: bt = 0x04; break;
case OP_EXIST: bt = 0x00; break;
default:
sprintf(g->Message, MSG(BAD_FILTER_OP), opc);
longjmp(g->jumper[g->jump_level], TYPE_ARRAY);
} // endswitch opc
return bt;
} // end of OpBmp
/***********************************************************************/ /***********************************************************************/
/* Routines called externally by CondFilter. */ /* Routines called externally by CondFilter. */
/***********************************************************************/ /***********************************************************************/
......
...@@ -205,7 +205,10 @@ typedef struct _activity { /* Describes activity and language */ ...@@ -205,7 +205,10 @@ typedef struct _activity { /* Describes activity and language */
/*---------------- UNIT ?????????? VERSION ? ----------------------*/ /*---------------- UNIT ?????????? VERSION ? ----------------------*/
typedef struct _parm { typedef struct _parm {
void *Value; union {
void *Value;
int Intval;
}; // end union
short Type, Domain; short Type, Domain;
PPARM Next; PPARM Next;
} PARM; } PARM;
......
#
# Testing out of range dates as (var)char
#
CREATE TABLE t1 (
id INT NOT NULL,
dat CHAR(10) NOT NULL,
tim CHAR(8) DEFAULT '09:35:08',
datim CHAR(19) DEFAULT '1789-08-10 14:20:30')
ENGINE=CONNECT TABLE_TYPE=FIX;
Warnings:
Warning 1105 No file name. Table will use t1.fix
INSERT INTO t1(id,dat) VALUES(1,'1515-04-01'),(2,'2014-07-26'),(3,'2118-11-02');
SELECT * FROM t1;
id dat tim datim
1 1515-04-01 09:35:08 1789-08-10 14:20:30
2 2014-07-26 09:35:08 1789-08-10 14:20:30
3 2118-11-02 09:35:08 1789-08-10 14:20:30
SELECT id, DATE(datim) FROM t1 LIMIT 1;
id DATE(datim)
1 1789-08-10
SELECT id, DAYNAME(dat) FROM t1;
id DAYNAME(dat)
1 Thursday
2 Saturday
3 Wednesday
SELECT id, DAYNAME(datim) FROM t1 LIMIT 1;
id DAYNAME(datim)
1 Monday
SELECT id, TIME(tim) FROM t1 LIMIT 1;
id TIME(tim)
1 09:35:08.000000
DROP TABLE t1;
#
# Show MRR setting. The way it is done is because the t3 table cannot be directly based on
# the information_schema.session_variables table. Not being a CONNECT table, it would be
# read using an intermediate MYSQL table using the MySQL API and could not reflect the
# current session variable change (the call would create another session) This would be
# correct only for querying GLOBAL variables but is not what we want to do here.
#
CREATE TABLE t2 (
name VARCHAR(64) NOT NULL,
value VARCHAR(1024) NOT NULL
) ENGINE=CONNECT TABLE_TYPE=DOS;
Warnings:
Warning 1105 No file name. Table will use t2.dos
INSERT INTO t2 SELECT * FROM information_schema.session_variables WHERE variable_name = 'OPTIMIZER_SWITCH';
create table t3 (
name CHAR(32) NOT NULL,
value CHAR(64) NOT NULL
) ENGINE=CONNECT TABLE_TYPE=XCOL TABNAME=t2 OPTION_LIST='Colname=value';
SELECT value FROM t3 WHERE value LIKE 'mrr%';
value
mrr=off
mrr_cost_based=off
mrr_sort_keys=off
#
# Testing indexing with MRR OFF
#
CREATE TABLE t1
(
matricule INT(4) KEY NOT NULL field_format='Z',
nom VARCHAR(16) NOT NULL,
prenom VARCHAR(20) NOT NULL,
sexe SMALLINT(1) NOT NULL COMMENT 'sexe 1:M 2:F',
aanais INT(4) NOT NULL,
mmnais INT(2) NOT NULL,
ddentree DATE NOT NULL date_format='YYYYMM',
ddnom DATE NOT NULL date_format='YYYYMM',
brut INT(5) NOT NULL,
net DOUBLE(8,2) NOT NULL,
service INT(2) NOT NULL,
sitmat CHAR(1) NOT NULL,
formation CHAR(5) NOT NULL,
INDEX NP(nom,prenom)
) ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='emp.txt' ENDING=2;
SELECT * FROM t1 LIMIT 10;
matricule nom prenom sexe aanais mmnais ddentree ddnom brut net service sitmat formation
5745 ESCOURCHE BENEDICTE 2 1935 7 1962-12-01 1994-05-01 18345 14275.50 0 M TECHN
9692 VICENTE LAURENCE 2 1941 8 1967-10-01 1989-01-01 16212 13032.80 0 M ANGL
9146 NICOLAS ROGER 1 1941 6 1964-07-01 1995-02-01 34173 25098.65 0 M SANS
2985 TESSEREAU MARIE HELENE 2 1941 9 1967-01-01 1990-01-01 19323 14933.78 0 V SANS
3368 MOGADOR ALAIN 1 1941 1 1961-09-01 1993-11-01 43303 31420.55 0 C SANS
7394 CHAUSSEE ERIC DENIS 1 1944 9 1965-11-01 1983-12-01 32002 23583.86 0 M ANGL
4655 MAILLOT GEORGES 1 1945 5 1970-09-01 1986-12-01 24700 18541.64 0 C ANGL
2825 CAMILLE NADINE 2 1956 9 1994-01-01 1993-01-01 19494 15050.45 0 M SANS
1460 BRUYERES JEAN MARC 1 1958 8 1984-08-01 1988-05-01 20902 15980.07 0 M SANS
4974 LONES GERARD 1 1959 10 1979-01-01 1994-12-01 16081 12916.70 0 M SANS
# Without MRR, the rows are retrieved sorted by name
SELECT matricule, nom, prenom, sitmat, net FROM t1 WHERE nom IN ('ETANG','FOCH','CERF','ITALIE','ROI');
matricule nom prenom sitmat net
5324 CERF CLAUDE M 9503.34
7703 CERF NICOLE M 12025.61
3110 CERF VALERIE M 10472.37
4454 ETANG BEATRICE M 11017.61
1022 ETANG GERARD L 8729.58
8222 ETANG LIONEL M 13497.90
2492 ETANG PASCAL VINCENT M 11986.62
1977 FOCH BERNADETTE . 8145.03
5707 FOCH DENIS C 7679.36
2552 FOCH FRANCK M 10745.81
2634 FOCH JOCELYNE M 10473.09
5765 FOCH ROBERT M 12916.32
4080 FOCH SERGE M 9658.24
5898 ITALIE DENIS M 9502.41
7606 ITALIE JACQUES C 7679.45
1067 ITALIE SVETLANA M 11713.61
5853 ROI CHANTAL . 8147.06
2995 ROI JEAN M 11715.50
2531 ROI MICHEL L 10240.44
5846 ROI PATRICIA M 15669.57
#
# Testing indexing with MRR ON
#
SET @@LOCAL.OPTIMIZER_SWITCH='mrr=on';
# Refresh the t2 table to reflect the change
UPDATE t2, information_schema.session_variables SET value = variable_value WHERE variable_name = 'OPTIMIZER_SWITCH';
# Check that MRR is ON for the session
SELECT value FROM t3 WHERE value LIKE 'mrr%';
value
mrr=on
mrr_cost_based=off
mrr_sort_keys=off
# With MRR, the rows are retrieved sorted by their position in the table
SELECT matricule, nom, prenom, sitmat, net FROM t1 WHERE nom IN ('ETANG','FOCH','CERF','ITALIE','ROI');
matricule nom prenom sitmat net
1977 FOCH BERNADETTE . 8145.03
2995 ROI JEAN M 11715.50
3110 CERF VALERIE M 10472.37
5324 CERF CLAUDE M 9503.34
4080 FOCH SERGE M 9658.24
4454 ETANG BEATRICE M 11017.61
5898 ITALIE DENIS M 9502.41
2552 FOCH FRANCK M 10745.81
2531 ROI MICHEL L 10240.44
5853 ROI CHANTAL . 8147.06
8222 ETANG LIONEL M 13497.90
5707 FOCH DENIS C 7679.36
1067 ITALIE SVETLANA M 11713.61
7606 ITALIE JACQUES C 7679.45
7703 CERF NICOLE M 12025.61
2634 FOCH JOCELYNE M 10473.09
1022 ETANG GERARD L 8729.58
5846 ROI PATRICIA M 15669.57
2492 ETANG PASCAL VINCENT M 11986.62
5765 FOCH ROBERT M 12916.32
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
SET @@LOCAL.OPTIMIZER_SWITCH='mrr=off';
#
# Testing multiple indexed UPDATE and DELETE
#
CREATE TABLE t1 (
id INT(4) NOT NULL,
msg VARCHAR(16) NOT NULL,
INDEX IDM(id,msg))
ENGINE=CONNECT TABLE_TYPE=DOS;
Warnings:
Warning 1105 No file name. Table will use t1.dos
INSERT INTO t1 VALUES(1,'one'),(4, 'four'),(7,'seven'),(8,'eight'),(10,'ten'),(11,'eleven'),(40,'forty'),(35,'thirty five'),(60,'sixty'),(72,'seventy two'),(81,'eighty one');
INSERT INTO t1 VALUES(1,'un'),(4, 'quatre'),(7,'sept'),(8,'huit'),(10,'dix'),(11,'onze'),(40,'quarante'),(35,'trente cinq'),(60,'soixante'),(72,'soixante douze'),(81,'quatrevingt un');
SELECT * FROM t1 IGNORE INDEX (IDM);
id msg
1 one
4 four
7 seven
8 eight
10 ten
11 eleven
40 forty
35 thirty five
60 sixty
72 seventy two
81 eighty one
1 un
4 quatre
7 sept
8 huit
10 dix
11 onze
40 quarante
35 trente cinq
60 soixante
72 soixante douze
81 quatrevingt un
UPDATE t1 SET msg = 'dieci' WHERE id = 10;
SELECT * FROM t1 IGNORE INDEX (IDM);
id msg
1 one
4 four
7 seven
8 eight
10 dieci
11 eleven
40 forty
35 thirty five
60 sixty
72 seventy two
81 eighty one
1 un
4 quatre
7 sept
8 huit
10 dieci
11 onze
40 quarante
35 trente cinq
60 soixante
72 soixante douze
81 quatrevingt un
UPDATE t1 SET msg = 'septante deux' WHERE id = 72;
SELECT * FROM t1 IGNORE INDEX (IDM);
id msg
1 one
4 four
7 seven
8 eight
10 dieci
11 eleven
40 forty
35 thirty five
60 sixty
72 septante deux
81 eighty one
1 un
4 quatre
7 sept
8 huit
10 dieci
11 onze
40 quarante
35 trente cinq
60 soixante
72 septante deux
81 quatrevingt un
UPDATE t1 SET id=2, msg='deux' WHERE id=4 AND msg='quatre';
SELECT * FROM t1 IGNORE INDEX (IDM);
id msg
1 one
4 four
7 seven
8 eight
10 dieci
11 eleven
40 forty
35 thirty five
60 sixty
72 septante deux
81 eighty one
1 un
2 deux
7 sept
8 huit
10 dieci
11 onze
40 quarante
35 trente cinq
60 soixante
72 septante deux
81 quatrevingt un
DELETE FROM t1 WHERE id IN (8,40);
SELECT * FROM t1 IGNORE INDEX (IDM);
id msg
1 one
4 four
7 seven
10 dieci
11 eleven
35 thirty five
60 sixty
72 septante deux
81 eighty one
1 un
2 deux
7 sept
10 dieci
11 onze
35 trente cinq
60 soixante
72 septante deux
81 quatrevingt un
DROP TABLE t1;
--echo #
--echo # Testing out of range dates as (var)char
--echo #
CREATE TABLE t1 (
id INT NOT NULL,
dat CHAR(10) NOT NULL,
tim CHAR(8) DEFAULT '09:35:08',
datim CHAR(19) DEFAULT '1789-08-10 14:20:30')
ENGINE=CONNECT TABLE_TYPE=FIX;
INSERT INTO t1(id,dat) VALUES(1,'1515-04-01'),(2,'2014-07-26'),(3,'2118-11-02');
SELECT * FROM t1;
SELECT id, DATE(datim) FROM t1 LIMIT 1;
SELECT id, DAYNAME(dat) FROM t1;
SELECT id, DAYNAME(datim) FROM t1 LIMIT 1;
SELECT id, TIME(tim) FROM t1 LIMIT 1;
DROP TABLE t1;
let $MYSQLD_DATADIR= `select @@datadir`;
--copy_file $MTR_SUITE_DIR/std_data/emp.txt $MYSQLD_DATADIR/test/emp.txt
--echo #
--echo # Show MRR setting. The way it is done is because the t3 table cannot be directly based on
--echo # the information_schema.session_variables table. Not being a CONNECT table, it would be
--echo # read using an intermediate MYSQL table using the MySQL API and could not reflect the
--echo # current session variable change (the call would create another session) This would be
--echo # correct only for querying GLOBAL variables but is not what we want to do here.
--echo #
CREATE TABLE t2 (
name VARCHAR(64) NOT NULL,
value VARCHAR(1024) NOT NULL
) ENGINE=CONNECT TABLE_TYPE=DOS;
INSERT INTO t2 SELECT * FROM information_schema.session_variables WHERE variable_name = 'OPTIMIZER_SWITCH';
# Check that MRR is OFF by default
create table t3 (
name CHAR(32) NOT NULL,
value CHAR(64) NOT NULL
) ENGINE=CONNECT TABLE_TYPE=XCOL TABNAME=t2 OPTION_LIST='Colname=value';
SELECT value FROM t3 WHERE value LIKE 'mrr%';
--echo #
--echo # Testing indexing with MRR OFF
--echo #
CREATE TABLE t1
(
matricule INT(4) KEY NOT NULL field_format='Z',
nom VARCHAR(16) NOT NULL,
prenom VARCHAR(20) NOT NULL,
sexe SMALLINT(1) NOT NULL COMMENT 'sexe 1:M 2:F',
aanais INT(4) NOT NULL,
mmnais INT(2) NOT NULL,
ddentree DATE NOT NULL date_format='YYYYMM',
ddnom DATE NOT NULL date_format='YYYYMM',
brut INT(5) NOT NULL,
net DOUBLE(8,2) NOT NULL,
service INT(2) NOT NULL,
sitmat CHAR(1) NOT NULL,
formation CHAR(5) NOT NULL,
INDEX NP(nom,prenom)
) ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='emp.txt' ENDING=2;
SELECT * FROM t1 LIMIT 10;
--echo # Without MRR, the rows are retrieved sorted by name
SELECT matricule, nom, prenom, sitmat, net FROM t1 WHERE nom IN ('ETANG','FOCH','CERF','ITALIE','ROI');
--echo #
--echo # Testing indexing with MRR ON
--echo #
SET @@LOCAL.OPTIMIZER_SWITCH='mrr=on';
--echo # Refresh the t2 table to reflect the change
UPDATE t2, information_schema.session_variables SET value = variable_value WHERE variable_name = 'OPTIMIZER_SWITCH';
--echo # Check that MRR is ON for the session
SELECT value FROM t3 WHERE value LIKE 'mrr%';
--echo # With MRR, the rows are retrieved sorted by their position in the table
SELECT matricule, nom, prenom, sitmat, net FROM t1 WHERE nom IN ('ETANG','FOCH','CERF','ITALIE','ROI');
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
#
# Clean up
#
SET @@LOCAL.OPTIMIZER_SWITCH='mrr=off';
--remove_file $MYSQLD_DATADIR/test/emp.txt
-- source include/not_embedded.inc
--echo #
--echo # Testing multiple indexed UPDATE and DELETE
--echo #
CREATE TABLE t1 (
id INT(4) NOT NULL,
msg VARCHAR(16) NOT NULL,
INDEX IDM(id,msg))
ENGINE=CONNECT TABLE_TYPE=DOS;
INSERT INTO t1 VALUES(1,'one'),(4, 'four'),(7,'seven'),(8,'eight'),(10,'ten'),(11,'eleven'),(40,'forty'),(35,'thirty five'),(60,'sixty'),(72,'seventy two'),(81,'eighty one');
INSERT INTO t1 VALUES(1,'un'),(4, 'quatre'),(7,'sept'),(8,'huit'),(10,'dix'),(11,'onze'),(40,'quarante'),(35,'trente cinq'),(60,'soixante'),(72,'soixante douze'),(81,'quatrevingt un');
SELECT * FROM t1 IGNORE INDEX (IDM);
UPDATE t1 SET msg = 'dieci' WHERE id = 10;
SELECT * FROM t1 IGNORE INDEX (IDM);
UPDATE t1 SET msg = 'septante deux' WHERE id = 72;
SELECT * FROM t1 IGNORE INDEX (IDM);
UPDATE t1 SET id=2, msg='deux' WHERE id=4 AND msg='quatre';
SELECT * FROM t1 IGNORE INDEX (IDM);
DELETE FROM t1 WHERE id IN (8,40);
SELECT * FROM t1 IGNORE INDEX (IDM);
DROP TABLE t1;
...@@ -582,7 +582,7 @@ DllExport void *PlgDBSubAlloc(PGLOBAL g, void *memp, size_t size); ...@@ -582,7 +582,7 @@ DllExport void *PlgDBSubAlloc(PGLOBAL g, void *memp, size_t size);
DllExport void *PlgDBalloc(PGLOBAL, void *, MBLOCK&); DllExport void *PlgDBalloc(PGLOBAL, void *, MBLOCK&);
DllExport void *PlgDBrealloc(PGLOBAL, void *, MBLOCK&, size_t); DllExport void *PlgDBrealloc(PGLOBAL, void *, MBLOCK&, size_t);
DllExport void NewPointer(PTABS, void *, void *); DllExport void NewPointer(PTABS, void *, void *);
DllExport char *GetIni(int n= 0); //lExport char *GetIni(int n= 0); // Not used anymore
DllExport void SetTrc(void); DllExport void SetTrc(void);
DllExport char *GetListOption(PGLOBAL, const char *, const char *, DllExport char *GetListOption(PGLOBAL, const char *, const char *,
const char *def=NULL); const char *def=NULL);
......
...@@ -322,7 +322,7 @@ PTDB DOSDEF::GetTable(PGLOBAL g, MODE mode) ...@@ -322,7 +322,7 @@ PTDB DOSDEF::GetTable(PGLOBAL g, MODE mode)
&& mode == MODE_UPDATE) && && mode == MODE_UPDATE) &&
!(tmp == TMP_FORCE && !(tmp == TMP_FORCE &&
(mode == MODE_UPDATE || mode == MODE_DELETE)); (mode == MODE_UPDATE || mode == MODE_DELETE));
PTXF txfp; PTXF txfp = NULL;
PTDBASE tdbp; PTDBASE tdbp;
/*********************************************************************/ /*********************************************************************/
...@@ -575,7 +575,6 @@ int TDBDOS::MakeBlockValues(PGLOBAL g) ...@@ -575,7 +575,6 @@ int TDBDOS::MakeBlockValues(PGLOBAL g)
{ {
int i, lg, nrec, rc, n = 0; int i, lg, nrec, rc, n = 0;
int curnum, curblk, block, savndv, savnbm; int curnum, curblk, block, savndv, savnbm;
int last __attribute__((unused));
void *savmin, *savmax; void *savmin, *savmax;
bool blocked, xdb2 = false; bool blocked, xdb2 = false;
//POOLHEADER save; //POOLHEADER save;
...@@ -612,7 +611,7 @@ int TDBDOS::MakeBlockValues(PGLOBAL g) ...@@ -612,7 +611,7 @@ int TDBDOS::MakeBlockValues(PGLOBAL g)
// to Rows+1 by unblocked variable length table access methods. // to Rows+1 by unblocked variable length table access methods.
curblk = -1; curblk = -1;
curnum = nrec - 1; curnum = nrec - 1;
last = 0; //last = 0;
Txfp->Block = block; // This is useful mainly for Txfp->Block = block; // This is useful mainly for
Txfp->CurBlk = curblk; // blocked tables (ZLBFAM), for Txfp->CurBlk = curblk; // blocked tables (ZLBFAM), for
Txfp->CurNum = curnum; // others it is just to be clean. Txfp->CurNum = curnum; // others it is just to be clean.
...@@ -743,7 +742,7 @@ int TDBDOS::MakeBlockValues(PGLOBAL g) ...@@ -743,7 +742,7 @@ int TDBDOS::MakeBlockValues(PGLOBAL g)
Txfp->BlkPos[curblk] = Txfp->GetPos(); Txfp->BlkPos[curblk] = Txfp->GetPos();
} // endif CurNum } // endif CurNum
last = curnum + 1; // curnum is zero based // last = curnum + 1; // curnum is zero based
Txfp->CurBlk = curblk; // Used in COLDOS::SetMinMax Txfp->CurBlk = curblk; // Used in COLDOS::SetMinMax
Txfp->CurNum = curnum; // Used in COLDOS::SetMinMax Txfp->CurNum = curnum; // Used in COLDOS::SetMinMax
} // endif blocked } // endif blocked
...@@ -1353,7 +1352,6 @@ PBF TDBDOS::CheckBlockFilari(PGLOBAL g, PXOB *arg, int op, bool *cnv) ...@@ -1353,7 +1352,6 @@ PBF TDBDOS::CheckBlockFilari(PGLOBAL g, PXOB *arg, int op, bool *cnv)
//bool conv = false, xdb2 = false, ok = false, b[2]; //bool conv = false, xdb2 = false, ok = false, b[2];
//PXOB *xarg1, *xarg2 = NULL, xp[2]; //PXOB *xarg1, *xarg2 = NULL, xp[2];
int i, n = 0, type[2] = {0,0}; int i, n = 0, type[2] = {0,0};
int ctype __attribute__((unused));
bool conv = false, xdb2 = false, ok = false; bool conv = false, xdb2 = false, ok = false;
PXOB *xarg2 = NULL, xp[2]; PXOB *xarg2 = NULL, xp[2];
PCOL colp; PCOL colp;
...@@ -1361,12 +1359,11 @@ PBF TDBDOS::CheckBlockFilari(PGLOBAL g, PXOB *arg, int op, bool *cnv) ...@@ -1361,12 +1359,11 @@ PBF TDBDOS::CheckBlockFilari(PGLOBAL g, PXOB *arg, int op, bool *cnv)
//SFROW *sfr[2]; //SFROW *sfr[2];
PBF *fp = NULL, bfp = NULL; PBF *fp = NULL, bfp = NULL;
ctype= TYPE_ERROR;
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
switch (arg[i]->GetType()) { switch (arg[i]->GetType()) {
case TYPE_CONST: case TYPE_CONST:
type[i] = 1; type[i] = 1;
ctype = arg[i]->GetResultType(); // ctype = arg[i]->GetResultType();
break; break;
case TYPE_COLBLK: case TYPE_COLBLK:
conv = cnv[i]; conv = cnv[i];
...@@ -1391,7 +1388,7 @@ PBF TDBDOS::CheckBlockFilari(PGLOBAL g, PXOB *arg, int op, bool *cnv) ...@@ -1391,7 +1388,7 @@ PBF TDBDOS::CheckBlockFilari(PGLOBAL g, PXOB *arg, int op, bool *cnv)
// correlated subquery, it has a constant value during // correlated subquery, it has a constant value during
// each execution of the subquery. // each execution of the subquery.
type[i] = 1; type[i] = 1;
ctype = arg[i]->GetResultType(); // ctype = arg[i]->GetResultType();
} // endif this } // endif this
break; break;
......
...@@ -888,6 +888,7 @@ bool TDBMYSQL::OpenDB(PGLOBAL g) ...@@ -888,6 +888,7 @@ bool TDBMYSQL::OpenDB(PGLOBAL g)
} else if (Mode == MODE_INSERT) { } else if (Mode == MODE_INSERT) {
if (Srcdef) { if (Srcdef) {
strcpy(g->Message, "No insert into anonym views"); strcpy(g->Message, "No insert into anonym views");
Myc.Close();
return true; return true;
} // endif Srcdef } // endif Srcdef
...@@ -906,12 +907,12 @@ bool TDBMYSQL::OpenDB(PGLOBAL g) ...@@ -906,12 +907,12 @@ bool TDBMYSQL::OpenDB(PGLOBAL g)
} // endif MakeInsert } // endif MakeInsert
if (m_Rc != RC_FX) { if (m_Rc != RC_FX) {
int rc __attribute__((unused));
char cmd[64]; char cmd[64];
int w; int w;
sprintf(cmd, "ALTER TABLE `%s` DISABLE KEYS", Tabname); sprintf(cmd, "ALTER TABLE `%s` DISABLE KEYS", Tabname);
rc = Myc.ExecSQL(g, cmd, &w); // may fail for some engines
m_Rc = Myc.ExecSQL(g, cmd, &w); // may fail for some engines
} // endif m_Rc } // endif m_Rc
} else } else
......
...@@ -114,7 +114,7 @@ class DllExport PRXCOL : public COLBLK { ...@@ -114,7 +114,7 @@ class DllExport PRXCOL : public COLBLK {
{return false;} {return false;}
virtual void ReadColumn(PGLOBAL g); virtual void ReadColumn(PGLOBAL g);
virtual void WriteColumn(PGLOBAL g); virtual void WriteColumn(PGLOBAL g);
bool Init(PGLOBAL g, PTDBASE tp = NULL); virtual bool Init(PGLOBAL g, PTDBASE tp = NULL);
protected: protected:
// Default constructor not to be used // Default constructor not to be used
......
...@@ -200,7 +200,7 @@ PQRYRES WMIColumns(PGLOBAL g, char *nsp, char *cls, bool info) ...@@ -200,7 +200,7 @@ PQRYRES WMIColumns(PGLOBAL g, char *nsp, char *cls, bool info)
} // endif res } // endif res
len = (unsigned)SysStringLen(propname); len = (unsigned)SysStringLen(propname);
length[0] = max(length[0], len); length[0] = MY_MAX(length[0], len);
} // enfor i } // enfor i
res = SafeArrayDestroy(prnlist); res = SafeArrayDestroy(prnlist);
......
...@@ -184,7 +184,7 @@ bool TDBXCL::OpenDB(PGLOBAL g) ...@@ -184,7 +184,7 @@ bool TDBXCL::OpenDB(PGLOBAL g)
/* Check and initialize the subtable columns. */ /* Check and initialize the subtable columns. */
/*********************************************************************/ /*********************************************************************/
for (PCOL cp = Columns; cp; cp = cp->GetNext()) for (PCOL cp = Columns; cp; cp = cp->GetNext())
if (((PXCLCOL)cp)->Init(g)) if (((PPRXCOL)cp)->Init(g))
return TRUE; return TRUE;
/*********************************************************************/ /*********************************************************************/
...@@ -240,12 +240,25 @@ XCLCOL::XCLCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) ...@@ -240,12 +240,25 @@ XCLCOL::XCLCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i)
: PRXCOL(cdp, tdbp, cprec, i, "XCL") : PRXCOL(cdp, tdbp, cprec, i, "XCL")
{ {
// Set additional XXL access method information for column. // Set additional XXL access method information for column.
Cbuf = (char*)PlugSubAlloc(g, NULL, Long + 1); Cbuf = NULL; // Will be allocated later
Cp = NULL; // Pointer to current position in Cbuf Cp = NULL; // Pointer to current position in Cbuf
Sep = ((PTDBXCL)tdbp)->Sep; Sep = ((PTDBXCL)tdbp)->Sep;
AddStatus(BUF_READ); // Only evaluated from TDBXCL::ReadDB AddStatus(BUF_READ); // Only evaluated from TDBXCL::ReadDB
} // end of XCLCOL constructor } // end of XCLCOL constructor
/***********************************************************************/
/* XCLCOL initialization routine. */
/* Allocate Cbuf that will contain the Colp value. */
/***********************************************************************/
bool XCLCOL::Init(PGLOBAL g, PTDBASE tp)
{
if (PRXCOL::Init(g, tp))
return true;
Cbuf = (char*)PlugSubAlloc(g, NULL, Colp->GetLength() + 1);
return false;
} // end of Init
/***********************************************************************/ /***********************************************************************/
/* What this routine does is to get the comma-separated string */ /* What this routine does is to get the comma-separated string */
/* from the source table column, extract the single values and */ /* from the source table column, extract the single values and */
...@@ -255,7 +268,8 @@ void XCLCOL::ReadColumn(PGLOBAL g) ...@@ -255,7 +268,8 @@ void XCLCOL::ReadColumn(PGLOBAL g)
{ {
if (((PTDBXCL)To_Tdb)->New) { if (((PTDBXCL)To_Tdb)->New) {
Colp->Eval(g); Colp->Eval(g);
strcpy(Cbuf, To_Val->GetCharValue()); strncpy(Cbuf, To_Val->GetCharValue(), Colp->GetLength());
Cbuf[Colp->GetLength()] = 0;
Cp = Cbuf; Cp = Cbuf;
} // endif New } // endif New
......
...@@ -90,6 +90,7 @@ class XCLCOL : public PRXCOL { ...@@ -90,6 +90,7 @@ class XCLCOL : public PRXCOL {
// Methods // Methods
virtual void Reset(void) {Colp->Reset();} // Evaluated only by TDBXCL virtual void Reset(void) {Colp->Reset();} // Evaluated only by TDBXCL
virtual void ReadColumn(PGLOBAL g); virtual void ReadColumn(PGLOBAL g);
virtual bool Init(PGLOBAL g, PTDBASE tp = NULL);
protected: protected:
// Default constructor not to be used // Default constructor not to be used
......
...@@ -91,32 +91,6 @@ PSZ strlwr(PSZ s); ...@@ -91,32 +91,6 @@ PSZ strlwr(PSZ s);
} }
#endif // !WIN32 #endif // !WIN32
/***********************************************************************/
/* Returns the bitmap representing the conditions that must not be */
/* met when returning from TestValue for a given operator. */
/* Bit one is EQ, bit 2 is LT, and bit 3 is GT. */
/***********************************************************************/
BYTE OpBmp(PGLOBAL g, OPVAL opc)
{
BYTE bt;
switch (opc) {
case OP_IN:
case OP_EQ: bt = 0x06; break;
case OP_NE: bt = 0x01; break;
case OP_GT: bt = 0x03; break;
case OP_GE: bt = 0x02; break;
case OP_LT: bt = 0x05; break;
case OP_LE: bt = 0x04; break;
case OP_EXIST: bt = 0x00; break;
default:
sprintf(g->Message, MSG(BAD_FILTER_OP), opc);
longjmp(g->jumper[g->jump_level], TYPE_ARRAY);
} // endswitch opc
return bt;
} // end of OpBmp
/***********************************************************************/ /***********************************************************************/
/* Get a long long number from its character representation. */ /* Get a long long number from its character representation. */
/* IN p: Pointer to the numeric string */ /* IN p: Pointer to the numeric string */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment