Commit 6be6b4ab authored by Olivier Bertrand's avatar Olivier Bertrand

- All the processing of creating, dropping, modifying indexes was redesigned.

  The code was a legacy from the first versions of the XDB engine dating 2004
  and was not working anymore with recent versions of MySQL/MariaDB. A patch
  in create had been added but is was unsatisfying, recreating all indexes on
  any alter statement and sometimes doing nothing when it should have.
  This is a major update to be tested for stability. It was in most important
  cases et all current tests pass with this new version

modified:
  storage/connect/global.h
  storage/connect/ha_connect.cc
  storage/connect/ha_connect.h
  storage/connect/mycat.cc
  storage/connect/plugutil.c
  storage/connect/tabdos.cpp
  storage/connect/user_connect.cc
  storage/connect/user_connect.h
  storage/connect/xindex.h
parent b3b02104
...@@ -220,6 +220,7 @@ typedef struct _global { /* Global structure */ ...@@ -220,6 +220,7 @@ typedef struct _global { /* Global structure */
char Message[MAX_STR]; char Message[MAX_STR];
short Trace; short Trace;
int Createas; /* To pass info to created table */ int Createas; /* To pass info to created table */
void *Xchk; /* indexes in create/alter */
int jump_level; int jump_level;
jmp_buf jumper[MAX_JUMP + 2]; jmp_buf jumper[MAX_JUMP + 2];
} GLOBAL; } GLOBAL;
......
This diff is collapsed.
...@@ -31,23 +31,33 @@ ...@@ -31,23 +31,33 @@
/****************************************************************************/ /****************************************************************************/
typedef struct _create_xinfo { typedef struct _create_xinfo {
char *Type; /* Retrieved from table comment */ char *Type; /* Retrieved from table comment */
char *Filename; /* Set if not standard */ char *Filename; /* Set if not standard */
char *IndexFN; /* Set if not standard */ char *IndexFN; /* Set if not standard */
ulonglong Maxrows; /* Estimated max nb of rows */ ulonglong Maxrows; /* Estimated max nb of rows */
ulong Lrecl; /* Set if not default */ ulong Lrecl; /* Set if not default */
ulong Elements; /* Number of lines in blocks */ ulong Elements; /* Number of lines in blocks */
bool Fixed; /* False for DOS type */ bool Fixed; /* False for DOS type */
void *Pcf; /* To list of columns */ void *Pcf; /* To list of columns */
void *Pxdf; /* To list of indexes */ void *Pxdf; /* To list of indexes */
} CRXINFO, *PCXF; } CRXINFO, *PCXF;
typedef struct _xinfo { typedef struct _xinfo {
ulonglong data_file_length; /* Length of data file */ ulonglong data_file_length; /* Length of data file */
ha_rows records; /* Records in table */ ha_rows records; /* Records in table */
ulong mean_rec_length; /* Physical record length */ ulong mean_rec_length; /* Physical record length */
char *data_file_name; /* Physical file name */ char *data_file_name; /* Physical file name */
} XINFO, *PXF; } XINFO, *PXF;
class XCHK : public BLOCK {
public:
XCHK(void) {oldsep= newsep= false; oldpix= newpix= NULL;}
bool oldsep; // Sepindex before create/alter
bool newsep; // Sepindex after create/alter
PIXDEF oldpix; // The indexes before create/alter
PIXDEF newpix; // The indexes after create/alter
}; // end of class XCHK
typedef class XCHK *PCHK;
typedef class user_connect *PCONNECT; typedef class user_connect *PCONNECT;
typedef struct ha_table_option_struct TOS, *PTOS; typedef struct ha_table_option_struct TOS, *PTOS;
typedef struct ha_field_option_struct FOS, *PFOS; typedef struct ha_field_option_struct FOS, *PFOS;
...@@ -87,11 +97,12 @@ class ha_connect: public handler ...@@ -87,11 +97,12 @@ class ha_connect: public handler
char *GetStringOption(char *opname, char *sdef= NULL); char *GetStringOption(char *opname, char *sdef= NULL);
PTOS GetTableOptionStruct(TABLE *table_arg); PTOS GetTableOptionStruct(TABLE *table_arg);
bool GetBooleanOption(char *opname, bool bdef); bool GetBooleanOption(char *opname, bool bdef);
bool SetBooleanOption(char *opname, bool b);
int GetIntegerOption(char *opname); int GetIntegerOption(char *opname);
bool SetIntegerOption(char *opname, int n); bool SetIntegerOption(char *opname, int n);
PFOS GetFieldOptionStruct(Field *fp); PFOS GetFieldOptionStruct(Field *fp);
void *GetColumnOption(void *field, PCOLINFO pcf); void *GetColumnOption(void *field, PCOLINFO pcf);
PIXDEF GetIndexInfo(int n); PIXDEF GetIndexInfo(void);
const char *GetDBName(const char *name); const char *GetDBName(const char *name);
const char *GetTableName(void); const char *GetTableName(void);
int GetColNameLen(Field *fp); int GetColNameLen(Field *fp);
......
...@@ -556,26 +556,8 @@ int MYCAT::GetColCatInfo(PGLOBAL g, PTABDEF defp) ...@@ -556,26 +556,8 @@ int MYCAT::GetColCatInfo(PGLOBAL g, PTABDEF defp)
/***********************************************************************/ /***********************************************************************/
bool MYCAT::GetIndexInfo(PGLOBAL g, PTABDEF defp) bool MYCAT::GetIndexInfo(PGLOBAL g, PTABDEF defp)
{ {
PIXDEF xdp, pxd= NULL, toidx= NULL; // Attach new index(es)
defp->SetIndx(Hc->GetIndexInfo());
// Now take care of the index definitions
for (int n= 0; ; n++) {
if (xtrace)
printf("Getting index %d info\n", n + 1);
if (!(xdp= Hc->GetIndexInfo(n)))
break;
if (pxd)
pxd->SetNext(xdp);
else
toidx= xdp;
pxd= xdp;
} // endfor n
// All is correct, attach new index(es)
defp->SetIndx(toidx);
return false; return false;
} // end of GetIndexInfo } // end of GetIndexInfo
......
...@@ -152,6 +152,7 @@ PGLOBAL PlugInit(LPCSTR Language, uint worksize) ...@@ -152,6 +152,7 @@ PGLOBAL PlugInit(LPCSTR Language, uint worksize)
g->Trace = 0; g->Trace = 0;
g->Createas = 0; g->Createas = 0;
g->Activityp = g->ActivityStart = NULL; g->Activityp = g->ActivityStart = NULL;
g->Xchk = NULL;
strcpy(g->Message, ""); strcpy(g->Message, "");
/*******************************************************************/ /*******************************************************************/
......
...@@ -157,13 +157,13 @@ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf) ...@@ -157,13 +157,13 @@ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf)
char filename[_MAX_PATH]; char filename[_MAX_PATH];
bool sep, rc = false; bool sep, rc = false;
if (!pxdf) if (!To_Indx)
return false; // No index return false; // No index
// If true indexes are in separate files // If true indexes are in separate files
sep = Cat->GetBoolCatInfo("SepIndex", false); sep = Cat->GetBoolCatInfo("SepIndex", false);
if (!sep && To_Indx) { if (!sep && pxdf) {
strcpy(g->Message, MSG(NO_RECOV_SPACE)); strcpy(g->Message, MSG(NO_RECOV_SPACE));
return true; return true;
} // endif sep } // endif sep
...@@ -204,7 +204,7 @@ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf) ...@@ -204,7 +204,7 @@ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf)
#endif // UNIX #endif // UNIX
} // endfor pxdf } // endfor pxdf
} else { // !sep, no more indexes or name is NULL } else { // !sep
// Drop all indexes, delete the common file // Drop all indexes, delete the common file
PlugSetPath(filename, Ofn, GetPath()); PlugSetPath(filename, Ofn, GetPath());
strcat(PlugRemoveType(filename, filename), ftype); strcat(PlugRemoveType(filename, filename), ftype);
......
...@@ -70,7 +70,6 @@ user_connect::user_connect(THD *thd, const char *dbn) ...@@ -70,7 +70,6 @@ user_connect::user_connect(THD *thd, const char *dbn)
next= NULL; next= NULL;
previous= NULL; previous= NULL;
g= NULL; g= NULL;
tabp= NULL;
last_query_id= 0; last_query_id= 0;
count= 0; count= 0;
...@@ -141,6 +140,8 @@ bool user_connect::CheckCleanup(void) ...@@ -141,6 +140,8 @@ bool user_connect::CheckCleanup(void)
if (thdp->query_id > last_query_id) { if (thdp->query_id > last_query_id) {
PlugCleanup(g, true); PlugCleanup(g, true);
PlugSubSet(g, g->Sarea, g->Sarea_Size); PlugSubSet(g, g->Sarea, g->Sarea_Size);
g->Xchk = NULL;
g->Createas = 0;
last_query_id= thdp->query_id; last_query_id= thdp->query_id;
if (xtrace) if (xtrace)
......
...@@ -70,7 +70,6 @@ class user_connect ...@@ -70,7 +70,6 @@ class user_connect
PCONNECT previous; // Previous user in chain PCONNECT previous; // Previous user in chain
PGLOBAL g; // The common handle to CONNECT PGLOBAL g; // The common handle to CONNECT
//char dbname[32]; // The DBCONNECT database //char dbname[32]; // The DBCONNECT database
PTDBDOS tabp; // The table used on create
query_id_t last_query_id; // the latest user query id query_id_t last_query_id; // the latest user query id
int count; // if used by several handlers int count; // if used by several handlers
// Statistics // Statistics
......
...@@ -76,6 +76,7 @@ typedef struct index_off { ...@@ -76,6 +76,7 @@ typedef struct index_off {
class DllExport INDEXDEF : public BLOCK { /* Index description block */ class DllExport INDEXDEF : public BLOCK { /* Index description block */
friend class PLUGCAT; friend class PLUGCAT;
friend class DOSDEF; friend class DOSDEF;
friend class ha_connect;
friend int PlgMakeIndex(PGLOBAL g, PSZ name, PIXDEF pxdf, bool add); friend int PlgMakeIndex(PGLOBAL g, PSZ name, PIXDEF pxdf, bool add);
public: public:
// Constructor // Constructor
......
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