mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
This commit brings many changes, in particular two important ones:
1) Support of partitioning by connect. A table can be partitioned by files, this is an enhanced MULTIPLE table. It can be also partitioned by sub-tables like TBL and this enables table sharding. 2) Handling a CONNECT bug that causes in some cases extraneous rows to remain in the table after an UPDATE or DELETE when the command uses indexing (for not fixed file tables). Until a real fix is done, CONNECT tries to ignore indexing and if it cannot do it abort the command with an error message. - Add tests on partitioning added: storage/connect/mysql-test/connect/r/part_file.result storage/connect/mysql-test/connect/r/part_table.result storage/connect/mysql-test/connect/t/part_file.test storage/connect/mysql-test/connect/t/part_table.test - Temporary fix modified: sql/sql_partition.cc - Add partition support modified: storage/connect/ha_connect.cc storage/connect/ha_connect.h storage/connect/reldef.cpp storage/connect/reldef.h storage/connect/tabdos.cpp - Add functions ha_connect::IsUnique and ha_connect::CheckColumnList modified: storage/connect/ha_connect.cc storage/connect/ha_connect.h - Prevent updating a partition table column that is part of the partition function (outward tables only) modified: storage/connect/ha_connect.cc - Support INSERT/UPDATE/DELETE for PROXY tables modified: storage/connect/tabutil.cpp - Handle the bug on updating rows via indexing. Waiting for a real fix, Don't use indexing when possible else raise an error and abort. modified: storage/connect/ha_connect.cc - dbuserp->UseTemp set to TMP_AUTO modified: storage/connect/connect.cc - Add members nox, abort and only modified: storage/connect/ha_connect.cc storage/connect/ha_connect.h - Add arguments nox and abort to CntCloseTable modified: storage/connect/connect.cc storage/connect/connect.h storage/connect/filamap.cpp storage/connect/filamap.h storage/connect/filamdbf.cpp storage/connect/filamdbf.h storage/connect/filamfix.cpp storage/connect/filamfix.h storage/connect/filamtxt.cpp storage/connect/filamtxt.h storage/connect/filamvct.cpp storage/connect/filamvct.h storage/connect/filamzip.cpp storage/connect/filamzip.h storage/connect/ha_connect.cc - Add arguments abort to CloseTableFile and RenameTempFile modified: storage/connect/filamap.cpp storage/connect/filamap.h storage/connect/filamdbf.cpp storage/connect/filamdbf.h storage/connect/filamfix.cpp storage/connect/filamfix.h storage/connect/filamtxt.cpp storage/connect/filamtxt.h storage/connect/filamvct.cpp storage/connect/filamvct.h storage/connect/filamzip.cpp storage/connect/filamzip.h storage/connect/tabdos.cpp storage/connect/tabdos.h storage/connect/tabvct.cpp storage/connect/xtable.h - Fix info->records when file does not exists modified: storage/connect/connect.cc - Close XML table when opened for info modified: storage/connect/connect.cc - Add function VCTFAM::GetFileLength modified: storage/connect/filamvct.cpp storage/connect/filamvct.h - Column option DISTRIB -> ENUM modified: storage/connect/ha_connect.cc - Options connect, query_string and partname allways available modified: storage/connect/ha_connect.cc - Add function MYSQLC::GetTableSize modified: storage/connect/myconn.cpp storage/connect/myconn.h - Add new special columns (PARTNAME, FNAME, FPATH, FTYPE and FDISK) modified: storage/connect/colblk.cpp storage/connect/colblk.h storage/connect/plgdbsem.h storage/connect/table.cpp - Add function ExtractFromPath modified: storage/connect/colblk.cpp storage/connect/plgdbsem.h storage/connect/plgdbutl.cpp - Enhance Cardinality for some table types modified: storage/connect/tabdos.cpp storage/connect/tabmysql.cpp storage/connect/tabmysql.h storage/connect/tabodbc.cpp storage/connect/tabodbc.h storage/connect/tabsys.cpp storage/connect/tabsys.h storage/connect/xindex.cpp storage/connect/xindex.h storage/connect/xtable.h - Add test on special column modified: storage/connect/tabfmt.cpp - Add new files (added for block indexing) modified: storage/connect/CMakeLists.txt
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
/************* TabMySQL C++ Program Source Code File (.CPP) *************/
|
||||
/* PROGRAM NAME: TABMYSQL */
|
||||
/* ------------- */
|
||||
/* Version 1.8 */
|
||||
/* Version 1.9 */
|
||||
/* */
|
||||
/* AUTHOR: */
|
||||
/* ------- */
|
||||
@@ -69,6 +69,10 @@ void PrintResult(PGLOBAL, PSEM, PQRYRES);
|
||||
|
||||
extern "C" int trace;
|
||||
|
||||
// Used to check whether a MYSQL table is created on itself
|
||||
bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, const char *host,
|
||||
const char *db, char *tab, const char *src, int port);
|
||||
|
||||
/* -------------- Implementation of the MYSQLDEF class --------------- */
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -353,8 +357,12 @@ bool MYSQLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff)
|
||||
Tabname = Name;
|
||||
} // endif am
|
||||
|
||||
if ((Srcdef = GetStringCatInfo(g, "Srcdef", NULL)))
|
||||
if ((Srcdef = GetStringCatInfo(g, "Srcdef", NULL))) {
|
||||
Read_Only = true;
|
||||
Isview = true;
|
||||
} else if (CheckSelf(g, Hc->GetTable()->s, Hostname, Database,
|
||||
Tabname, Srcdef, Portnumber))
|
||||
return true;
|
||||
|
||||
// Used for Update and Delete
|
||||
Qrystr = GetStringCatInfo(g, "Query_String", "?");
|
||||
@@ -603,9 +611,7 @@ bool TDBMYSQL::MakeInsert(PGLOBAL g)
|
||||
else
|
||||
qlen += colp->GetLength();
|
||||
|
||||
} // endif Prep
|
||||
|
||||
if (Prep)
|
||||
} else // Prep
|
||||
strcat(valist, "?");
|
||||
|
||||
} // endfor colp
|
||||
@@ -740,33 +746,49 @@ int TDBMYSQL::MakeDelete(PGLOBAL g)
|
||||
#endif // 0
|
||||
|
||||
/***********************************************************************/
|
||||
/* XCV GetMaxSize: returns the maximum number of rows in the table. */
|
||||
/* MYSQL Cardinality: returns the number of rows in the table. */
|
||||
/***********************************************************************/
|
||||
int TDBMYSQL::Cardinality(PGLOBAL g)
|
||||
{
|
||||
if (!g)
|
||||
return (Mode == MODE_ANY && !Srcdef) ? 1 : 0;
|
||||
|
||||
if (Cardinal < 0 && Mode == MODE_ANY && !Srcdef) {
|
||||
// Info command, we must return the exact table row number
|
||||
char query[96];
|
||||
MYSQLC myc;
|
||||
|
||||
if (myc.Open(g, Host, Database, User, Pwd, Port))
|
||||
return -1;
|
||||
|
||||
strcpy(query, "SELECT COUNT(*) FROM ");
|
||||
|
||||
if (Quoted > 0)
|
||||
strcat(strcat(strcat(query, "`"), Tabname), "`");
|
||||
else
|
||||
strcat(query, Tabname);
|
||||
|
||||
Cardinal = myc.GetTableSize(g, query);
|
||||
myc.Close();
|
||||
} // endif Cardinal
|
||||
|
||||
return Cardinal;
|
||||
} // end of Cardinality
|
||||
|
||||
/***********************************************************************/
|
||||
/* MYSQL GetMaxSize: returns the maximum number of rows in the table. */
|
||||
/***********************************************************************/
|
||||
int TDBMYSQL::GetMaxSize(PGLOBAL g)
|
||||
{
|
||||
if (MaxSize < 0) {
|
||||
#if 0
|
||||
if (MakeSelect(g))
|
||||
return -2;
|
||||
if (Mode == MODE_DELETE)
|
||||
// Return 0 in mode DELETE in case of delete all.
|
||||
MaxSize = 0;
|
||||
else if (!Cardinality(NULL))
|
||||
MaxSize = 10; // To make MySQL happy
|
||||
else if ((MaxSize = Cardinality(g)) < 0)
|
||||
MaxSize = 12; // So we can see an error occured
|
||||
|
||||
if (!Myc.Connected()) {
|
||||
if (Myc.Open(g, Host, Database, User, Pwd, Port))
|
||||
return -1;
|
||||
|
||||
} // endif connected
|
||||
|
||||
if ((MaxSize = Myc.GetResultSize(g, Query)) < 0) {
|
||||
Myc.Close();
|
||||
return -3;
|
||||
} // endif MaxSize
|
||||
|
||||
// FIXME: Columns should be known when Info calls GetMaxSize
|
||||
if (!Columns)
|
||||
Query = NULL; // Must be remade when columns are known
|
||||
#endif // 0
|
||||
|
||||
// Return 0 in mode DELETE in case of delete all.
|
||||
MaxSize = (Mode == MODE_DELETE) ? 0 : 10; // To make MySQL happy
|
||||
} // endif MaxSize
|
||||
|
||||
return MaxSize;
|
||||
@@ -881,11 +903,12 @@ bool TDBMYSQL::OpenDB(PGLOBAL g)
|
||||
} // endif MakeInsert
|
||||
|
||||
if (m_Rc != RC_FX) {
|
||||
int rc;
|
||||
char cmd[64];
|
||||
int w;
|
||||
|
||||
sprintf(cmd, "ALTER TABLE `%s` DISABLE KEYS", Tabname);
|
||||
m_Rc = Myc.ExecSQL(g, cmd, &w);
|
||||
rc = Myc.ExecSQL(g, cmd, &w); // may fail for some engines
|
||||
} // endif m_Rc
|
||||
|
||||
} else
|
||||
@@ -1012,7 +1035,7 @@ bool TDBMYSQL::ReadKey(PGLOBAL g, OPVAL op, const void *key, int len)
|
||||
{
|
||||
int oldlen = strlen(Query);
|
||||
|
||||
if (op == OP_NEXT)
|
||||
if (!key || op == OP_NEXT)
|
||||
return false;
|
||||
else if (op == OP_FIRST) {
|
||||
if (To_CondFil)
|
||||
@@ -1129,7 +1152,7 @@ void TDBMYSQL::CloseDB(PGLOBAL g)
|
||||
dup->Step = "Enabling indexes";
|
||||
sprintf(cmd, "ALTER TABLE `%s` ENABLE KEYS", Tabname);
|
||||
Myc.m_Rows = -1; // To execute the query
|
||||
m_Rc = Myc.ExecSQL(g, cmd, &w);
|
||||
m_Rc = Myc.ExecSQL(g, cmd, &w); // May fail for some engines
|
||||
} // endif m_Rc
|
||||
|
||||
Myc.Close();
|
||||
|
Reference in New Issue
Block a user