mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge 10.0-connect -> 10.0
This commit is contained in:
@@ -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)
|
|||||||
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)
|
|||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
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)
|
|||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
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 {
|
|||||||
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)
|
|||||||
// *((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)
|
|||||||
} // 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);
|
|||||||
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 */
|
|||||||
|
|
||||||
/*---------------- 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;
|
||||||
|
32
storage/connect/mysql-test/connect/r/datest.result
Normal file
32
storage/connect/mysql-test/connect/r/datest.result
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
#
|
||||||
|
# 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;
|
117
storage/connect/mysql-test/connect/r/mrr.result
Normal file
117
storage/connect/mysql-test/connect/r/mrr.result
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
#
|
||||||
|
# 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';
|
133
storage/connect/mysql-test/connect/r/updelx2.result
Normal file
133
storage/connect/mysql-test/connect/r/updelx2.result
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
#
|
||||||
|
# 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;
|
16
storage/connect/mysql-test/connect/t/datest.test
Normal file
16
storage/connect/mysql-test/connect/t/datest.test
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
--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;
|
66
storage/connect/mysql-test/connect/t/mrr.test
Normal file
66
storage/connect/mysql-test/connect/t/mrr.test
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
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
|
22
storage/connect/mysql-test/connect/t/updelx2.test
Normal file
22
storage/connect/mysql-test/connect/t/updelx2.test
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
-- 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);
|
|||||||
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)
|
|||||||
&& 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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
// 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)
|
|||||||
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)
|
|||||||
//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)
|
|||||||
//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)
|
|||||||
// 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)
|
|||||||
} 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)
|
|||||||
} // 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 {
|
|||||||
{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)
|
|||||||
} // 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)
|
|||||||
/* 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)
|
|||||||
: 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)
|
|||||||
{
|
{
|
||||||
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 {
|
|||||||
// 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);
|
|||||||
}
|
}
|
||||||
#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 */
|
||||||
|
Reference in New Issue
Block a user