Commit 4dafdf16 authored by Alexander Barkov's avatar Alexander Barkov

Merge 10.0-connect -> 10.0.

parents 0c0fe7a8 d8ac8d18
...@@ -41,6 +41,7 @@ COLBLK::COLBLK(PCOLDEF cdp, PTDB tdbp, int i) ...@@ -41,6 +41,7 @@ COLBLK::COLBLK(PCOLDEF cdp, PTDB tdbp, int i)
Buf_Type = cdp->Buf_Type; Buf_Type = cdp->Buf_Type;
ColUse |= cdp->Flags; // Used by CONNECT ColUse |= cdp->Flags; // Used by CONNECT
Nullable = !!(cdp->Flags & U_NULLS); Nullable = !!(cdp->Flags & U_NULLS);
Unsigned = !!(cdp->Flags & U_UNSIGNED);
} else { } else {
Name = NULL; Name = NULL;
memset(&Format, 0, sizeof(FORMAT)); memset(&Format, 0, sizeof(FORMAT));
...@@ -48,6 +49,7 @@ COLBLK::COLBLK(PCOLDEF cdp, PTDB tdbp, int i) ...@@ -48,6 +49,7 @@ COLBLK::COLBLK(PCOLDEF cdp, PTDB tdbp, int i)
Long = 0; Long = 0;
Buf_Type = TYPE_ERROR; Buf_Type = TYPE_ERROR;
Nullable = false; Nullable = false;
Unsigned = false;
} // endif cdp } // endif cdp
To_Tdb = tdbp; To_Tdb = tdbp;
...@@ -171,9 +173,12 @@ bool COLBLK::InitValue(PGLOBAL g) ...@@ -171,9 +173,12 @@ bool COLBLK::InitValue(PGLOBAL g)
if (Value) if (Value)
return false; // Already done return false; // Already done
// Unsigned can be set only for valid value types
int prec = (Unsigned) ? 1 : GetPrecision();
// Allocate a Value object // Allocate a Value object
if (!(Value = AllocateValue(g, Buf_Type, Format.Length, if (!(Value = AllocateValue(g, Buf_Type, Format.Length,
GetPrecision(), GetDomain()))) prec, GetDomain())))
return true; return true;
AddStatus(BUF_READY); AddStatus(BUF_READY);
......
...@@ -83,6 +83,7 @@ class DllExport COLBLK : public XOBJECT { ...@@ -83,6 +83,7 @@ class DllExport COLBLK : public XOBJECT {
PTDB To_Tdb; // Points to Table Descriptor Block PTDB To_Tdb; // Points to Table Descriptor Block
PXCOL To_Kcol; // Points to Xindex matching column PXCOL To_Kcol; // Points to Xindex matching column
bool Nullable; // True if nullable bool Nullable; // True if nullable
bool Unsigned; // True if unsigned
int Index; // Column number in table int Index; // Column number in table
int Opt; // Cluster/sort information int Opt; // Cluster/sort information
int Buf_Type; // Data type int Buf_Type; // Data type
......
...@@ -591,7 +591,7 @@ int CntIndexInit(PGLOBAL g, PTDB ptdb, int id) ...@@ -591,7 +591,7 @@ int CntIndexInit(PGLOBAL g, PTDB ptdb, int id)
if (!ptdb) if (!ptdb)
return -1; return -1;
else if (!((PTDBASE)ptdb)->GetDef()->Indexable()) { else if (!((PTDBASE)ptdb)->GetDef()->Indexable()) {
sprintf(g->Message, "Table %s is not indexable", ptdb->GetName()); sprintf(g->Message, "CntIndexInit: Table %s is not indexable", ptdb->GetName());
return 0; return 0;
} else } else
tdbp= (PTDBDOX)ptdb; tdbp= (PTDBDOX)ptdb;
...@@ -685,6 +685,7 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op, ...@@ -685,6 +685,7 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op,
char *kp= (char*)key; char *kp= (char*)key;
int n; int n;
short lg; short lg;
bool rcb;
RCODE rc; RCODE rc;
PVAL valp; PVAL valp;
PCOL colp; PCOL colp;
...@@ -694,7 +695,7 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op, ...@@ -694,7 +695,7 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op,
if (!ptdb) if (!ptdb)
return RC_FX; return RC_FX;
if (!((PTDBASE)ptdb)->GetDef()->Indexable()) { if (!((PTDBASE)ptdb)->GetDef()->Indexable()) {
sprintf(g->Message, "Table %s is not indexable", ptdb->GetName()); sprintf(g->Message, "CntIndexRead: Table %s is not indexable", ptdb->GetName());
return RC_FX; return RC_FX;
} else } else
tdbp= (PTDBDOX)ptdb; tdbp= (PTDBDOX)ptdb;
...@@ -719,9 +720,20 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op, ...@@ -719,9 +720,20 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op,
if (colp->GetColUse(U_VAR)) { if (colp->GetColUse(U_VAR)) {
lg= *(short*)kp; lg= *(short*)kp;
kp+= sizeof(short); kp+= sizeof(short);
valp->SetValue_char(kp, (int)lg); rcb= valp->SetValue_char(kp, (int)lg);
} else } else
valp->SetValue_char(kp, valp->GetClen()); rcb= valp->SetValue_char(kp, valp->GetClen());
if (rcb) {
if (tdbp->RowNumber(g))
sprintf(g->Message, "Out of range value for column %s at row %d",
colp->GetName(), tdbp->RowNumber(g));
else
sprintf(g->Message, "Out of range value for column %s",
colp->GetName());
PushWarning(g, tdbp);
} // endif b
} else } else
valp->SetBinValue((void*)kp); valp->SetBinValue((void*)kp);
...@@ -759,7 +771,7 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len, ...@@ -759,7 +771,7 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len,
const uchar *p, *kp; const uchar *p, *kp;
int i, n, k[2]; int i, n, k[2];
short lg; short lg;
bool b; bool b, rcb;
PVAL valp; PVAL valp;
PCOL colp; PCOL colp;
PTDBDOX tdbp; PTDBDOX tdbp;
...@@ -768,7 +780,7 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len, ...@@ -768,7 +780,7 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len,
if (!ptdb) if (!ptdb)
return -1; return -1;
else if (!((PTDBASE)ptdb)->GetDef()->Indexable()) { else if (!((PTDBASE)ptdb)->GetDef()->Indexable()) {
sprintf(g->Message, "Table %s is not indexable", ptdb->GetName()); sprintf(g->Message, "CntIndexRange: Table %s is not indexable", ptdb->GetName());
DBUG_PRINT("Range", ("%s", g->Message)); DBUG_PRINT("Range", ("%s", g->Message));
return -1; return -1;
} else } else
...@@ -802,9 +814,21 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len, ...@@ -802,9 +814,21 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len,
if (colp->GetColUse(U_VAR)) { if (colp->GetColUse(U_VAR)) {
lg= *(short*)p; lg= *(short*)p;
p+= sizeof(short); p+= sizeof(short);
valp->SetValue_char((char*)p, (int)lg); rcb= valp->SetValue_char((char*)p, (int)lg);
} else } else
valp->SetValue_char((char*)p, valp->GetClen()); rcb= valp->SetValue_char((char*)p, valp->GetClen());
if (rcb) {
if (tdbp->RowNumber(g))
sprintf(g->Message,
"Out of range value for column %s at row %d",
colp->GetName(), tdbp->RowNumber(g));
else
sprintf(g->Message, "Out of range value for column %s",
colp->GetName());
PushWarning(g, tdbp);
} // endif b
} else } else
valp->SetBinValue((void*)p); valp->SetBinValue((void*)p);
......
...@@ -165,7 +165,7 @@ extern "C" char nmfile[]; ...@@ -165,7 +165,7 @@ extern "C" char nmfile[];
extern "C" char pdebug[]; extern "C" char pdebug[];
extern "C" { extern "C" {
char version[]= "Version 1.01.0009 October 29, 2013"; char version[]= "Version 1.01.0010 November 30, 2013";
#if defined(XMSG) #if defined(XMSG)
char msglang[]; // Default message language char msglang[]; // Default message language
...@@ -777,7 +777,7 @@ int ha_connect::GetIntegerOption(char *opname) ...@@ -777,7 +777,7 @@ int ha_connect::GetIntegerOption(char *opname)
if (opval == (ulonglong)NO_IVAL && options && options->oplist) if (opval == (ulonglong)NO_IVAL && options && options->oplist)
if ((pv= GetListOption(xp->g, opname, options->oplist))) if ((pv= GetListOption(xp->g, opname, options->oplist)))
opval= (unsigned)atoll(pv); opval= CharToNumber(pv, strlen(pv), ULONGLONG_MAX, true);
return (int)opval; return (int)opval;
} // end of GetIntegerOption } // end of GetIntegerOption
...@@ -936,6 +936,12 @@ void *ha_connect::GetColumnOption(PGLOBAL g, void *field, PCOLINFO pcf) ...@@ -936,6 +936,12 @@ void *ha_connect::GetColumnOption(PGLOBAL g, void *field, PCOLINFO pcf)
break; break;
} // endswitch type } // endswitch type
if (fp->flags & UNSIGNED_FLAG)
pcf->Flags |= U_UNSIGNED;
if (fp->flags & ZEROFILL_FLAG)
pcf->Flags |= U_ZEROFILL;
// This is used to skip null bit // This is used to skip null bit
if (fp->real_maybe_null()) if (fp->real_maybe_null())
pcf->Flags |= U_NULLS; pcf->Flags |= U_NULLS;
...@@ -1341,7 +1347,15 @@ int ha_connect::MakeRecord(char *buf) ...@@ -1341,7 +1347,15 @@ int ha_connect::MakeRecord(char *buf)
} else } else
if (fp->store(value->GetFloatValue())) { if (fp->store(value->GetFloatValue())) {
rc= HA_ERR_WRONG_IN_RECORD; // rc= HA_ERR_WRONG_IN_RECORD; a Warning was ignored
char buf[128];
THD *thd= ha_thd();
sprintf(buf, "Out of range value for column '%s' at row %ld",
fp->field_name,
thd->get_stmt_da()->current_row_for_warning());
push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, buf);
DBUG_PRINT("MakeRecord", ("%s", value->GetCharString(val))); DBUG_PRINT("MakeRecord", ("%s", value->GetCharString(val)));
} // endif store } // endif store
...@@ -1930,7 +1944,7 @@ int ha_connect::optimize(THD* thd, HA_CHECK_OPT* check_opt) ...@@ -1930,7 +1944,7 @@ int ha_connect::optimize(THD* thd, HA_CHECK_OPT* check_opt)
if (tdbp || (tdbp= GetTDB(g))) { if (tdbp || (tdbp= GetTDB(g))) {
if (!((PTDBASE)tdbp)->GetDef()->Indexable()) { if (!((PTDBASE)tdbp)->GetDef()->Indexable()) {
sprintf(g->Message, "Table %s is not indexable", tdbp->GetName()); sprintf(g->Message, "optimize: Table %s is not indexable", tdbp->GetName());
rc= HA_ERR_INTERNAL_ERROR; rc= HA_ERR_INTERNAL_ERROR;
} else if ((rc= ((PTDBASE)tdbp)->ResetTableOpt(g, true))) { } else if ((rc= ((PTDBASE)tdbp)->ResetTableOpt(g, true))) {
if (rc == RC_INFO) { if (rc == RC_INFO) {
...@@ -2392,9 +2406,12 @@ int ha_connect::rnd_init(bool scan) ...@@ -2392,9 +2406,12 @@ int ha_connect::rnd_init(bool scan)
if (!g || !table || xmod == MODE_INSERT) if (!g || !table || xmod == MODE_INSERT)
DBUG_RETURN(HA_ERR_INITIALIZATION); DBUG_RETURN(HA_ERR_INITIALIZATION);
// Close the table if it was opened yet (locked?) // Do not close the table if it was opened yet (locked?)
if (IsOpened()) if (IsOpened())
CloseTable(g); DBUG_RETURN(0);
// CloseTable(g); Was done before making things done twice
else if (xp->CheckQuery(valid_query_id))
tdbp= NULL; // Not valid anymore
// When updating, to avoid skipped update, force the table // When updating, to avoid skipped update, force the table
// handler to retrieve write-only fields to be able to compare // handler to retrieve write-only fields to be able to compare
...@@ -2521,7 +2538,7 @@ int ha_connect::rnd_next(uchar *buf) ...@@ -2521,7 +2538,7 @@ int ha_connect::rnd_next(uchar *buf)
void ha_connect::position(const uchar *record) void ha_connect::position(const uchar *record)
{ {
DBUG_ENTER("ha_connect::position"); DBUG_ENTER("ha_connect::position");
if (((PTDBASE)tdbp)->GetDef()->Indexable()) //if (((PTDBASE)tdbp)->GetDef()->Indexable())
my_store_ptr(ref, ref_length, (my_off_t)((PTDBASE)tdbp)->GetRecpos()); my_store_ptr(ref, ref_length, (my_off_t)((PTDBASE)tdbp)->GetRecpos());
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} // end of position } // end of position
...@@ -3030,12 +3047,18 @@ int ha_connect::external_lock(THD *thd, int lock_type) ...@@ -3030,12 +3047,18 @@ int ha_connect::external_lock(THD *thd, int lock_type)
rc= 2; // Logical error ??? rc= 2; // Logical error ???
else if (g->Xchk) { else if (g->Xchk) {
if (!tdbp || *tdbp->GetName() == '#') { if (!tdbp || *tdbp->GetName() == '#') {
if (!tdbp && !(tdbp= GetTDB(g)))
DBUG_RETURN(HA_ERR_INTERNAL_ERROR);
else if (!((PTDBASE)tdbp)->GetDef()->Indexable()) {
sprintf(g->Message, "external_lock: Table %s is not indexable", tdbp->GetName());
// DBUG_RETURN(HA_ERR_INTERNAL_ERROR);
push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
DBUG_RETURN(0);
} // endif Indexable
bool oldsep= ((PCHK)g->Xchk)->oldsep; bool oldsep= ((PCHK)g->Xchk)->oldsep;
bool newsep= ((PCHK)g->Xchk)->newsep; bool newsep= ((PCHK)g->Xchk)->newsep;
PTDBDOS tdp= (PTDBDOS)(tdbp ? tdbp : GetTDB(g)); PTDBDOS tdp= (PTDBDOS)tdbp;
if (!tdp)
DBUG_RETURN(HA_ERR_INTERNAL_ERROR);
PDOSDEF ddp= (PDOSDEF)tdp->GetDef(); PDOSDEF ddp= (PDOSDEF)tdp->GetDef();
PIXDEF xp, xp1, xp2, drp=NULL, adp= NULL; PIXDEF xp, xp1, xp2, drp=NULL, adp= NULL;
...@@ -3145,7 +3168,8 @@ int ha_connect::external_lock(THD *thd, int lock_type) ...@@ -3145,7 +3168,8 @@ int ha_connect::external_lock(THD *thd, int lock_type)
g->Xchk= new(g) XCHK; g->Xchk= new(g) XCHK;
((PCHK)g->Xchk)->oldsep= GetBooleanOption("Sepindex", false); ((PCHK)g->Xchk)->oldsep= GetBooleanOption("Sepindex", false);
((PCHK)g->Xchk)->oldpix= GetIndexInfo(); ((PCHK)g->Xchk)->oldpix= GetIndexInfo();
} // endif xcheck } else
g->Xchk= NULL;
if (cras) if (cras)
g->Createas= 1; // To tell created table to ignore FLAG g->Createas= 1; // To tell created table to ignore FLAG
...@@ -3464,25 +3488,45 @@ static bool add_fields(PGLOBAL g, ...@@ -3464,25 +3488,45 @@ static bool add_fields(PGLOBAL g,
// void *vcolinfo, // void *vcolinfo,
// engine_option_value *create_options, // engine_option_value *create_options,
int flg, int flg,
bool dbf) bool dbf,
char v)
{ {
register Create_field *new_field; register Create_field *new_field;
char *length, *decimals; char *length, *decimals= NULL;
enum_field_types type= PLGtoMYSQL(typ, dbf); enum_field_types type;
//Virtual_column_info *vcol_info= (Virtual_column_info *)vcolinfo; //Virtual_column_info *vcol_info= (Virtual_column_info *)vcolinfo;
engine_option_value *crop; engine_option_value *crop;
LEX_STRING *comment= thd->make_lex_string(rem, strlen(rem)); LEX_STRING *comment;
LEX_STRING *field_name= thd->make_lex_string(name, strlen(name)); LEX_STRING *field_name;
DBUG_ENTER("ha_connect::add_fields"); DBUG_ENTER("ha_connect::add_fields");
length= (char*)PlugSubAlloc(g, NULL, 8);
sprintf(length, "%d", len);
if (dec) { if (len) {
decimals= (char*)PlugSubAlloc(g, NULL, 8); if (!v && typ == TYPE_STRING && len > 255)
sprintf(decimals, "%d", dec); v= 'V'; // Change CHAR to VARCHAR
length= (char*)PlugSubAlloc(g, NULL, 8);
sprintf(length, "%d", len);
if (typ == TYPE_FLOAT) {
decimals= (char*)PlugSubAlloc(g, NULL, 8);
sprintf(decimals, "%d", min(dec, (min(len, 31) - 1)));
} // endif dec
} else } else
decimals= NULL; length= NULL;
if (!rem)
rem= "";
type= PLGtoMYSQL(typ, dbf, v);
comment= thd->make_lex_string(rem, strlen(rem));
field_name= thd->make_lex_string(name, strlen(name));
switch (v) {
case 'Z': type_modifier|= ZEROFILL_FLAG;
case 'U': type_modifier|= UNSIGNED_FLAG; break;
} // endswitch v
if (flg) { if (flg) {
engine_option_value *start= NULL, *end= NULL; engine_option_value *start= NULL, *end= NULL;
...@@ -3511,7 +3555,7 @@ static bool add_fields(PGLOBAL g, ...@@ -3511,7 +3555,7 @@ static bool add_fields(PGLOBAL g,
#else // !NEW_WAY #else // !NEW_WAY
static bool add_field(String *sql, const char *field_name, int typ, static bool add_field(String *sql, const char *field_name, int typ,
int len, int dec, uint tm, const char *rem, int len, int dec, uint tm, const char *rem,
int flag, bool dbf, char v) char *dft, int flag, bool dbf, char v)
{ {
char var = (len > 255) ? 'V' : v; char var = (len > 255) ? 'V' : v;
bool error= false; bool error= false;
...@@ -3528,16 +3572,33 @@ static bool add_field(String *sql, const char *field_name, int typ, ...@@ -3528,16 +3572,33 @@ static bool add_field(String *sql, const char *field_name, int typ,
if (!strcmp(type, "DOUBLE")) { if (!strcmp(type, "DOUBLE")) {
error|= sql->append(','); error|= sql->append(',');
// dec must be <= len and <= 31 // dec must be < len and < 31
error|= sql->append_ulonglong(min(dec, (len - 1))); error|= sql->append_ulonglong(min(dec, (min(len, 31) - 1)));
} // endif dec } // endif dec
error|= sql->append(')'); error|= sql->append(')');
} // endif len } // endif len
if (v == 'U')
error|= sql->append(" UNSIGNED");
else if (v == 'Z')
error|= sql->append(" ZEROFILL");
if (tm) if (tm)
error|= sql->append(STRING_WITH_LEN(" NOT NULL"), system_charset_info); error|= sql->append(STRING_WITH_LEN(" NOT NULL"), system_charset_info);
if (dft && *dft) {
error|= sql->append(" DEFAULT ");
if (IsTypeChar(typ)) {
error|= sql->append("'");
error|= sql->append_for_single_quote(dft, strlen(dft));
error|= sql->append("'");
} else
error|= sql->append(dft);
} // endif rem
if (rem && *rem) { if (rem && *rem) {
error|= sql->append(" COMMENT '"); error|= sql->append(" COMMENT '");
error|= sql->append_for_single_quote(rem, strlen(rem)); error|= sql->append_for_single_quote(rem, strlen(rem));
...@@ -3808,7 +3869,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, ...@@ -3808,7 +3869,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
TABLE_SHARE *table_s, TABLE_SHARE *table_s,
HA_CREATE_INFO *create_info) HA_CREATE_INFO *create_info)
{ {
char spc= ',', qch= 0; char v, spc= ',', qch= 0;
const char *fncn= "?"; const char *fncn= "?";
const char *user, *fn, *db, *host, *pwd, *sep, *tbl, *src; const char *user, *fn, *db, *host, *pwd, *sep, *tbl, *src;
const char *col, *ocl, *rnk, *pic, *fcl; const char *col, *ocl, *rnk, *pic, *fcl;
...@@ -3830,7 +3891,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, ...@@ -3830,7 +3891,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
//CHARSET_INFO *cs; //CHARSET_INFO *cs;
Alter_info alter_info; Alter_info alter_info;
#else // !NEW_WAY #else // !NEW_WAY
char v, buf[1024]; char buf[1024];
String sql(buf, sizeof(buf), system_charset_info); String sql(buf, sizeof(buf), system_charset_info);
sql.copy(STRING_WITH_LEN("CREATE TABLE whatever ("), system_charset_info); sql.copy(STRING_WITH_LEN("CREATE TABLE whatever ("), system_charset_info);
...@@ -3924,7 +3985,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, ...@@ -3924,7 +3985,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
tab= table_s->table_name.str; // Default value tab= table_s->table_name.str; // Default value
#if defined(NEW_WAY) #if defined(NEW_WAY)
add_option(thd, create_info, "tabname", tab); // add_option(thd, create_info, "tabname", tab);
#endif // NEW_WAY #endif // NEW_WAY
} // endif tab } // endif tab
...@@ -4044,8 +4105,8 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, ...@@ -4044,8 +4105,8 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
} // endif src } // endif src
if (ok) { if (ok) {
char *cnm, *rem; char *cnm, *rem, *dft;
int i, len, dec, typ, flg; int i, len, prec, dec, typ, flg;
PDBUSER dup= PlgGetUser(g); PDBUSER dup= PlgGetUser(g);
PCATLG cat= (dup) ? dup->Catalog : NULL; PCATLG cat= (dup) ? dup->Catalog : NULL;
...@@ -4151,19 +4212,21 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, ...@@ -4151,19 +4212,21 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
#if defined(NEW_WAY) #if defined(NEW_WAY)
// Now add the field // Now add the field
rc= add_fields(g, thd, &alter_info, cnm, typ, len, dec, rc= add_fields(g, thd, &alter_info, cnm, typ, len, dec,
NOT_NULL_FLAG, "", flg, dbf); NOT_NULL_FLAG, "", flg, dbf, 0);
#else // !NEW_WAY #else // !NEW_WAY
// Now add the field // Now add the field
if (add_field(&sql, cnm, typ, len, dec, NOT_NULL_FLAG, 0, flg, dbf, 0)) if (add_field(&sql, cnm, typ, len, dec, NOT_NULL_FLAG,
0, NULL, flg, dbf, 0))
rc= HA_ERR_OUT_OF_MEM; rc= HA_ERR_OUT_OF_MEM;
#endif // !NEW_WAY #endif // !NEW_WAY
} // endfor crp } // endfor crp
} else // Not a catalog table } else // Not a catalog table
for (i= 0; !rc && i < qrp->Nblin; i++) { for (i= 0; !rc && i < qrp->Nblin; i++) {
typ= len= dec= 0; typ= len= prec= dec= 0;
tm= NOT_NULL_FLAG; tm= NOT_NULL_FLAG;
cnm= (char*)"noname"; cnm= (char*)"noname";
dft= NULL;
#if defined(NEW_WAY) #if defined(NEW_WAY)
rem= ""; rem= "";
// cs= NULL; // cs= NULL;
...@@ -4181,6 +4244,10 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, ...@@ -4181,6 +4244,10 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
v = (crp->Nulls) ? crp->Nulls[i] : 0; v = (crp->Nulls) ? crp->Nulls[i] : 0;
break; break;
case FLD_PREC: case FLD_PREC:
// PREC must be always before LENGTH
len= prec= crp->Kdata->GetIntValue(i);
break;
case FLD_LENGTH:
len= crp->Kdata->GetIntValue(i); len= crp->Kdata->GetIntValue(i);
break; break;
case FLD_SCALE: case FLD_SCALE:
...@@ -4200,6 +4267,9 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, ...@@ -4200,6 +4267,9 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
// cs= get_charset_by_name(csn, 0); // cs= get_charset_by_name(csn, 0);
// break; // break;
case FLD_DEFAULT:
dft= crp->Kdata->GetCharValue(i);
break;
default: default:
break; // Ignore break; // Ignore
} // endswitch Fld } // endswitch Fld
...@@ -4209,16 +4279,16 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, ...@@ -4209,16 +4279,16 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
int plgtyp; int plgtyp;
// typ must be PLG type, not SQL type // typ must be PLG type, not SQL type
if (!(plgtyp= TranslateSQLType(typ, dec, len, v))) { if (!(plgtyp= TranslateSQLType(typ, dec, prec, v))) {
sprintf(g->Message, "Unsupported SQL type %d", typ); sprintf(g->Message, "Unsupported SQL type %d", typ);
my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0));
return HA_ERR_INTERNAL_ERROR; return HA_ERR_INTERNAL_ERROR;
} else } else
typ= plgtyp; typ= plgtyp;
// Some data sources do not count dec in length // Some data sources do not count dec in length (prec)
if (typ == TYPE_FLOAT) if (typ == TYPE_FLOAT)
len += (dec + 2); // To be safe prec += (dec + 2); // To be safe
else else
dec= 0; dec= 0;
...@@ -4227,14 +4297,16 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, ...@@ -4227,14 +4297,16 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
// Make the arguments as required by add_fields // Make the arguments as required by add_fields
if (typ == TYPE_DATE) if (typ == TYPE_DATE)
len= 0; prec= 0;
else if (typ == TYPE_FLOAT)
prec= len;
// Now add the field // Now add the field
#if defined(NEW_WAY) #if defined(NEW_WAY)
rc= add_fields(g, thd, &alter_info, cnm, typ, len, dec, rc= add_fields(g, thd, &alter_info, cnm, typ, prec, dec,
tm, rem, 0, true); tm, rem, 0, dbf, v);
#else // !NEW_WAY #else // !NEW_WAY
if (add_field(&sql, cnm, typ, len, dec, tm, rem, 0, dbf, v)) if (add_field(&sql, cnm, typ, prec, dec, tm, rem, dft, 0, dbf, v))
rc= HA_ERR_OUT_OF_MEM; rc= HA_ERR_OUT_OF_MEM;
#endif // !NEW_WAY #endif // !NEW_WAY
} // endfor i } // endfor i
...@@ -4553,9 +4625,9 @@ int ha_connect::create(const char *name, TABLE *table_arg, ...@@ -4553,9 +4625,9 @@ int ha_connect::create(const char *name, TABLE *table_arg,
} // endfor field } // endfor field
if (IsFileType(type)) { table= table_arg; // Used by called functions
table= table_arg; // Used by called functions
if (IsFileType(type)) {
if (!options->filename) { if (!options->filename) {
// The file name is not specified, create a default file in // The file name is not specified, create a default file in
// the database directory named table_name.table_type. // the database directory named table_name.table_type.
...@@ -4619,42 +4691,63 @@ int ha_connect::create(const char *name, TABLE *table_arg, ...@@ -4619,42 +4691,63 @@ int ha_connect::create(const char *name, TABLE *table_arg,
} // endif filename } // endif filename
// To check whether indexes have to be made or remade } // endif type
if (!g->Xchk) {
PIXDEF xdp; // To check whether indexes have to be made or remade
if (!g->Xchk) {
PIXDEF xdp;
// We should be in CREATE TABLE // We should be in CREATE TABLE
if (thd_sql_command(table->in_use) != SQLCOM_CREATE_TABLE) if (thd_sql_command(table->in_use) != SQLCOM_CREATE_TABLE)
push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0,
"Wrong command in create, please contact CONNECT team"); "Wrong command in create, please contact CONNECT team");
// Get the index definitions // Get the index definitions
if (xdp= GetIndexInfo()) { if (xdp= GetIndexInfo()) {
if (IsTypeIndexable(type)) {
PDBUSER dup= PlgGetUser(g); PDBUSER dup= PlgGetUser(g);
PCATLG cat= (dup) ? dup->Catalog : NULL; PCATLG cat= (dup) ? dup->Catalog : NULL;
if (cat) { if (cat) {
cat->SetDataPath(g, table_arg->s->db.str); cat->SetDataPath(g, table_arg->s->db.str);
if ((rc= optimize(table->in_use, NULL))) { if ((rc= optimize(table->in_use, NULL))) {
printf("Create rc=%d %s\n", rc, g->Message); printf("Create rc=%d %s\n", rc, g->Message);
my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0));
rc= HA_ERR_INTERNAL_ERROR; rc= HA_ERR_INTERNAL_ERROR;
} else } else
CloseTable(g); CloseTable(g);
} // endif cat } // endif cat
} else {
sprintf(g->Message, "Table type %s is not indexable", options->type);
my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0));
rc= HA_ERR_INTERNAL_ERROR;
} // endif Indexable
} // endif xdp } // endif xdp
} else { } else {
((PCHK)g->Xchk)->newsep= GetBooleanOption("Sepindex", false); PIXDEF xdp= GetIndexInfo();
((PCHK)g->Xchk)->newpix= GetIndexInfo();
} // endif Xchk
table= st; if (xdp) {
} // endif type if (!IsTypeIndexable(type)) {
g->Xchk= NULL;
sprintf(g->Message, "Table type %s is not indexable", options->type);
my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0));
rc= HA_ERR_INTERNAL_ERROR;
} else {
((PCHK)g->Xchk)->newpix= xdp;
((PCHK)g->Xchk)->newsep= GetBooleanOption("Sepindex", false);
} // endif Indexable
} else if (!((PCHK)g->Xchk)->oldpix)
g->Xchk= NULL;
} // endif Xchk
table= st;
DBUG_RETURN(rc); DBUG_RETURN(rc);
} // end of create } // end of create
......
...@@ -172,21 +172,6 @@ bool IsTypeNullable(TABTYPE type) ...@@ -172,21 +172,6 @@ bool IsTypeNullable(TABTYPE type)
{ {
bool nullable; bool nullable;
#if 0
switch (type) {
case TAB_ODBC:
case TAB_MYSQL:
case TAB_TBL:
case TAB_INI:
case TAB_XML:
nullable= true;
break;
default:
nullable= false;
break;
} // endswitch type
#endif // 0
switch (type) { switch (type) {
case TAB_MAC: case TAB_MAC:
case TAB_DIR: case TAB_DIR:
...@@ -222,6 +207,31 @@ bool IsTypeFixed(TABTYPE type) ...@@ -222,6 +207,31 @@ bool IsTypeFixed(TABTYPE type)
return fix; return fix;
} // end of IsTypeFixed } // end of IsTypeFixed
/***********************************************************************/
/* Return true for table types with fix length records. */
/***********************************************************************/
bool IsTypeIndexable(TABTYPE type)
{
bool idx;
switch (type) {
case TAB_DOS:
case TAB_CSV:
case TAB_FMT:
case TAB_FIX:
case TAB_BIN:
case TAB_VEC:
case TAB_DBF:
idx= true;
break;
default:
idx= false;
break;
} // endswitch type
return idx;
} // end of IsTypeIndexable
/***********************************************************************/ /***********************************************************************/
/* Get a unique enum catalog function ID. */ /* Get a unique enum catalog function ID. */
/***********************************************************************/ /***********************************************************************/
......
...@@ -38,6 +38,7 @@ TABTYPE GetTypeID(const char *type); ...@@ -38,6 +38,7 @@ TABTYPE GetTypeID(const char *type);
bool IsFileType(TABTYPE type); bool IsFileType(TABTYPE type);
bool IsTypeNullable(TABTYPE type); bool IsTypeNullable(TABTYPE type);
bool IsTypeFixed(TABTYPE type); bool IsTypeFixed(TABTYPE type);
bool IsTypeIndexable(TABTYPE type);
uint GetFuncID(const char *func); uint GetFuncID(const char *func);
/***********************************************************************/ /***********************************************************************/
......
...@@ -46,21 +46,6 @@ ...@@ -46,21 +46,6 @@
#define DLL_EXPORT // Items are exported from this DLL #define DLL_EXPORT // Items are exported from this DLL
#include "myconn.h" #include "myconn.h"
#if defined(EMBEDDED)
static char *server_args[] = {
"this_program", /* this string is not used */
"--skip-bdb",
"--skip-innodb"
};
static char *server_groups[] = {
"PlugDB_SERVER",
"embedded",
"server",
(char *)NULL
};
#endif // EMBEDDED
extern "C" int trace; extern "C" int trace;
extern MYSQL_PLUGIN_IMPORT uint mysqld_port; extern MYSQL_PLUGIN_IMPORT uint mysqld_port;
...@@ -82,12 +67,12 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db, ...@@ -82,12 +67,12 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db,
{ {
static int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT, static int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT,
TYPE_STRING, TYPE_SHORT, TYPE_SHORT, TYPE_SHORT, TYPE_STRING, TYPE_SHORT, TYPE_SHORT, TYPE_SHORT,
TYPE_STRING, TYPE_STRING, TYPE_STRING}; TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_STRING};
static XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC, static XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC,
FLD_KEY, FLD_SCALE, FLD_RADIX, FLD_NULL, FLD_KEY, FLD_SCALE, FLD_RADIX, FLD_NULL,
FLD_REM, FLD_NO, FLD_CHARSET}; FLD_REM, FLD_NO, FLD_DEFAULT, FLD_CHARSET};
static unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 256, 32, 32}; static unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 0, 32, 0, 32};
char *fld, *fmt, v, cmd[128]; char *fld, *fmt, v, cmd[128], uns[16], zero[16];
int i, n, nf, ncol = sizeof(buftyp) / sizeof(int); int i, n, nf, ncol = sizeof(buftyp) / sizeof(int);
int len, type, prec, rc, k = 0; int len, type, prec, rc, k = 0;
PQRYRES qrp; PQRYRES qrp;
...@@ -122,9 +107,10 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db, ...@@ -122,9 +107,10 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db,
} // endif n } // endif n
/********************************************************************/ /********************************************************************/
/* Get the size of the name columns. */ /* Get the size of the name and default columns. */
/********************************************************************/ /********************************************************************/
length[0] = myc.GetFieldLength(0); length[0] = myc.GetFieldLength(0);
length[10] = myc.GetFieldLength(5);
} else { } else {
n = 0; n = 0;
length[0] = 128; length[0] = 128;
...@@ -164,18 +150,29 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db, ...@@ -164,18 +150,29 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db,
crp = qrp->Colresp; // Column_Name crp = qrp->Colresp; // Column_Name
crp->Kdata->SetValue(fld, i); crp->Kdata->SetValue(fld, i);
// Get type, type name, and precision // Get type, type name, precision, unsigned and zerofill
fld = myc.GetCharField(1); fld = myc.GetCharField(1);
prec = 0; prec = 0;
len = 0; len = 0;
v = 0; v = 0;
*uns = 0;
if ((nf = sscanf(fld, "%[^(](%d,%d", cmd, &len, &prec)) < 1) { *zero = 0;
sprintf(g->Message, MSG(BAD_FIELD_TYPE), fld);
myc.Close(); switch ((nf = sscanf(fld, "%[^(](%d,%d", cmd, &len, &prec))) {
return NULL; case 3:
} else nf = sscanf(fld, "%[^(](%d,%d) %s %s", cmd, &len, &prec, uns, zero);
qrp->Nblin++; break;
case 2:
nf = sscanf(fld, "%[^(](%d) %s %s", cmd, &len, uns, zero) + 1;
break;
case 1:
nf = sscanf(fld, "%s %s %s", cmd, uns, zero) + 2;
break;
default:
sprintf(g->Message, MSG(BAD_FIELD_TYPE), fld);
myc.Close();
return NULL;
} // endswitch nf
if ((type = MYSQLtoPLG(cmd, &v)) == TYPE_ERROR) { if ((type = MYSQLtoPLG(cmd, &v)) == TYPE_ERROR) {
sprintf(g->Message, "Unsupported column type %s", cmd); sprintf(g->Message, "Unsupported column type %s", cmd);
...@@ -184,9 +181,16 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db, ...@@ -184,9 +181,16 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db,
} else if (type == TYPE_STRING) } else if (type == TYPE_STRING)
len = min(len, 4096); len = min(len, 4096);
qrp->Nblin++;
crp = crp->Next; // Data_Type crp = crp->Next; // Data_Type
crp->Kdata->SetValue(type, i); crp->Kdata->SetValue(type, i);
crp->Nulls[i] = v;
switch (nf) {
case 5: crp->Nulls[i] = 'Z'; break;
case 4: crp->Nulls[i] = 'U'; break;
default: crp->Nulls[i] = v; break;
} // endswitch nf
crp = crp->Next; // Type_Name crp = crp->Next; // Type_Name
crp->Kdata->SetValue(cmd, i); crp->Kdata->SetValue(cmd, i);
...@@ -200,7 +204,7 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db, ...@@ -200,7 +204,7 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db,
crp = crp->Next; // Precision crp = crp->Next; // Precision
crp->Kdata->SetValue(len, i); crp->Kdata->SetValue(len, i);
crp = crp->Next; // was Length crp = crp->Next; // key (was Length)
fld = myc.GetCharField(4); fld = myc.GetCharField(4);
crp->Kdata->SetValue(fld, i); crp->Kdata->SetValue(fld, i);
...@@ -218,9 +222,13 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db, ...@@ -218,9 +222,13 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db,
fld = myc.GetCharField(8); fld = myc.GetCharField(8);
crp->Kdata->SetValue(fld, i); crp->Kdata->SetValue(fld, i);
crp = crp->Next; // New crp = crp->Next; // Date format
crp->Kdata->SetValue((fmt) ? fmt : (char*) "", i); crp->Kdata->SetValue((fmt) ? fmt : (char*) "", i);
crp = crp->Next; // New (default)
fld = myc.GetCharField(5);
crp->Kdata->SetValue(fld, i);
crp = crp->Next; // New (charset) crp = crp->Next; // New (charset)
fld = myc.GetCharField(2); fld = myc.GetCharField(2);
crp->Kdata->SetValue(fld, i); crp->Kdata->SetValue(fld, i);
...@@ -657,6 +665,7 @@ PQRYRES MYSQLC::GetResult(PGLOBAL g, bool pdb) ...@@ -657,6 +665,7 @@ PQRYRES MYSQLC::GetResult(PGLOBAL g, bool pdb)
{ {
char *fmt; char *fmt;
int n; int n;
bool uns;
PCOLRES *pcrp, crp; PCOLRES *pcrp, crp;
PQRYRES qrp; PQRYRES qrp;
MYSQL_FIELD *fld; MYSQL_FIELD *fld;
...@@ -707,9 +716,10 @@ PQRYRES MYSQLC::GetResult(PGLOBAL g, bool pdb) ...@@ -707,9 +716,10 @@ PQRYRES MYSQLC::GetResult(PGLOBAL g, bool pdb)
crp->Prec = (crp->Type == TYPE_FLOAT) ? fld->decimals : 0; crp->Prec = (crp->Type == TYPE_FLOAT) ? fld->decimals : 0;
crp->Length = fld->max_length; crp->Length = fld->max_length;
crp->Clen = GetTypeSize(crp->Type, crp->Length); crp->Clen = GetTypeSize(crp->Type, crp->Length);
uns = (fld->flags & (UNSIGNED_FLAG | ZEROFILL_FLAG)) ? true : false;
if (!(crp->Kdata = AllocValBlock(g, NULL, crp->Type, m_Rows, if (!(crp->Kdata = AllocValBlock(g, NULL, crp->Type, m_Rows,
crp->Clen, 0, FALSE, TRUE, FALSE))) { crp->Clen, 0, FALSE, TRUE, uns))) {
sprintf(g->Message, MSG(INV_RESULT_TYPE), sprintf(g->Message, MSG(INV_RESULT_TYPE),
GetFormatType(crp->Type)); GetFormatType(crp->Type));
return NULL; return NULL;
......
...@@ -13,3 +13,5 @@ MASTER_MYSOCK= @mysqld.1.socket ...@@ -13,3 +13,5 @@ MASTER_MYSOCK= @mysqld.1.socket
SLAVE_MYPORT= @mysqld.2.port SLAVE_MYPORT= @mysqld.2.port
SLAVE_MYSOCK= @mysqld.2.socket SLAVE_MYSOCK= @mysqld.2.socket
PGCLIENTENCODING= UTF8
...@@ -238,3 +238,38 @@ CREATE TABLE `t2` ( ...@@ -238,3 +238,38 @@ CREATE TABLE `t2` (
# End of mysqldump ------ # End of mysqldump ------
DROP TABLE t2; DROP TABLE t2;
DROP TABLE t1; DROP TABLE t1;
#
# Testing getting unsigned types
#
CREATE TABLE t1 (
a TINYINT UNSIGNED NOT NULL,
b SMALLINT ZEROFILL NOT NULL,
c INT UNSIGNED NOT NULL,
d BIGINT UNSIGNED NOT NULL,
e CHAR(32) NOT NULL DEFAULT 'Hello') ENGINE=CONNECT TABLE_TYPE=FIX;
Warnings:
Warning 1105 No file name. Table will use t1.fix
DESCRIBE t1;
Field Type Null Key Default Extra
a tinyint(3) unsigned NO NULL
b smallint(5) unsigned zerofill NO NULL
c int(10) unsigned NO NULL
d bigint(20) unsigned NO NULL
e char(32) NO Hello
INSERT INTO t1(a,b,c,d) VALUES(255,65535,4294967295,18446744073709551615);
SELECT * FROM t1;
a b c d e
255 65535 4294967295 18446744073709551615 Hello
CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME=t1;
DESCRIBE t2;
Field Type Null Key Default Extra
a tinyint(3) unsigned NO NULL
b smallint(5) unsigned zerofill NO NULL
c int(10) unsigned NO NULL
d bigint(20) unsigned NO NULL
e char(32) NO Hello
SELECT * FROM t2;
a b c d e
255 65535 4294967295 18446744073709551615 Hello
DROP TABLE t2;
DROP TABLE t1;
...@@ -13,19 +13,13 @@ SHOW CREATE TABLE t1; ...@@ -13,19 +13,13 @@ SHOW CREATE TABLE t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`id` int(20) NOT NULL, `id` int(20) NOT NULL,
`group` int(11) NOT NULL, `group` int(11) NOT NULL DEFAULT '1',
`a\\b` int(11) NOT NULL, `a\\b` int(11) NOT NULL DEFAULT '2',
`a\\` int(10) DEFAULT NULL, `a\\` int(10) unsigned DEFAULT NULL,
`name` varchar(32) DEFAULT NULL `name` varchar(32) DEFAULT 'name'
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/t1' `TABLE_TYPE`='MYSQL' ) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/t1' `TABLE_TYPE`='MYSQL'
INSERT INTO t1 (id, name) VALUES (1, 'foo'); INSERT INTO t1 (id, name) VALUES (1, 'foo');
Warnings:
Warning 1364 Field 'group' doesn't have a default value
Warning 1364 Field 'a\\b' doesn't have a default value
INSERT INTO t1 (id, name) VALUES (2, 'fee'); INSERT INTO t1 (id, name) VALUES (2, 'fee');
Warnings:
Warning 1364 Field 'group' doesn't have a default value
Warning 1364 Field 'a\\b' doesn't have a default value
SELECT * FROM t1; SELECT * FROM t1;
id group a\\b a\\ name id group a\\b a\\ name
1 1 2 NULL foo 1 1 2 NULL foo
......
...@@ -204,7 +204,7 @@ t1 CREATE TABLE `t1` ( ...@@ -204,7 +204,7 @@ t1 CREATE TABLE `t1` (
`a` date DEFAULT NULL, `a` date DEFAULT NULL,
`b` datetime DEFAULT NULL, `b` datetime DEFAULT NULL,
`c` time DEFAULT NULL, `c` time DEFAULT NULL,
`d` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `d` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`e` year(4) DEFAULT NULL `e` year(4) DEFAULT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT' `TABLE_TYPE`='MYSQL' ) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT' `TABLE_TYPE`='MYSQL'
SELECT * FROM t1; SELECT * FROM t1;
......
SET NAMES utf8;
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='Bad connection string';
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Sources;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`Name` varchar(256) NOT NULL,
`Description` varchar(256) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='ODBC' `CATFUNC`='Sources'
DROP TABLE t1;
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Drivers;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`Description` char(128) NOT NULL,
`Attributes` varchar(256) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='ODBC' `CATFUNC`='Drivers'
DROP TABLE t1;
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Tables CONNECTION='Not important';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`Table_Qualifier` char(128) NOT NULL,
`Table_Owner` char(128) NOT NULL,
`Table_Name` char(128) NOT NULL,
`Table_Type` char(16) NOT NULL,
`Remark` char(128) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='Not important' `TABLE_TYPE`='ODBC' `CATFUNC`='Tables'
DROP TABLE t1;
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Columns CONNECTION='Not important';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`Table_Qualif` char(128) NOT NULL,
`Table_Owner` char(128) NOT NULL,
`Table_Name` char(128) NOT NULL,
`Column_Name` char(128) NOT NULL,
`Data_Type` smallint(6) NOT NULL,
`Type_Name` char(20) NOT NULL,
`Precision` int(10) NOT NULL,
`Length` int(10) NOT NULL,
`Scale` smallint(6) NOT NULL,
`Radix` smallint(6) NOT NULL,
`Nullable` smallint(6) NOT NULL,
`Remarks` char(128) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='Not important' `TABLE_TYPE`='ODBC' `CATFUNC`='Columns'
DROP TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`Name` varchar(256) NOT NULL,
`Description` varchar(256) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='ODBC' `CATFUNC`='Sources'
SET NAMES utf8;
#
# Checking CATFUNC=Tables
#
# All tables in all schemas
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables;
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
Table_Qualifier Table_Owner Table_Name Table_Type Remark
mtr public t1 TABLE
mtr public t2 TABLE
mtr public v1 VIEW
mtr schema1 t1 TABLE
mtr schema1 t2 TABLE
mtr schema1 v1 VIEW
DROP TABLE t1;
# All tables in all schemas
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='%.%.%';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
Table_Qualifier Table_Owner Table_Name Table_Type Remark
mtr public t1 TABLE
mtr public t2 TABLE
mtr public v1 VIEW
mtr schema1 t1 TABLE
mtr schema1 t2 TABLE
mtr schema1 v1 VIEW
DROP TABLE t1;
# All tables in all schemas
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='%.%';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
Table_Qualifier Table_Owner Table_Name Table_Type Remark
mtr public t1 TABLE
mtr public t2 TABLE
mtr public v1 VIEW
mtr schema1 t1 TABLE
mtr schema1 t2 TABLE
mtr schema1 v1 VIEW
DROP TABLE t1;
# All tables in the default schema ("public")
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='%';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
Table_Qualifier Table_Owner Table_Name Table_Type Remark
mtr public t1 TABLE
mtr public t2 TABLE
mtr public v1 VIEW
DROP TABLE t1;
# All tables "t1" in all schemas
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='%.%.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
Table_Qualifier Table_Owner Table_Name Table_Type Remark
mtr public t1 TABLE
mtr schema1 t1 TABLE
DROP TABLE t1;
# All tables "t1" in all schemas
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='%.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
Table_Qualifier Table_Owner Table_Name Table_Type Remark
mtr public t1 TABLE
mtr schema1 t1 TABLE
DROP TABLE t1;
# Table "t1" in the default schema ("public")
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
Table_Qualifier Table_Owner Table_Name Table_Type Remark
mtr public t1 TABLE
DROP TABLE t1;
# Table "t1" in the schema "public"
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='%.public.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
Table_Qualifier Table_Owner Table_Name Table_Type Remark
mtr public t1 TABLE
DROP TABLE t1;
# Table "t1" in the schema "schema1"
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='%.schema1.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
Table_Qualifier Table_Owner Table_Name Table_Type Remark
mtr schema1 t1 TABLE
DROP TABLE t1;
# All tables "t1" in all schemas (Catalog name is ignored by PostgreSQL)
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='xxx.%.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
Table_Qualifier Table_Owner Table_Name Table_Type Remark
mtr public t1 TABLE
mtr schema1 t1 TABLE
DROP TABLE t1;
#
# Checking CATFUNC=Columns
#
# All columns in the schemas "public" and "schema1"
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Columns;
SELECT * FROM t1 WHERE Table_Owner IN ('public','schema1') ORDER BY Table_Owner, Table_Name;
Table_Qualif Table_Owner Table_Name Column_Name Data_Type Type_Name Precision Length Scale Radix Nullable Remarks
mtr public t1 a 4 int4 10 4 0 10 0
mtr public t2 a 4 int4 10 4 0 10 0
mtr public v1 a 4 int4 10 4 0 10 1
mtr schema1 t1 a 1 bpchar 10 60 0 0 0
mtr schema1 t2 a 1 bpchar 10 60 0 0 0
mtr schema1 v1 a 1 bpchar 10 60 0 0 1
DROP TABLE t1;
# All columns in the schemas "public" and "schema1"
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='%.%.%';
SELECT * FROM t1 WHERE Table_Owner IN ('public','schema1') ORDER BY Table_Owner, Table_Name;
Table_Qualif Table_Owner Table_Name Column_Name Data_Type Type_Name Precision Length Scale Radix Nullable Remarks
mtr public t1 a 4 int4 10 4 0 10 0
mtr public t2 a 4 int4 10 4 0 10 0
mtr public v1 a 4 int4 10 4 0 10 1
mtr schema1 t1 a 1 bpchar 10 60 0 0 0
mtr schema1 t2 a 1 bpchar 10 60 0 0 0
mtr schema1 v1 a 1 bpchar 10 60 0 0 1
DROP TABLE t1;
# All tables "t1" in all schemas
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='%.%.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
Table_Qualif Table_Owner Table_Name Column_Name Data_Type Type_Name Precision Length Scale Radix Nullable Remarks
mtr public t1 a 4 int4 10 4 0 10 0
mtr schema1 t1 a 1 bpchar 10 60 0 0 0
DROP TABLE t1;
# Table "t1" in the schema "public"
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='%.public.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
Table_Qualif Table_Owner Table_Name Column_Name Data_Type Type_Name Precision Length Scale Radix Nullable Remarks
mtr public t1 a 4 int4 10 4 0 10 0
DROP TABLE t1;
# Table "t1" in the schema "schema1"
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='%.schema1.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
Table_Qualif Table_Owner Table_Name Column_Name Data_Type Type_Name Precision Length Scale Radix Nullable Remarks
mtr schema1 t1 a 1 bpchar 10 60 0 0 0
DROP TABLE t1;
# All tables "t1" in all schemas (Catalog name is ignored by PostgreSQL)
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='xxx.%.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
Table_Qualif Table_Owner Table_Name Column_Name Data_Type Type_Name Precision Length Scale Radix Nullable Remarks
mtr public t1 a 4 int4 10 4 0 10 0
mtr schema1 t1 a 1 bpchar 10 60 0 0 0
DROP TABLE t1;
#
# Checking tables
#
# Table "t1" in the default schema ("public")
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(10) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' `TABLE_TYPE`='ODBC'
SELECT * FROM t1;
a
10
20
30
CREATE TABLE t2 AS SELECT * FROM t1;
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
SELECT * FROM t2;
a
10
20
30
DROP TABLE t2;
CREATE VIEW v1 AS SELECT * FROM t1;
SELECT * FROM v1;
a
10
20
30
DROP VIEW v1;
DROP TABLE t1;
# Table "t1" in the schema "public"
CREATE TABLE t1 ENGINE=CONNECT TABNAME='public.t1' TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(10) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' `TABLE_TYPE`='ODBC' `TABNAME`='public.t1'
SELECT * FROM t1;
a
10
20
30
DROP TABLE t1;
# Table "t1" in the schema "schema1"
CREATE TABLE t1 ENGINE=CONNECT TABNAME='schema1.t1' CHARSET=utf8 DATA_CHARSET=utf8 TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` char(10) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=utf8 CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' `TABLE_TYPE`='ODBC' `TABNAME`='schema1.t1' `DATA_CHARSET`='utf8'
SELECT * FROM t1;
a
aaa
bbb
ccc
яяя
CREATE TABLE t2 AS SELECT * FROM t1;
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` char(10) CHARACTER SET utf8 NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
SELECT * FROM t2;
a
aaa
bbb
ccc
яяя
DROP TABLE t2;
CREATE VIEW v1 AS SELECT * FROM t1;
SELECT * FROM v1;
a
aaa
bbb
ccc
яяя
DROP VIEW v1;
DROP TABLE t1;
# View "v1" in the schema "schema1"
CREATE TABLE t1 ENGINE=CONNECT TABNAME='schema1.v1' CHARSET=utf8 DATA_CHARSET=utf8 TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` char(10) DEFAULT NULL
) ENGINE=CONNECT DEFAULT CHARSET=utf8 CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' `TABLE_TYPE`='ODBC' `TABNAME`='schema1.v1' `DATA_CHARSET`='utf8'
SELECT * FROM t1;
a
aaa
bbb
ccc
яяя
CREATE TABLE t2 AS SELECT * FROM t1;
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` char(10) CHARACTER SET utf8 DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
SELECT * FROM t2;
a
aaa
bbb
ccc
яяя
DROP TABLE t2;
CREATE VIEW v1 AS SELECT * FROM t1;
SELECT * FROM v1;
a
aaa
bbb
ccc
яяя
DROP VIEW v1;
DROP TABLE t1;
# Table "t2" in the schema "schema1"
CREATE TABLE t1 ENGINE=CONNECT TABNAME='schema1.t2' CHARSET=utf8 DATA_CHARSET=utf8 TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` char(10) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=utf8 CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' `TABLE_TYPE`='ODBC' `TABNAME`='schema1.t2' `DATA_CHARSET`='utf8'
SELECT * FROM t1;
a
xxx
yyy
zzz
ÄÖÜ
CREATE TABLE t2 AS SELECT * FROM t1;
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` char(10) CHARACTER SET utf8 NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
SELECT * FROM t2;
a
xxx
yyy
zzz
ÄÖÜ
DROP TABLE t2;
CREATE VIEW v1 AS SELECT * FROM t1;
SELECT * FROM v1;
a
xxx
yyy
zzz
ÄÖÜ
DROP VIEW v1;
DROP TABLE t1;
...@@ -51,3 +51,2413 @@ SELECT * FROM t1; ...@@ -51,3 +51,2413 @@ SELECT * FROM t1;
Table_Qualifier Table_Owner Table_Name Table_Type Remark Table_Qualifier Table_Owner Table_Name Table_Type Remark
t1 TABLE t1 TABLE
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Columns TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=MTR_SUITE_DIR/std_data/test.sqlite3;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8;
SELECT * FROM t1 ORDER BY Table_name;
Table_Qualif Table_Owner Table_Name Column_Name Data_Type Type_Name Precision Length Scale Radix Nullable Remarks
t000 a 4 INT 9 10 10 0 1
t000 b 4 INT 9 10 10 0 1
t000 c 4 INT 9 10 10 0 1
t000 d 4 INT 9 10 10 0 1
t000 e 4 INT 9 10 10 0 1
t001 a 4 INT 9 10 10 0 1
t001 b 4 INT 9 10 10 0 1
t001 c 4 INT 9 10 10 0 1
t001 d 4 INT 9 10 10 0 1
t001 e 4 INT 9 10 10 0 1
t002 a 4 INT 9 10 10 0 1
t002 b 4 INT 9 10 10 0 1
t002 c 4 INT 9 10 10 0 1
t002 d 4 INT 9 10 10 0 1
t002 e 4 INT 9 10 10 0 1
t003 a 4 INT 9 10 10 0 1
t003 b 4 INT 9 10 10 0 1
t003 c 4 INT 9 10 10 0 1
t003 d 4 INT 9 10 10 0 1
t003 e 4 INT 9 10 10 0 1
t004 a 4 INT 9 10 10 0 1
t004 b 4 INT 9 10 10 0 1
t004 c 4 INT 9 10 10 0 1
t004 d 4 INT 9 10 10 0 1
t004 e 4 INT 9 10 10 0 1
t005 a 4 INT 9 10 10 0 1
t005 b 4 INT 9 10 10 0 1
t005 c 4 INT 9 10 10 0 1
t005 d 4 INT 9 10 10 0 1
t005 e 4 INT 9 10 10 0 1
t006 a 4 INT 9 10 10 0 1
t006 b 4 INT 9 10 10 0 1
t006 c 4 INT 9 10 10 0 1
t006 d 4 INT 9 10 10 0 1
t006 e 4 INT 9 10 10 0 1
t007 a 4 INT 9 10 10 0 1
t007 b 4 INT 9 10 10 0 1
t007 c 4 INT 9 10 10 0 1
t007 d 4 INT 9 10 10 0 1
t007 e 4 INT 9 10 10 0 1
t008 a 4 INT 9 10 10 0 1
t008 b 4 INT 9 10 10 0 1
t008 c 4 INT 9 10 10 0 1
t008 d 4 INT 9 10 10 0 1
t008 e 4 INT 9 10 10 0 1
t009 a 4 INT 9 10 10 0 1
t009 b 4 INT 9 10 10 0 1
t009 c 4 INT 9 10 10 0 1
t009 d 4 INT 9 10 10 0 1
t009 e 4 INT 9 10 10 0 1
t010 a 4 INT 9 10 10 0 1
t010 b 4 INT 9 10 10 0 1
t010 c 4 INT 9 10 10 0 1
t010 d 4 INT 9 10 10 0 1
t010 e 4 INT 9 10 10 0 1
t011 a 4 INT 9 10 10 0 1
t011 b 4 INT 9 10 10 0 1
t011 c 4 INT 9 10 10 0 1
t011 d 4 INT 9 10 10 0 1
t011 e 4 INT 9 10 10 0 1
t012 a 4 INT 9 10 10 0 1
t012 b 4 INT 9 10 10 0 1
t012 c 4 INT 9 10 10 0 1
t012 d 4 INT 9 10 10 0 1
t012 e 4 INT 9 10 10 0 1
t013 a 4 INT 9 10 10 0 1
t013 b 4 INT 9 10 10 0 1
t013 c 4 INT 9 10 10 0 1
t013 d 4 INT 9 10 10 0 1
t013 e 4 INT 9 10 10 0 1
t014 a 4 INT 9 10 10 0 1
t014 b 4 INT 9 10 10 0 1
t014 c 4 INT 9 10 10 0 1
t014 d 4 INT 9 10 10 0 1
t014 e 4 INT 9 10 10 0 1
t015 a 4 INT 9 10 10 0 1
t015 b 4 INT 9 10 10 0 1
t015 c 4 INT 9 10 10 0 1
t015 d 4 INT 9 10 10 0 1
t015 e 4 INT 9 10 10 0 1
t016 a 4 INT 9 10 10 0 1
t016 b 4 INT 9 10 10 0 1
t016 c 4 INT 9 10 10 0 1
t016 d 4 INT 9 10 10 0 1
t016 e 4 INT 9 10 10 0 1
t017 a 4 INT 9 10 10 0 1
t017 b 4 INT 9 10 10 0 1
t017 c 4 INT 9 10 10 0 1
t017 d 4 INT 9 10 10 0 1
t017 e 4 INT 9 10 10 0 1
t018 a 4 INT 9 10 10 0 1
t018 b 4 INT 9 10 10 0 1
t018 c 4 INT 9 10 10 0 1
t018 d 4 INT 9 10 10 0 1
t018 e 4 INT 9 10 10 0 1
t019 a 4 INT 9 10 10 0 1
t019 b 4 INT 9 10 10 0 1
t019 c 4 INT 9 10 10 0 1
t019 d 4 INT 9 10 10 0 1
t019 e 4 INT 9 10 10 0 1
t020 a 4 INT 9 10 10 0 1
t020 b 4 INT 9 10 10 0 1
t020 c 4 INT 9 10 10 0 1
t020 d 4 INT 9 10 10 0 1
t020 e 4 INT 9 10 10 0 1
t021 a 4 INT 9 10 10 0 1
t021 b 4 INT 9 10 10 0 1
t021 c 4 INT 9 10 10 0 1
t021 d 4 INT 9 10 10 0 1
t021 e 4 INT 9 10 10 0 1
t022 a 4 INT 9 10 10 0 1
t022 b 4 INT 9 10 10 0 1
t022 c 4 INT 9 10 10 0 1
t022 d 4 INT 9 10 10 0 1
t022 e 4 INT 9 10 10 0 1
t023 a 4 INT 9 10 10 0 1
t023 b 4 INT 9 10 10 0 1
t023 c 4 INT 9 10 10 0 1
t023 d 4 INT 9 10 10 0 1
t023 e 4 INT 9 10 10 0 1
t024 a 4 INT 9 10 10 0 1
t024 b 4 INT 9 10 10 0 1
t024 c 4 INT 9 10 10 0 1
t024 d 4 INT 9 10 10 0 1
t024 e 4 INT 9 10 10 0 1
t025 a 4 INT 9 10 10 0 1
t025 b 4 INT 9 10 10 0 1
t025 c 4 INT 9 10 10 0 1
t025 d 4 INT 9 10 10 0 1
t025 e 4 INT 9 10 10 0 1
t026 a 4 INT 9 10 10 0 1
t026 b 4 INT 9 10 10 0 1
t026 c 4 INT 9 10 10 0 1
t026 d 4 INT 9 10 10 0 1
t026 e 4 INT 9 10 10 0 1
t027 a 4 INT 9 10 10 0 1
t027 b 4 INT 9 10 10 0 1
t027 c 4 INT 9 10 10 0 1
t027 d 4 INT 9 10 10 0 1
t027 e 4 INT 9 10 10 0 1
t028 a 4 INT 9 10 10 0 1
t028 b 4 INT 9 10 10 0 1
t028 c 4 INT 9 10 10 0 1
t028 d 4 INT 9 10 10 0 1
t028 e 4 INT 9 10 10 0 1
t029 a 4 INT 9 10 10 0 1
t029 b 4 INT 9 10 10 0 1
t029 c 4 INT 9 10 10 0 1
t029 d 4 INT 9 10 10 0 1
t029 e 4 INT 9 10 10 0 1
t030 a 4 INT 9 10 10 0 1
t030 b 4 INT 9 10 10 0 1
t030 c 4 INT 9 10 10 0 1
t030 d 4 INT 9 10 10 0 1
t030 e 4 INT 9 10 10 0 1
t031 a 4 INT 9 10 10 0 1
t031 b 4 INT 9 10 10 0 1
t031 c 4 INT 9 10 10 0 1
t031 d 4 INT 9 10 10 0 1
t031 e 4 INT 9 10 10 0 1
t032 a 4 INT 9 10 10 0 1
t032 b 4 INT 9 10 10 0 1
t032 c 4 INT 9 10 10 0 1
t032 d 4 INT 9 10 10 0 1
t032 e 4 INT 9 10 10 0 1
t033 a 4 INT 9 10 10 0 1
t033 b 4 INT 9 10 10 0 1
t033 c 4 INT 9 10 10 0 1
t033 d 4 INT 9 10 10 0 1
t033 e 4 INT 9 10 10 0 1
t034 a 4 INT 9 10 10 0 1
t034 b 4 INT 9 10 10 0 1
t034 c 4 INT 9 10 10 0 1
t034 d 4 INT 9 10 10 0 1
t034 e 4 INT 9 10 10 0 1
t035 a 4 INT 9 10 10 0 1
t035 b 4 INT 9 10 10 0 1
t035 c 4 INT 9 10 10 0 1
t035 d 4 INT 9 10 10 0 1
t035 e 4 INT 9 10 10 0 1
t036 a 4 INT 9 10 10 0 1
t036 b 4 INT 9 10 10 0 1
t036 c 4 INT 9 10 10 0 1
t036 d 4 INT 9 10 10 0 1
t036 e 4 INT 9 10 10 0 1
t037 a 4 INT 9 10 10 0 1
t037 b 4 INT 9 10 10 0 1
t037 c 4 INT 9 10 10 0 1
t037 d 4 INT 9 10 10 0 1
t037 e 4 INT 9 10 10 0 1
t038 a 4 INT 9 10 10 0 1
t038 b 4 INT 9 10 10 0 1
t038 c 4 INT 9 10 10 0 1
t038 d 4 INT 9 10 10 0 1
t038 e 4 INT 9 10 10 0 1
t039 a 4 INT 9 10 10 0 1
t039 b 4 INT 9 10 10 0 1
t039 c 4 INT 9 10 10 0 1
t039 d 4 INT 9 10 10 0 1
t039 e 4 INT 9 10 10 0 1
t040 a 4 INT 9 10 10 0 1
t040 b 4 INT 9 10 10 0 1
t040 c 4 INT 9 10 10 0 1
t040 d 4 INT 9 10 10 0 1
t040 e 4 INT 9 10 10 0 1
t041 a 4 INT 9 10 10 0 1
t041 b 4 INT 9 10 10 0 1
t041 c 4 INT 9 10 10 0 1
t041 d 4 INT 9 10 10 0 1
t041 e 4 INT 9 10 10 0 1
t042 a 4 INT 9 10 10 0 1
t042 b 4 INT 9 10 10 0 1
t042 c 4 INT 9 10 10 0 1
t042 d 4 INT 9 10 10 0 1
t042 e 4 INT 9 10 10 0 1
t043 a 4 INT 9 10 10 0 1
t043 b 4 INT 9 10 10 0 1
t043 c 4 INT 9 10 10 0 1
t043 d 4 INT 9 10 10 0 1
t043 e 4 INT 9 10 10 0 1
t044 a 4 INT 9 10 10 0 1
t044 b 4 INT 9 10 10 0 1
t044 c 4 INT 9 10 10 0 1
t044 d 4 INT 9 10 10 0 1
t044 e 4 INT 9 10 10 0 1
t045 a 4 INT 9 10 10 0 1
t045 b 4 INT 9 10 10 0 1
t045 c 4 INT 9 10 10 0 1
t045 d 4 INT 9 10 10 0 1
t045 e 4 INT 9 10 10 0 1
t046 a 4 INT 9 10 10 0 1
t046 b 4 INT 9 10 10 0 1
t046 c 4 INT 9 10 10 0 1
t046 d 4 INT 9 10 10 0 1
t046 e 4 INT 9 10 10 0 1
t047 a 4 INT 9 10 10 0 1
t047 b 4 INT 9 10 10 0 1
t047 c 4 INT 9 10 10 0 1
t047 d 4 INT 9 10 10 0 1
t047 e 4 INT 9 10 10 0 1
t048 a 4 INT 9 10 10 0 1
t048 b 4 INT 9 10 10 0 1
t048 c 4 INT 9 10 10 0 1
t048 d 4 INT 9 10 10 0 1
t048 e 4 INT 9 10 10 0 1
t049 a 4 INT 9 10 10 0 1
t049 b 4 INT 9 10 10 0 1
t049 c 4 INT 9 10 10 0 1
t049 d 4 INT 9 10 10 0 1
t049 e 4 INT 9 10 10 0 1
t050 a 4 INT 9 10 10 0 1
t050 b 4 INT 9 10 10 0 1
t050 c 4 INT 9 10 10 0 1
t050 d 4 INT 9 10 10 0 1
t050 e 4 INT 9 10 10 0 1
t051 a 4 INT 9 10 10 0 1
t051 b 4 INT 9 10 10 0 1
t051 c 4 INT 9 10 10 0 1
t051 d 4 INT 9 10 10 0 1
t051 e 4 INT 9 10 10 0 1
t052 a 4 INT 9 10 10 0 1
t052 b 4 INT 9 10 10 0 1
t052 c 4 INT 9 10 10 0 1
t052 d 4 INT 9 10 10 0 1
t052 e 4 INT 9 10 10 0 1
t053 a 4 INT 9 10 10 0 1
t053 b 4 INT 9 10 10 0 1
t053 c 4 INT 9 10 10 0 1
t053 d 4 INT 9 10 10 0 1
t053 e 4 INT 9 10 10 0 1
t054 a 4 INT 9 10 10 0 1
t054 b 4 INT 9 10 10 0 1
t054 c 4 INT 9 10 10 0 1
t054 d 4 INT 9 10 10 0 1
t054 e 4 INT 9 10 10 0 1
t055 a 4 INT 9 10 10 0 1
t055 b 4 INT 9 10 10 0 1
t055 c 4 INT 9 10 10 0 1
t055 d 4 INT 9 10 10 0 1
t055 e 4 INT 9 10 10 0 1
t056 a 4 INT 9 10 10 0 1
t056 b 4 INT 9 10 10 0 1
t056 c 4 INT 9 10 10 0 1
t056 d 4 INT 9 10 10 0 1
t056 e 4 INT 9 10 10 0 1
t057 a 4 INT 9 10 10 0 1
t057 b 4 INT 9 10 10 0 1
t057 c 4 INT 9 10 10 0 1
t057 d 4 INT 9 10 10 0 1
t057 e 4 INT 9 10 10 0 1
t058 a 4 INT 9 10 10 0 1
t058 b 4 INT 9 10 10 0 1
t058 c 4 INT 9 10 10 0 1
t058 d 4 INT 9 10 10 0 1
t058 e 4 INT 9 10 10 0 1
t059 a 4 INT 9 10 10 0 1
t059 b 4 INT 9 10 10 0 1
t059 c 4 INT 9 10 10 0 1
t059 d 4 INT 9 10 10 0 1
t059 e 4 INT 9 10 10 0 1
t060 a 4 INT 9 10 10 0 1
t060 b 4 INT 9 10 10 0 1
t060 c 4 INT 9 10 10 0 1
t060 d 4 INT 9 10 10 0 1
t060 e 4 INT 9 10 10 0 1
t061 a 4 INT 9 10 10 0 1
t061 b 4 INT 9 10 10 0 1
t061 c 4 INT 9 10 10 0 1
t061 d 4 INT 9 10 10 0 1
t061 e 4 INT 9 10 10 0 1
t062 a 4 INT 9 10 10 0 1
t062 b 4 INT 9 10 10 0 1
t062 c 4 INT 9 10 10 0 1
t062 d 4 INT 9 10 10 0 1
t062 e 4 INT 9 10 10 0 1
t063 a 4 INT 9 10 10 0 1
t063 b 4 INT 9 10 10 0 1
t063 c 4 INT 9 10 10 0 1
t063 d 4 INT 9 10 10 0 1
t063 e 4 INT 9 10 10 0 1
t064 a 4 INT 9 10 10 0 1
t064 b 4 INT 9 10 10 0 1
t064 c 4 INT 9 10 10 0 1
t064 d 4 INT 9 10 10 0 1
t064 e 4 INT 9 10 10 0 1
t065 a 4 INT 9 10 10 0 1
t065 b 4 INT 9 10 10 0 1
t065 c 4 INT 9 10 10 0 1
t065 d 4 INT 9 10 10 0 1
t065 e 4 INT 9 10 10 0 1
t066 a 4 INT 9 10 10 0 1
t066 b 4 INT 9 10 10 0 1
t066 c 4 INT 9 10 10 0 1
t066 d 4 INT 9 10 10 0 1
t066 e 4 INT 9 10 10 0 1
t067 a 4 INT 9 10 10 0 1
t067 b 4 INT 9 10 10 0 1
t067 c 4 INT 9 10 10 0 1
t067 d 4 INT 9 10 10 0 1
t067 e 4 INT 9 10 10 0 1
t068 a 4 INT 9 10 10 0 1
t068 b 4 INT 9 10 10 0 1
t068 c 4 INT 9 10 10 0 1
t068 d 4 INT 9 10 10 0 1
t068 e 4 INT 9 10 10 0 1
t069 a 4 INT 9 10 10 0 1
t069 b 4 INT 9 10 10 0 1
t069 c 4 INT 9 10 10 0 1
t069 d 4 INT 9 10 10 0 1
t069 e 4 INT 9 10 10 0 1
t070 a 4 INT 9 10 10 0 1
t070 b 4 INT 9 10 10 0 1
t070 c 4 INT 9 10 10 0 1
t070 d 4 INT 9 10 10 0 1
t070 e 4 INT 9 10 10 0 1
t071 a 4 INT 9 10 10 0 1
t071 b 4 INT 9 10 10 0 1
t071 c 4 INT 9 10 10 0 1
t071 d 4 INT 9 10 10 0 1
t071 e 4 INT 9 10 10 0 1
t072 a 4 INT 9 10 10 0 1
t072 b 4 INT 9 10 10 0 1
t072 c 4 INT 9 10 10 0 1
t072 d 4 INT 9 10 10 0 1
t072 e 4 INT 9 10 10 0 1
t073 a 4 INT 9 10 10 0 1
t073 b 4 INT 9 10 10 0 1
t073 c 4 INT 9 10 10 0 1
t073 d 4 INT 9 10 10 0 1
t073 e 4 INT 9 10 10 0 1
t074 a 4 INT 9 10 10 0 1
t074 b 4 INT 9 10 10 0 1
t074 c 4 INT 9 10 10 0 1
t074 d 4 INT 9 10 10 0 1
t074 e 4 INT 9 10 10 0 1
t075 a 4 INT 9 10 10 0 1
t075 b 4 INT 9 10 10 0 1
t075 c 4 INT 9 10 10 0 1
t075 d 4 INT 9 10 10 0 1
t075 e 4 INT 9 10 10 0 1
t076 a 4 INT 9 10 10 0 1
t076 b 4 INT 9 10 10 0 1
t076 c 4 INT 9 10 10 0 1
t076 d 4 INT 9 10 10 0 1
t076 e 4 INT 9 10 10 0 1
t077 a 4 INT 9 10 10 0 1
t077 b 4 INT 9 10 10 0 1
t077 c 4 INT 9 10 10 0 1
t077 d 4 INT 9 10 10 0 1
t077 e 4 INT 9 10 10 0 1
t078 a 4 INT 9 10 10 0 1
t078 b 4 INT 9 10 10 0 1
t078 c 4 INT 9 10 10 0 1
t078 d 4 INT 9 10 10 0 1
t078 e 4 INT 9 10 10 0 1
t079 a 4 INT 9 10 10 0 1
t079 b 4 INT 9 10 10 0 1
t079 c 4 INT 9 10 10 0 1
t079 d 4 INT 9 10 10 0 1
t079 e 4 INT 9 10 10 0 1
t080 a 4 INT 9 10 10 0 1
t080 b 4 INT 9 10 10 0 1
t080 c 4 INT 9 10 10 0 1
t080 d 4 INT 9 10 10 0 1
t080 e 4 INT 9 10 10 0 1
t081 a 4 INT 9 10 10 0 1
t081 b 4 INT 9 10 10 0 1
t081 c 4 INT 9 10 10 0 1
t081 d 4 INT 9 10 10 0 1
t081 e 4 INT 9 10 10 0 1
t082 a 4 INT 9 10 10 0 1
t082 b 4 INT 9 10 10 0 1
t082 c 4 INT 9 10 10 0 1
t082 d 4 INT 9 10 10 0 1
t082 e 4 INT 9 10 10 0 1
t083 a 4 INT 9 10 10 0 1
t083 b 4 INT 9 10 10 0 1
t083 c 4 INT 9 10 10 0 1
t083 d 4 INT 9 10 10 0 1
t083 e 4 INT 9 10 10 0 1
t084 a 4 INT 9 10 10 0 1
t084 b 4 INT 9 10 10 0 1
t084 c 4 INT 9 10 10 0 1
t084 d 4 INT 9 10 10 0 1
t084 e 4 INT 9 10 10 0 1
t085 a 4 INT 9 10 10 0 1
t085 b 4 INT 9 10 10 0 1
t085 c 4 INT 9 10 10 0 1
t085 d 4 INT 9 10 10 0 1
t085 e 4 INT 9 10 10 0 1
t086 a 4 INT 9 10 10 0 1
t086 b 4 INT 9 10 10 0 1
t086 c 4 INT 9 10 10 0 1
t086 d 4 INT 9 10 10 0 1
t086 e 4 INT 9 10 10 0 1
t087 a 4 INT 9 10 10 0 1
t087 b 4 INT 9 10 10 0 1
t087 c 4 INT 9 10 10 0 1
t087 d 4 INT 9 10 10 0 1
t087 e 4 INT 9 10 10 0 1
t088 a 4 INT 9 10 10 0 1
t088 b 4 INT 9 10 10 0 1
t088 c 4 INT 9 10 10 0 1
t088 d 4 INT 9 10 10 0 1
t088 e 4 INT 9 10 10 0 1
t089 a 4 INT 9 10 10 0 1
t089 b 4 INT 9 10 10 0 1
t089 c 4 INT 9 10 10 0 1
t089 d 4 INT 9 10 10 0 1
t089 e 4 INT 9 10 10 0 1
t090 a 4 INT 9 10 10 0 1
t090 b 4 INT 9 10 10 0 1
t090 c 4 INT 9 10 10 0 1
t090 d 4 INT 9 10 10 0 1
t090 e 4 INT 9 10 10 0 1
t091 a 4 INT 9 10 10 0 1
t091 b 4 INT 9 10 10 0 1
t091 c 4 INT 9 10 10 0 1
t091 d 4 INT 9 10 10 0 1
t091 e 4 INT 9 10 10 0 1
t092 a 4 INT 9 10 10 0 1
t092 b 4 INT 9 10 10 0 1
t092 c 4 INT 9 10 10 0 1
t092 d 4 INT 9 10 10 0 1
t092 e 4 INT 9 10 10 0 1
t093 a 4 INT 9 10 10 0 1
t093 b 4 INT 9 10 10 0 1
t093 c 4 INT 9 10 10 0 1
t093 d 4 INT 9 10 10 0 1
t093 e 4 INT 9 10 10 0 1
t094 a 4 INT 9 10 10 0 1
t094 b 4 INT 9 10 10 0 1
t094 c 4 INT 9 10 10 0 1
t094 d 4 INT 9 10 10 0 1
t094 e 4 INT 9 10 10 0 1
t095 a 4 INT 9 10 10 0 1
t095 b 4 INT 9 10 10 0 1
t095 c 4 INT 9 10 10 0 1
t095 d 4 INT 9 10 10 0 1
t095 e 4 INT 9 10 10 0 1
t096 a 4 INT 9 10 10 0 1
t096 b 4 INT 9 10 10 0 1
t096 c 4 INT 9 10 10 0 1
t096 d 4 INT 9 10 10 0 1
t096 e 4 INT 9 10 10 0 1
t097 a 4 INT 9 10 10 0 1
t097 b 4 INT 9 10 10 0 1
t097 c 4 INT 9 10 10 0 1
t097 d 4 INT 9 10 10 0 1
t097 e 4 INT 9 10 10 0 1
t098 a 4 INT 9 10 10 0 1
t098 b 4 INT 9 10 10 0 1
t098 c 4 INT 9 10 10 0 1
t098 d 4 INT 9 10 10 0 1
t098 e 4 INT 9 10 10 0 1
t099 a 4 INT 9 10 10 0 1
t099 b 4 INT 9 10 10 0 1
t099 c 4 INT 9 10 10 0 1
t099 d 4 INT 9 10 10 0 1
t099 e 4 INT 9 10 10 0 1
t1 a 12 varchar(64) 64 64 10 0 1
t100 a 4 INT 9 10 10 0 1
t100 b 4 INT 9 10 10 0 1
t100 c 4 INT 9 10 10 0 1
t100 d 4 INT 9 10 10 0 1
t100 e 4 INT 9 10 10 0 1
t101 a 4 INT 9 10 10 0 1
t101 b 4 INT 9 10 10 0 1
t101 c 4 INT 9 10 10 0 1
t101 d 4 INT 9 10 10 0 1
t101 e 4 INT 9 10 10 0 1
t102 a 4 INT 9 10 10 0 1
t102 b 4 INT 9 10 10 0 1
t102 c 4 INT 9 10 10 0 1
t102 d 4 INT 9 10 10 0 1
t102 e 4 INT 9 10 10 0 1
t103 a 4 INT 9 10 10 0 1
t103 b 4 INT 9 10 10 0 1
t103 c 4 INT 9 10 10 0 1
t103 d 4 INT 9 10 10 0 1
t103 e 4 INT 9 10 10 0 1
t104 a 4 INT 9 10 10 0 1
t104 b 4 INT 9 10 10 0 1
t104 c 4 INT 9 10 10 0 1
t104 d 4 INT 9 10 10 0 1
t104 e 4 INT 9 10 10 0 1
t105 a 4 INT 9 10 10 0 1
t105 b 4 INT 9 10 10 0 1
t105 c 4 INT 9 10 10 0 1
t105 d 4 INT 9 10 10 0 1
t105 e 4 INT 9 10 10 0 1
t106 a 4 INT 9 10 10 0 1
t106 b 4 INT 9 10 10 0 1
t106 c 4 INT 9 10 10 0 1
t106 d 4 INT 9 10 10 0 1
t106 e 4 INT 9 10 10 0 1
t107 a 4 INT 9 10 10 0 1
t107 b 4 INT 9 10 10 0 1
t107 c 4 INT 9 10 10 0 1
t107 d 4 INT 9 10 10 0 1
t107 e 4 INT 9 10 10 0 1
t108 a 4 INT 9 10 10 0 1
t108 b 4 INT 9 10 10 0 1
t108 c 4 INT 9 10 10 0 1
t108 d 4 INT 9 10 10 0 1
t108 e 4 INT 9 10 10 0 1
t109 a 4 INT 9 10 10 0 1
t109 b 4 INT 9 10 10 0 1
t109 c 4 INT 9 10 10 0 1
t109 d 4 INT 9 10 10 0 1
t109 e 4 INT 9 10 10 0 1
t110 a 4 INT 9 10 10 0 1
t110 b 4 INT 9 10 10 0 1
t110 c 4 INT 9 10 10 0 1
t110 d 4 INT 9 10 10 0 1
t110 e 4 INT 9 10 10 0 1
t111 a 4 INT 9 10 10 0 1
t111 b 4 INT 9 10 10 0 1
t111 c 4 INT 9 10 10 0 1
t111 d 4 INT 9 10 10 0 1
t111 e 4 INT 9 10 10 0 1
t112 a 4 INT 9 10 10 0 1
t112 b 4 INT 9 10 10 0 1
t112 c 4 INT 9 10 10 0 1
t112 d 4 INT 9 10 10 0 1
t112 e 4 INT 9 10 10 0 1
t113 a 4 INT 9 10 10 0 1
t113 b 4 INT 9 10 10 0 1
t113 c 4 INT 9 10 10 0 1
t113 d 4 INT 9 10 10 0 1
t113 e 4 INT 9 10 10 0 1
t114 a 4 INT 9 10 10 0 1
t114 b 4 INT 9 10 10 0 1
t114 c 4 INT 9 10 10 0 1
t114 d 4 INT 9 10 10 0 1
t114 e 4 INT 9 10 10 0 1
t115 a 4 INT 9 10 10 0 1
t115 b 4 INT 9 10 10 0 1
t115 c 4 INT 9 10 10 0 1
t115 d 4 INT 9 10 10 0 1
t115 e 4 INT 9 10 10 0 1
t116 a 4 INT 9 10 10 0 1
t116 b 4 INT 9 10 10 0 1
t116 c 4 INT 9 10 10 0 1
t116 d 4 INT 9 10 10 0 1
t116 e 4 INT 9 10 10 0 1
t117 a 4 INT 9 10 10 0 1
t117 b 4 INT 9 10 10 0 1
t117 c 4 INT 9 10 10 0 1
t117 d 4 INT 9 10 10 0 1
t117 e 4 INT 9 10 10 0 1
t118 a 4 INT 9 10 10 0 1
t118 b 4 INT 9 10 10 0 1
t118 c 4 INT 9 10 10 0 1
t118 d 4 INT 9 10 10 0 1
t118 e 4 INT 9 10 10 0 1
t119 a 4 INT 9 10 10 0 1
t119 b 4 INT 9 10 10 0 1
t119 c 4 INT 9 10 10 0 1
t119 d 4 INT 9 10 10 0 1
t119 e 4 INT 9 10 10 0 1
t120 a 4 INT 9 10 10 0 1
t120 b 4 INT 9 10 10 0 1
t120 c 4 INT 9 10 10 0 1
t120 d 4 INT 9 10 10 0 1
t120 e 4 INT 9 10 10 0 1
t121 a 4 INT 9 10 10 0 1
t121 b 4 INT 9 10 10 0 1
t121 c 4 INT 9 10 10 0 1
t121 d 4 INT 9 10 10 0 1
t121 e 4 INT 9 10 10 0 1
t122 a 4 INT 9 10 10 0 1
t122 b 4 INT 9 10 10 0 1
t122 c 4 INT 9 10 10 0 1
t122 d 4 INT 9 10 10 0 1
t122 e 4 INT 9 10 10 0 1
t123 a 4 INT 9 10 10 0 1
t123 b 4 INT 9 10 10 0 1
t123 c 4 INT 9 10 10 0 1
t123 d 4 INT 9 10 10 0 1
t123 e 4 INT 9 10 10 0 1
t124 a 4 INT 9 10 10 0 1
t124 b 4 INT 9 10 10 0 1
t124 c 4 INT 9 10 10 0 1
t124 d 4 INT 9 10 10 0 1
t124 e 4 INT 9 10 10 0 1
t125 a 4 INT 9 10 10 0 1
t125 b 4 INT 9 10 10 0 1
t125 c 4 INT 9 10 10 0 1
t125 d 4 INT 9 10 10 0 1
t125 e 4 INT 9 10 10 0 1
t126 a 4 INT 9 10 10 0 1
t126 b 4 INT 9 10 10 0 1
t126 c 4 INT 9 10 10 0 1
t126 d 4 INT 9 10 10 0 1
t126 e 4 INT 9 10 10 0 1
t127 a 4 INT 9 10 10 0 1
t127 b 4 INT 9 10 10 0 1
t127 c 4 INT 9 10 10 0 1
t127 d 4 INT 9 10 10 0 1
t127 e 4 INT 9 10 10 0 1
t128 a 4 INT 9 10 10 0 1
t128 b 4 INT 9 10 10 0 1
t128 c 4 INT 9 10 10 0 1
t128 d 4 INT 9 10 10 0 1
t128 e 4 INT 9 10 10 0 1
t129 a 4 INT 9 10 10 0 1
t129 b 4 INT 9 10 10 0 1
t129 c 4 INT 9 10 10 0 1
t129 d 4 INT 9 10 10 0 1
t129 e 4 INT 9 10 10 0 1
t130 a 4 INT 9 10 10 0 1
t130 b 4 INT 9 10 10 0 1
t130 c 4 INT 9 10 10 0 1
t130 d 4 INT 9 10 10 0 1
t130 e 4 INT 9 10 10 0 1
t131 a 4 INT 9 10 10 0 1
t131 b 4 INT 9 10 10 0 1
t131 c 4 INT 9 10 10 0 1
t131 d 4 INT 9 10 10 0 1
t131 e 4 INT 9 10 10 0 1
t132 a 4 INT 9 10 10 0 1
t132 b 4 INT 9 10 10 0 1
t132 c 4 INT 9 10 10 0 1
t132 d 4 INT 9 10 10 0 1
t132 e 4 INT 9 10 10 0 1
t133 a 4 INT 9 10 10 0 1
t133 b 4 INT 9 10 10 0 1
t133 c 4 INT 9 10 10 0 1
t133 d 4 INT 9 10 10 0 1
t133 e 4 INT 9 10 10 0 1
t134 a 4 INT 9 10 10 0 1
t134 b 4 INT 9 10 10 0 1
t134 c 4 INT 9 10 10 0 1
t134 d 4 INT 9 10 10 0 1
t134 e 4 INT 9 10 10 0 1
t135 a 4 INT 9 10 10 0 1
t135 b 4 INT 9 10 10 0 1
t135 c 4 INT 9 10 10 0 1
t135 d 4 INT 9 10 10 0 1
t135 e 4 INT 9 10 10 0 1
t136 a 4 INT 9 10 10 0 1
t136 b 4 INT 9 10 10 0 1
t136 c 4 INT 9 10 10 0 1
t136 d 4 INT 9 10 10 0 1
t136 e 4 INT 9 10 10 0 1
t137 a 4 INT 9 10 10 0 1
t137 b 4 INT 9 10 10 0 1
t137 c 4 INT 9 10 10 0 1
t137 d 4 INT 9 10 10 0 1
t137 e 4 INT 9 10 10 0 1
t138 a 4 INT 9 10 10 0 1
t138 b 4 INT 9 10 10 0 1
t138 c 4 INT 9 10 10 0 1
t138 d 4 INT 9 10 10 0 1
t138 e 4 INT 9 10 10 0 1
t139 a 4 INT 9 10 10 0 1
t139 b 4 INT 9 10 10 0 1
t139 c 4 INT 9 10 10 0 1
t139 d 4 INT 9 10 10 0 1
t139 e 4 INT 9 10 10 0 1
t140 a 4 INT 9 10 10 0 1
t140 b 4 INT 9 10 10 0 1
t140 c 4 INT 9 10 10 0 1
t140 d 4 INT 9 10 10 0 1
t140 e 4 INT 9 10 10 0 1
t141 a 4 INT 9 10 10 0 1
t141 b 4 INT 9 10 10 0 1
t141 c 4 INT 9 10 10 0 1
t141 d 4 INT 9 10 10 0 1
t141 e 4 INT 9 10 10 0 1
t142 a 4 INT 9 10 10 0 1
t142 b 4 INT 9 10 10 0 1
t142 c 4 INT 9 10 10 0 1
t142 d 4 INT 9 10 10 0 1
t142 e 4 INT 9 10 10 0 1
t143 a 4 INT 9 10 10 0 1
t143 b 4 INT 9 10 10 0 1
t143 c 4 INT 9 10 10 0 1
t143 d 4 INT 9 10 10 0 1
t143 e 4 INT 9 10 10 0 1
t144 a 4 INT 9 10 10 0 1
t144 b 4 INT 9 10 10 0 1
t144 c 4 INT 9 10 10 0 1
t144 d 4 INT 9 10 10 0 1
t144 e 4 INT 9 10 10 0 1
t145 a 4 INT 9 10 10 0 1
t145 b 4 INT 9 10 10 0 1
t145 c 4 INT 9 10 10 0 1
t145 d 4 INT 9 10 10 0 1
t145 e 4 INT 9 10 10 0 1
t146 a 4 INT 9 10 10 0 1
t146 b 4 INT 9 10 10 0 1
t146 c 4 INT 9 10 10 0 1
t146 d 4 INT 9 10 10 0 1
t146 e 4 INT 9 10 10 0 1
t147 a 4 INT 9 10 10 0 1
t147 b 4 INT 9 10 10 0 1
t147 c 4 INT 9 10 10 0 1
t147 d 4 INT 9 10 10 0 1
t147 e 4 INT 9 10 10 0 1
t148 a 4 INT 9 10 10 0 1
t148 b 4 INT 9 10 10 0 1
t148 c 4 INT 9 10 10 0 1
t148 d 4 INT 9 10 10 0 1
t148 e 4 INT 9 10 10 0 1
t149 a 4 INT 9 10 10 0 1
t149 b 4 INT 9 10 10 0 1
t149 c 4 INT 9 10 10 0 1
t149 d 4 INT 9 10 10 0 1
t149 e 4 INT 9 10 10 0 1
t150 a 4 INT 9 10 10 0 1
t150 b 4 INT 9 10 10 0 1
t150 c 4 INT 9 10 10 0 1
t150 d 4 INT 9 10 10 0 1
t150 e 4 INT 9 10 10 0 1
t151 a 4 INT 9 10 10 0 1
t151 b 4 INT 9 10 10 0 1
t151 c 4 INT 9 10 10 0 1
t151 d 4 INT 9 10 10 0 1
t151 e 4 INT 9 10 10 0 1
t152 a 4 INT 9 10 10 0 1
t152 b 4 INT 9 10 10 0 1
t152 c 4 INT 9 10 10 0 1
t152 d 4 INT 9 10 10 0 1
t152 e 4 INT 9 10 10 0 1
t153 a 4 INT 9 10 10 0 1
t153 b 4 INT 9 10 10 0 1
t153 c 4 INT 9 10 10 0 1
t153 d 4 INT 9 10 10 0 1
t153 e 4 INT 9 10 10 0 1
t154 a 4 INT 9 10 10 0 1
t154 b 4 INT 9 10 10 0 1
t154 c 4 INT 9 10 10 0 1
t154 d 4 INT 9 10 10 0 1
t154 e 4 INT 9 10 10 0 1
t155 a 4 INT 9 10 10 0 1
t155 b 4 INT 9 10 10 0 1
t155 c 4 INT 9 10 10 0 1
t155 d 4 INT 9 10 10 0 1
t155 e 4 INT 9 10 10 0 1
t156 a 4 INT 9 10 10 0 1
t156 b 4 INT 9 10 10 0 1
t156 c 4 INT 9 10 10 0 1
t156 d 4 INT 9 10 10 0 1
t156 e 4 INT 9 10 10 0 1
t157 a 4 INT 9 10 10 0 1
t157 b 4 INT 9 10 10 0 1
t157 c 4 INT 9 10 10 0 1
t157 d 4 INT 9 10 10 0 1
t157 e 4 INT 9 10 10 0 1
t158 a 4 INT 9 10 10 0 1
t158 b 4 INT 9 10 10 0 1
t158 c 4 INT 9 10 10 0 1
t158 d 4 INT 9 10 10 0 1
t158 e 4 INT 9 10 10 0 1
t159 a 4 INT 9 10 10 0 1
t159 b 4 INT 9 10 10 0 1
t159 c 4 INT 9 10 10 0 1
t159 d 4 INT 9 10 10 0 1
t159 e 4 INT 9 10 10 0 1
t160 a 4 INT 9 10 10 0 1
t160 b 4 INT 9 10 10 0 1
t160 c 4 INT 9 10 10 0 1
t160 d 4 INT 9 10 10 0 1
t160 e 4 INT 9 10 10 0 1
t161 a 4 INT 9 10 10 0 1
t161 b 4 INT 9 10 10 0 1
t161 c 4 INT 9 10 10 0 1
t161 d 4 INT 9 10 10 0 1
t161 e 4 INT 9 10 10 0 1
t162 a 4 INT 9 10 10 0 1
t162 b 4 INT 9 10 10 0 1
t162 c 4 INT 9 10 10 0 1
t162 d 4 INT 9 10 10 0 1
t162 e 4 INT 9 10 10 0 1
t163 a 4 INT 9 10 10 0 1
t163 b 4 INT 9 10 10 0 1
t163 c 4 INT 9 10 10 0 1
t163 d 4 INT 9 10 10 0 1
t163 e 4 INT 9 10 10 0 1
t164 a 4 INT 9 10 10 0 1
t164 b 4 INT 9 10 10 0 1
t164 c 4 INT 9 10 10 0 1
t164 d 4 INT 9 10 10 0 1
t164 e 4 INT 9 10 10 0 1
t165 a 4 INT 9 10 10 0 1
t165 b 4 INT 9 10 10 0 1
t165 c 4 INT 9 10 10 0 1
t165 d 4 INT 9 10 10 0 1
t165 e 4 INT 9 10 10 0 1
t166 a 4 INT 9 10 10 0 1
t166 b 4 INT 9 10 10 0 1
t166 c 4 INT 9 10 10 0 1
t166 d 4 INT 9 10 10 0 1
t166 e 4 INT 9 10 10 0 1
t167 a 4 INT 9 10 10 0 1
t167 b 4 INT 9 10 10 0 1
t167 c 4 INT 9 10 10 0 1
t167 d 4 INT 9 10 10 0 1
t167 e 4 INT 9 10 10 0 1
t168 a 4 INT 9 10 10 0 1
t168 b 4 INT 9 10 10 0 1
t168 c 4 INT 9 10 10 0 1
t168 d 4 INT 9 10 10 0 1
t168 e 4 INT 9 10 10 0 1
t169 a 4 INT 9 10 10 0 1
t169 b 4 INT 9 10 10 0 1
t169 c 4 INT 9 10 10 0 1
t169 d 4 INT 9 10 10 0 1
t169 e 4 INT 9 10 10 0 1
t170 a 4 INT 9 10 10 0 1
t170 b 4 INT 9 10 10 0 1
t170 c 4 INT 9 10 10 0 1
t170 d 4 INT 9 10 10 0 1
t170 e 4 INT 9 10 10 0 1
t171 a 4 INT 9 10 10 0 1
t171 b 4 INT 9 10 10 0 1
t171 c 4 INT 9 10 10 0 1
t171 d 4 INT 9 10 10 0 1
t171 e 4 INT 9 10 10 0 1
t172 a 4 INT 9 10 10 0 1
t172 b 4 INT 9 10 10 0 1
t172 c 4 INT 9 10 10 0 1
t172 d 4 INT 9 10 10 0 1
t172 e 4 INT 9 10 10 0 1
t173 a 4 INT 9 10 10 0 1
t173 b 4 INT 9 10 10 0 1
t173 c 4 INT 9 10 10 0 1
t173 d 4 INT 9 10 10 0 1
t173 e 4 INT 9 10 10 0 1
t174 a 4 INT 9 10 10 0 1
t174 b 4 INT 9 10 10 0 1
t174 c 4 INT 9 10 10 0 1
t174 d 4 INT 9 10 10 0 1
t174 e 4 INT 9 10 10 0 1
t175 a 4 INT 9 10 10 0 1
t175 b 4 INT 9 10 10 0 1
t175 c 4 INT 9 10 10 0 1
t175 d 4 INT 9 10 10 0 1
t175 e 4 INT 9 10 10 0 1
t176 a 4 INT 9 10 10 0 1
t176 b 4 INT 9 10 10 0 1
t176 c 4 INT 9 10 10 0 1
t176 d 4 INT 9 10 10 0 1
t176 e 4 INT 9 10 10 0 1
t177 a 4 INT 9 10 10 0 1
t177 b 4 INT 9 10 10 0 1
t177 c 4 INT 9 10 10 0 1
t177 d 4 INT 9 10 10 0 1
t177 e 4 INT 9 10 10 0 1
t178 a 4 INT 9 10 10 0 1
t178 b 4 INT 9 10 10 0 1
t178 c 4 INT 9 10 10 0 1
t178 d 4 INT 9 10 10 0 1
t178 e 4 INT 9 10 10 0 1
t179 a 4 INT 9 10 10 0 1
t179 b 4 INT 9 10 10 0 1
t179 c 4 INT 9 10 10 0 1
t179 d 4 INT 9 10 10 0 1
t179 e 4 INT 9 10 10 0 1
t180 a 4 INT 9 10 10 0 1
t180 b 4 INT 9 10 10 0 1
t180 c 4 INT 9 10 10 0 1
t180 d 4 INT 9 10 10 0 1
t180 e 4 INT 9 10 10 0 1
t181 a 4 INT 9 10 10 0 1
t181 b 4 INT 9 10 10 0 1
t181 c 4 INT 9 10 10 0 1
t181 d 4 INT 9 10 10 0 1
t181 e 4 INT 9 10 10 0 1
t182 a 4 INT 9 10 10 0 1
t182 b 4 INT 9 10 10 0 1
t182 c 4 INT 9 10 10 0 1
t182 d 4 INT 9 10 10 0 1
t182 e 4 INT 9 10 10 0 1
t183 a 4 INT 9 10 10 0 1
t183 b 4 INT 9 10 10 0 1
t183 c 4 INT 9 10 10 0 1
t183 d 4 INT 9 10 10 0 1
t183 e 4 INT 9 10 10 0 1
t184 a 4 INT 9 10 10 0 1
t184 b 4 INT 9 10 10 0 1
t184 c 4 INT 9 10 10 0 1
t184 d 4 INT 9 10 10 0 1
t184 e 4 INT 9 10 10 0 1
t185 a 4 INT 9 10 10 0 1
t185 b 4 INT 9 10 10 0 1
t185 c 4 INT 9 10 10 0 1
t185 d 4 INT 9 10 10 0 1
t185 e 4 INT 9 10 10 0 1
t186 a 4 INT 9 10 10 0 1
t186 b 4 INT 9 10 10 0 1
t186 c 4 INT 9 10 10 0 1
t186 d 4 INT 9 10 10 0 1
t186 e 4 INT 9 10 10 0 1
t187 a 4 INT 9 10 10 0 1
t187 b 4 INT 9 10 10 0 1
t187 c 4 INT 9 10 10 0 1
t187 d 4 INT 9 10 10 0 1
t187 e 4 INT 9 10 10 0 1
t188 a 4 INT 9 10 10 0 1
t188 b 4 INT 9 10 10 0 1
t188 c 4 INT 9 10 10 0 1
t188 d 4 INT 9 10 10 0 1
t188 e 4 INT 9 10 10 0 1
t189 a 4 INT 9 10 10 0 1
t189 b 4 INT 9 10 10 0 1
t189 c 4 INT 9 10 10 0 1
t189 d 4 INT 9 10 10 0 1
t189 e 4 INT 9 10 10 0 1
t190 a 4 INT 9 10 10 0 1
t190 b 4 INT 9 10 10 0 1
t190 c 4 INT 9 10 10 0 1
t190 d 4 INT 9 10 10 0 1
t190 e 4 INT 9 10 10 0 1
t191 a 4 INT 9 10 10 0 1
t191 b 4 INT 9 10 10 0 1
t191 c 4 INT 9 10 10 0 1
t191 d 4 INT 9 10 10 0 1
t191 e 4 INT 9 10 10 0 1
t192 a 4 INT 9 10 10 0 1
t192 b 4 INT 9 10 10 0 1
t192 c 4 INT 9 10 10 0 1
t192 d 4 INT 9 10 10 0 1
t192 e 4 INT 9 10 10 0 1
t193 a 4 INT 9 10 10 0 1
t193 b 4 INT 9 10 10 0 1
t193 c 4 INT 9 10 10 0 1
t193 d 4 INT 9 10 10 0 1
t193 e 4 INT 9 10 10 0 1
t194 a 4 INT 9 10 10 0 1
t194 b 4 INT 9 10 10 0 1
t194 c 4 INT 9 10 10 0 1
t194 d 4 INT 9 10 10 0 1
t194 e 4 INT 9 10 10 0 1
t195 a 4 INT 9 10 10 0 1
t195 b 4 INT 9 10 10 0 1
t195 c 4 INT 9 10 10 0 1
t195 d 4 INT 9 10 10 0 1
t195 e 4 INT 9 10 10 0 1
t196 a 4 INT 9 10 10 0 1
t196 b 4 INT 9 10 10 0 1
t196 c 4 INT 9 10 10 0 1
t196 d 4 INT 9 10 10 0 1
t196 e 4 INT 9 10 10 0 1
t197 a 4 INT 9 10 10 0 1
t197 b 4 INT 9 10 10 0 1
t197 c 4 INT 9 10 10 0 1
t197 d 4 INT 9 10 10 0 1
t197 e 4 INT 9 10 10 0 1
t198 a 4 INT 9 10 10 0 1
t198 b 4 INT 9 10 10 0 1
t198 c 4 INT 9 10 10 0 1
t198 d 4 INT 9 10 10 0 1
t198 e 4 INT 9 10 10 0 1
t199 a 4 INT 9 10 10 0 1
t199 b 4 INT 9 10 10 0 1
t199 c 4 INT 9 10 10 0 1
t199 d 4 INT 9 10 10 0 1
t199 e 4 INT 9 10 10 0 1
t200 a 4 INT 9 10 10 0 1
t200 b 4 INT 9 10 10 0 1
t200 c 4 INT 9 10 10 0 1
t200 d 4 INT 9 10 10 0 1
t200 e 4 INT 9 10 10 0 1
t201 a 4 INT 9 10 10 0 1
t201 b 4 INT 9 10 10 0 1
t201 c 4 INT 9 10 10 0 1
t201 d 4 INT 9 10 10 0 1
t201 e 4 INT 9 10 10 0 1
t202 a 4 INT 9 10 10 0 1
t202 b 4 INT 9 10 10 0 1
t202 c 4 INT 9 10 10 0 1
t202 d 4 INT 9 10 10 0 1
t202 e 4 INT 9 10 10 0 1
t203 a 4 INT 9 10 10 0 1
t203 b 4 INT 9 10 10 0 1
t203 c 4 INT 9 10 10 0 1
t203 d 4 INT 9 10 10 0 1
t203 e 4 INT 9 10 10 0 1
t204 a 4 INT 9 10 10 0 1
t204 b 4 INT 9 10 10 0 1
t204 c 4 INT 9 10 10 0 1
t204 d 4 INT 9 10 10 0 1
t204 e 4 INT 9 10 10 0 1
t205 a 4 INT 9 10 10 0 1
t205 b 4 INT 9 10 10 0 1
t205 c 4 INT 9 10 10 0 1
t205 d 4 INT 9 10 10 0 1
t205 e 4 INT 9 10 10 0 1
t206 a 4 INT 9 10 10 0 1
t206 b 4 INT 9 10 10 0 1
t206 c 4 INT 9 10 10 0 1
t206 d 4 INT 9 10 10 0 1
t206 e 4 INT 9 10 10 0 1
t207 a 4 INT 9 10 10 0 1
t207 b 4 INT 9 10 10 0 1
t207 c 4 INT 9 10 10 0 1
t207 d 4 INT 9 10 10 0 1
t207 e 4 INT 9 10 10 0 1
t208 a 4 INT 9 10 10 0 1
t208 b 4 INT 9 10 10 0 1
t208 c 4 INT 9 10 10 0 1
t208 d 4 INT 9 10 10 0 1
t208 e 4 INT 9 10 10 0 1
t209 a 4 INT 9 10 10 0 1
t209 b 4 INT 9 10 10 0 1
t209 c 4 INT 9 10 10 0 1
t209 d 4 INT 9 10 10 0 1
t209 e 4 INT 9 10 10 0 1
t210 a 4 INT 9 10 10 0 1
t210 b 4 INT 9 10 10 0 1
t210 c 4 INT 9 10 10 0 1
t210 d 4 INT 9 10 10 0 1
t210 e 4 INT 9 10 10 0 1
t211 a 4 INT 9 10 10 0 1
t211 b 4 INT 9 10 10 0 1
t211 c 4 INT 9 10 10 0 1
t211 d 4 INT 9 10 10 0 1
t211 e 4 INT 9 10 10 0 1
t212 a 4 INT 9 10 10 0 1
t212 b 4 INT 9 10 10 0 1
t212 c 4 INT 9 10 10 0 1
t212 d 4 INT 9 10 10 0 1
t212 e 4 INT 9 10 10 0 1
t213 a 4 INT 9 10 10 0 1
t213 b 4 INT 9 10 10 0 1
t213 c 4 INT 9 10 10 0 1
t213 d 4 INT 9 10 10 0 1
t213 e 4 INT 9 10 10 0 1
t214 a 4 INT 9 10 10 0 1
t214 b 4 INT 9 10 10 0 1
t214 c 4 INT 9 10 10 0 1
t214 d 4 INT 9 10 10 0 1
t214 e 4 INT 9 10 10 0 1
t215 a 4 INT 9 10 10 0 1
t215 b 4 INT 9 10 10 0 1
t215 c 4 INT 9 10 10 0 1
t215 d 4 INT 9 10 10 0 1
t215 e 4 INT 9 10 10 0 1
t216 a 4 INT 9 10 10 0 1
t216 b 4 INT 9 10 10 0 1
t216 c 4 INT 9 10 10 0 1
t216 d 4 INT 9 10 10 0 1
t216 e 4 INT 9 10 10 0 1
t217 a 4 INT 9 10 10 0 1
t217 b 4 INT 9 10 10 0 1
t217 c 4 INT 9 10 10 0 1
t217 d 4 INT 9 10 10 0 1
t217 e 4 INT 9 10 10 0 1
t218 a 4 INT 9 10 10 0 1
t218 b 4 INT 9 10 10 0 1
t218 c 4 INT 9 10 10 0 1
t218 d 4 INT 9 10 10 0 1
t218 e 4 INT 9 10 10 0 1
t219 a 4 INT 9 10 10 0 1
t219 b 4 INT 9 10 10 0 1
t219 c 4 INT 9 10 10 0 1
t219 d 4 INT 9 10 10 0 1
t219 e 4 INT 9 10 10 0 1
t220 a 4 INT 9 10 10 0 1
t220 b 4 INT 9 10 10 0 1
t220 c 4 INT 9 10 10 0 1
t220 d 4 INT 9 10 10 0 1
t220 e 4 INT 9 10 10 0 1
t221 a 4 INT 9 10 10 0 1
t221 b 4 INT 9 10 10 0 1
t221 c 4 INT 9 10 10 0 1
t221 d 4 INT 9 10 10 0 1
t221 e 4 INT 9 10 10 0 1
t222 a 4 INT 9 10 10 0 1
t222 b 4 INT 9 10 10 0 1
t222 c 4 INT 9 10 10 0 1
t222 d 4 INT 9 10 10 0 1
t222 e 4 INT 9 10 10 0 1
t223 a 4 INT 9 10 10 0 1
t223 b 4 INT 9 10 10 0 1
t223 c 4 INT 9 10 10 0 1
t223 d 4 INT 9 10 10 0 1
t223 e 4 INT 9 10 10 0 1
t224 a 4 INT 9 10 10 0 1
t224 b 4 INT 9 10 10 0 1
t224 c 4 INT 9 10 10 0 1
t224 d 4 INT 9 10 10 0 1
t224 e 4 INT 9 10 10 0 1
t225 a 4 INT 9 10 10 0 1
t225 b 4 INT 9 10 10 0 1
t225 c 4 INT 9 10 10 0 1
t225 d 4 INT 9 10 10 0 1
t225 e 4 INT 9 10 10 0 1
t226 a 4 INT 9 10 10 0 1
t226 b 4 INT 9 10 10 0 1
t226 c 4 INT 9 10 10 0 1
t226 d 4 INT 9 10 10 0 1
t226 e 4 INT 9 10 10 0 1
t227 a 4 INT 9 10 10 0 1
t227 b 4 INT 9 10 10 0 1
t227 c 4 INT 9 10 10 0 1
t227 d 4 INT 9 10 10 0 1
t227 e 4 INT 9 10 10 0 1
t228 a 4 INT 9 10 10 0 1
t228 b 4 INT 9 10 10 0 1
t228 c 4 INT 9 10 10 0 1
t228 d 4 INT 9 10 10 0 1
t228 e 4 INT 9 10 10 0 1
t229 a 4 INT 9 10 10 0 1
t229 b 4 INT 9 10 10 0 1
t229 c 4 INT 9 10 10 0 1
t229 d 4 INT 9 10 10 0 1
t229 e 4 INT 9 10 10 0 1
t230 a 4 INT 9 10 10 0 1
t230 b 4 INT 9 10 10 0 1
t230 c 4 INT 9 10 10 0 1
t230 d 4 INT 9 10 10 0 1
t230 e 4 INT 9 10 10 0 1
t231 a 4 INT 9 10 10 0 1
t231 b 4 INT 9 10 10 0 1
t231 c 4 INT 9 10 10 0 1
t231 d 4 INT 9 10 10 0 1
t231 e 4 INT 9 10 10 0 1
t232 a 4 INT 9 10 10 0 1
t232 b 4 INT 9 10 10 0 1
t232 c 4 INT 9 10 10 0 1
t232 d 4 INT 9 10 10 0 1
t232 e 4 INT 9 10 10 0 1
t233 a 4 INT 9 10 10 0 1
t233 b 4 INT 9 10 10 0 1
t233 c 4 INT 9 10 10 0 1
t233 d 4 INT 9 10 10 0 1
t233 e 4 INT 9 10 10 0 1
t234 a 4 INT 9 10 10 0 1
t234 b 4 INT 9 10 10 0 1
t234 c 4 INT 9 10 10 0 1
t234 d 4 INT 9 10 10 0 1
t234 e 4 INT 9 10 10 0 1
t235 a 4 INT 9 10 10 0 1
t235 b 4 INT 9 10 10 0 1
t235 c 4 INT 9 10 10 0 1
t235 d 4 INT 9 10 10 0 1
t235 e 4 INT 9 10 10 0 1
t236 a 4 INT 9 10 10 0 1
t236 b 4 INT 9 10 10 0 1
t236 c 4 INT 9 10 10 0 1
t236 d 4 INT 9 10 10 0 1
t236 e 4 INT 9 10 10 0 1
t237 a 4 INT 9 10 10 0 1
t237 b 4 INT 9 10 10 0 1
t237 c 4 INT 9 10 10 0 1
t237 d 4 INT 9 10 10 0 1
t237 e 4 INT 9 10 10 0 1
t238 a 4 INT 9 10 10 0 1
t238 b 4 INT 9 10 10 0 1
t238 c 4 INT 9 10 10 0 1
t238 d 4 INT 9 10 10 0 1
t238 e 4 INT 9 10 10 0 1
t239 a 4 INT 9 10 10 0 1
t239 b 4 INT 9 10 10 0 1
t239 c 4 INT 9 10 10 0 1
t239 d 4 INT 9 10 10 0 1
t239 e 4 INT 9 10 10 0 1
t240 a 4 INT 9 10 10 0 1
t240 b 4 INT 9 10 10 0 1
t240 c 4 INT 9 10 10 0 1
t240 d 4 INT 9 10 10 0 1
t240 e 4 INT 9 10 10 0 1
t241 a 4 INT 9 10 10 0 1
t241 b 4 INT 9 10 10 0 1
t241 c 4 INT 9 10 10 0 1
t241 d 4 INT 9 10 10 0 1
t241 e 4 INT 9 10 10 0 1
t242 a 4 INT 9 10 10 0 1
t242 b 4 INT 9 10 10 0 1
t242 c 4 INT 9 10 10 0 1
t242 d 4 INT 9 10 10 0 1
t242 e 4 INT 9 10 10 0 1
t243 a 4 INT 9 10 10 0 1
t243 b 4 INT 9 10 10 0 1
t243 c 4 INT 9 10 10 0 1
t243 d 4 INT 9 10 10 0 1
t243 e 4 INT 9 10 10 0 1
t244 a 4 INT 9 10 10 0 1
t244 b 4 INT 9 10 10 0 1
t244 c 4 INT 9 10 10 0 1
t244 d 4 INT 9 10 10 0 1
t244 e 4 INT 9 10 10 0 1
t245 a 4 INT 9 10 10 0 1
t245 b 4 INT 9 10 10 0 1
t245 c 4 INT 9 10 10 0 1
t245 d 4 INT 9 10 10 0 1
t245 e 4 INT 9 10 10 0 1
t246 a 4 INT 9 10 10 0 1
t246 b 4 INT 9 10 10 0 1
t246 c 4 INT 9 10 10 0 1
t246 d 4 INT 9 10 10 0 1
t246 e 4 INT 9 10 10 0 1
t247 a 4 INT 9 10 10 0 1
t247 b 4 INT 9 10 10 0 1
t247 c 4 INT 9 10 10 0 1
t247 d 4 INT 9 10 10 0 1
t247 e 4 INT 9 10 10 0 1
t248 a 4 INT 9 10 10 0 1
t248 b 4 INT 9 10 10 0 1
t248 c 4 INT 9 10 10 0 1
t248 d 4 INT 9 10 10 0 1
t248 e 4 INT 9 10 10 0 1
t249 a 4 INT 9 10 10 0 1
t249 b 4 INT 9 10 10 0 1
t249 c 4 INT 9 10 10 0 1
t249 d 4 INT 9 10 10 0 1
t249 e 4 INT 9 10 10 0 1
t250 a 4 INT 9 10 10 0 1
t250 b 4 INT 9 10 10 0 1
t250 c 4 INT 9 10 10 0 1
t250 d 4 INT 9 10 10 0 1
t250 e 4 INT 9 10 10 0 1
t251 a 4 INT 9 10 10 0 1
t251 b 4 INT 9 10 10 0 1
t251 c 4 INT 9 10 10 0 1
t251 d 4 INT 9 10 10 0 1
t251 e 4 INT 9 10 10 0 1
t252 a 4 INT 9 10 10 0 1
t252 b 4 INT 9 10 10 0 1
t252 c 4 INT 9 10 10 0 1
t252 d 4 INT 9 10 10 0 1
t252 e 4 INT 9 10 10 0 1
t253 a 4 INT 9 10 10 0 1
t253 b 4 INT 9 10 10 0 1
t253 c 4 INT 9 10 10 0 1
t253 d 4 INT 9 10 10 0 1
t253 e 4 INT 9 10 10 0 1
t254 a 4 INT 9 10 10 0 1
t254 b 4 INT 9 10 10 0 1
t254 c 4 INT 9 10 10 0 1
t254 d 4 INT 9 10 10 0 1
t254 e 4 INT 9 10 10 0 1
t255 a 4 INT 9 10 10 0 1
t255 b 4 INT 9 10 10 0 1
t255 c 4 INT 9 10 10 0 1
t255 d 4 INT 9 10 10 0 1
t255 e 4 INT 9 10 10 0 1
t256 a 4 INT 9 10 10 0 1
t256 b 4 INT 9 10 10 0 1
t256 c 4 INT 9 10 10 0 1
t256 d 4 INT 9 10 10 0 1
t256 e 4 INT 9 10 10 0 1
t257 a 4 INT 9 10 10 0 1
t257 b 4 INT 9 10 10 0 1
t257 c 4 INT 9 10 10 0 1
t257 d 4 INT 9 10 10 0 1
t257 e 4 INT 9 10 10 0 1
t258 a 4 INT 9 10 10 0 1
t258 b 4 INT 9 10 10 0 1
t258 c 4 INT 9 10 10 0 1
t258 d 4 INT 9 10 10 0 1
t258 e 4 INT 9 10 10 0 1
t259 a 4 INT 9 10 10 0 1
t259 b 4 INT 9 10 10 0 1
t259 c 4 INT 9 10 10 0 1
t259 d 4 INT 9 10 10 0 1
t259 e 4 INT 9 10 10 0 1
t260 a 4 INT 9 10 10 0 1
t260 b 4 INT 9 10 10 0 1
t260 c 4 INT 9 10 10 0 1
t260 d 4 INT 9 10 10 0 1
t260 e 4 INT 9 10 10 0 1
t261 a 4 INT 9 10 10 0 1
t261 b 4 INT 9 10 10 0 1
t261 c 4 INT 9 10 10 0 1
t261 d 4 INT 9 10 10 0 1
t261 e 4 INT 9 10 10 0 1
t262 a 4 INT 9 10 10 0 1
t262 b 4 INT 9 10 10 0 1
t262 c 4 INT 9 10 10 0 1
t262 d 4 INT 9 10 10 0 1
t262 e 4 INT 9 10 10 0 1
t263 a 4 INT 9 10 10 0 1
t263 b 4 INT 9 10 10 0 1
t263 c 4 INT 9 10 10 0 1
t263 d 4 INT 9 10 10 0 1
t263 e 4 INT 9 10 10 0 1
t264 a 4 INT 9 10 10 0 1
t264 b 4 INT 9 10 10 0 1
t264 c 4 INT 9 10 10 0 1
t264 d 4 INT 9 10 10 0 1
t264 e 4 INT 9 10 10 0 1
t265 a 4 INT 9 10 10 0 1
t265 b 4 INT 9 10 10 0 1
t265 c 4 INT 9 10 10 0 1
t265 d 4 INT 9 10 10 0 1
t265 e 4 INT 9 10 10 0 1
t266 a 4 INT 9 10 10 0 1
t266 b 4 INT 9 10 10 0 1
t266 c 4 INT 9 10 10 0 1
t266 d 4 INT 9 10 10 0 1
t266 e 4 INT 9 10 10 0 1
t267 a 4 INT 9 10 10 0 1
t267 b 4 INT 9 10 10 0 1
t267 c 4 INT 9 10 10 0 1
t267 d 4 INT 9 10 10 0 1
t267 e 4 INT 9 10 10 0 1
t268 a 4 INT 9 10 10 0 1
t268 b 4 INT 9 10 10 0 1
t268 c 4 INT 9 10 10 0 1
t268 d 4 INT 9 10 10 0 1
t268 e 4 INT 9 10 10 0 1
t269 a 4 INT 9 10 10 0 1
t269 b 4 INT 9 10 10 0 1
t269 c 4 INT 9 10 10 0 1
t269 d 4 INT 9 10 10 0 1
t269 e 4 INT 9 10 10 0 1
t270 a 4 INT 9 10 10 0 1
t270 b 4 INT 9 10 10 0 1
t270 c 4 INT 9 10 10 0 1
t270 d 4 INT 9 10 10 0 1
t270 e 4 INT 9 10 10 0 1
t271 a 4 INT 9 10 10 0 1
t271 b 4 INT 9 10 10 0 1
t271 c 4 INT 9 10 10 0 1
t271 d 4 INT 9 10 10 0 1
t271 e 4 INT 9 10 10 0 1
t272 a 4 INT 9 10 10 0 1
t272 b 4 INT 9 10 10 0 1
t272 c 4 INT 9 10 10 0 1
t272 d 4 INT 9 10 10 0 1
t272 e 4 INT 9 10 10 0 1
t273 a 4 INT 9 10 10 0 1
t273 b 4 INT 9 10 10 0 1
t273 c 4 INT 9 10 10 0 1
t273 d 4 INT 9 10 10 0 1
t273 e 4 INT 9 10 10 0 1
t274 a 4 INT 9 10 10 0 1
t274 b 4 INT 9 10 10 0 1
t274 c 4 INT 9 10 10 0 1
t274 d 4 INT 9 10 10 0 1
t274 e 4 INT 9 10 10 0 1
t275 a 4 INT 9 10 10 0 1
t275 b 4 INT 9 10 10 0 1
t275 c 4 INT 9 10 10 0 1
t275 d 4 INT 9 10 10 0 1
t275 e 4 INT 9 10 10 0 1
t276 a 4 INT 9 10 10 0 1
t276 b 4 INT 9 10 10 0 1
t276 c 4 INT 9 10 10 0 1
t276 d 4 INT 9 10 10 0 1
t276 e 4 INT 9 10 10 0 1
t277 a 4 INT 9 10 10 0 1
t277 b 4 INT 9 10 10 0 1
t277 c 4 INT 9 10 10 0 1
t277 d 4 INT 9 10 10 0 1
t277 e 4 INT 9 10 10 0 1
t278 a 4 INT 9 10 10 0 1
t278 b 4 INT 9 10 10 0 1
t278 c 4 INT 9 10 10 0 1
t278 d 4 INT 9 10 10 0 1
t278 e 4 INT 9 10 10 0 1
t279 a 4 INT 9 10 10 0 1
t279 b 4 INT 9 10 10 0 1
t279 c 4 INT 9 10 10 0 1
t279 d 4 INT 9 10 10 0 1
t279 e 4 INT 9 10 10 0 1
t280 a 4 INT 9 10 10 0 1
t280 b 4 INT 9 10 10 0 1
t280 c 4 INT 9 10 10 0 1
t280 d 4 INT 9 10 10 0 1
t280 e 4 INT 9 10 10 0 1
t281 a 4 INT 9 10 10 0 1
t281 b 4 INT 9 10 10 0 1
t281 c 4 INT 9 10 10 0 1
t281 d 4 INT 9 10 10 0 1
t281 e 4 INT 9 10 10 0 1
t282 a 4 INT 9 10 10 0 1
t282 b 4 INT 9 10 10 0 1
t282 c 4 INT 9 10 10 0 1
t282 d 4 INT 9 10 10 0 1
t282 e 4 INT 9 10 10 0 1
t283 a 4 INT 9 10 10 0 1
t283 b 4 INT 9 10 10 0 1
t283 c 4 INT 9 10 10 0 1
t283 d 4 INT 9 10 10 0 1
t283 e 4 INT 9 10 10 0 1
t284 a 4 INT 9 10 10 0 1
t284 b 4 INT 9 10 10 0 1
t284 c 4 INT 9 10 10 0 1
t284 d 4 INT 9 10 10 0 1
t284 e 4 INT 9 10 10 0 1
t285 a 4 INT 9 10 10 0 1
t285 b 4 INT 9 10 10 0 1
t285 c 4 INT 9 10 10 0 1
t285 d 4 INT 9 10 10 0 1
t285 e 4 INT 9 10 10 0 1
t286 a 4 INT 9 10 10 0 1
t286 b 4 INT 9 10 10 0 1
t286 c 4 INT 9 10 10 0 1
t286 d 4 INT 9 10 10 0 1
t286 e 4 INT 9 10 10 0 1
t287 a 4 INT 9 10 10 0 1
t287 b 4 INT 9 10 10 0 1
t287 c 4 INT 9 10 10 0 1
t287 d 4 INT 9 10 10 0 1
t287 e 4 INT 9 10 10 0 1
t288 a 4 INT 9 10 10 0 1
t288 b 4 INT 9 10 10 0 1
t288 c 4 INT 9 10 10 0 1
t288 d 4 INT 9 10 10 0 1
t288 e 4 INT 9 10 10 0 1
t289 a 4 INT 9 10 10 0 1
t289 b 4 INT 9 10 10 0 1
t289 c 4 INT 9 10 10 0 1
t289 d 4 INT 9 10 10 0 1
t289 e 4 INT 9 10 10 0 1
t290 a 4 INT 9 10 10 0 1
t290 b 4 INT 9 10 10 0 1
t290 c 4 INT 9 10 10 0 1
t290 d 4 INT 9 10 10 0 1
t290 e 4 INT 9 10 10 0 1
t291 a 4 INT 9 10 10 0 1
t291 b 4 INT 9 10 10 0 1
t291 c 4 INT 9 10 10 0 1
t291 d 4 INT 9 10 10 0 1
t291 e 4 INT 9 10 10 0 1
t292 a 4 INT 9 10 10 0 1
t292 b 4 INT 9 10 10 0 1
t292 c 4 INT 9 10 10 0 1
t292 d 4 INT 9 10 10 0 1
t292 e 4 INT 9 10 10 0 1
t293 a 4 INT 9 10 10 0 1
t293 b 4 INT 9 10 10 0 1
t293 c 4 INT 9 10 10 0 1
t293 d 4 INT 9 10 10 0 1
t293 e 4 INT 9 10 10 0 1
t294 a 4 INT 9 10 10 0 1
t294 b 4 INT 9 10 10 0 1
t294 c 4 INT 9 10 10 0 1
t294 d 4 INT 9 10 10 0 1
t294 e 4 INT 9 10 10 0 1
t295 a 4 INT 9 10 10 0 1
t295 b 4 INT 9 10 10 0 1
t295 c 4 INT 9 10 10 0 1
t295 d 4 INT 9 10 10 0 1
t295 e 4 INT 9 10 10 0 1
t296 a 4 INT 9 10 10 0 1
t296 b 4 INT 9 10 10 0 1
t296 c 4 INT 9 10 10 0 1
t296 d 4 INT 9 10 10 0 1
t296 e 4 INT 9 10 10 0 1
t297 a 4 INT 9 10 10 0 1
t297 b 4 INT 9 10 10 0 1
t297 c 4 INT 9 10 10 0 1
t297 d 4 INT 9 10 10 0 1
t297 e 4 INT 9 10 10 0 1
t298 a 4 INT 9 10 10 0 1
t298 b 4 INT 9 10 10 0 1
t298 c 4 INT 9 10 10 0 1
t298 d 4 INT 9 10 10 0 1
t298 e 4 INT 9 10 10 0 1
t299 a 4 INT 9 10 10 0 1
t299 b 4 INT 9 10 10 0 1
t299 c 4 INT 9 10 10 0 1
t299 d 4 INT 9 10 10 0 1
t299 e 4 INT 9 10 10 0 1
t300 a 4 INT 9 10 10 0 1
t300 b 4 INT 9 10 10 0 1
t300 c 4 INT 9 10 10 0 1
t300 d 4 INT 9 10 10 0 1
t300 e 4 INT 9 10 10 0 1
t301 a 4 INT 9 10 10 0 1
t301 b 4 INT 9 10 10 0 1
t301 c 4 INT 9 10 10 0 1
t301 d 4 INT 9 10 10 0 1
t301 e 4 INT 9 10 10 0 1
t302 a 4 INT 9 10 10 0 1
t302 b 4 INT 9 10 10 0 1
t302 c 4 INT 9 10 10 0 1
t302 d 4 INT 9 10 10 0 1
t302 e 4 INT 9 10 10 0 1
t303 a 4 INT 9 10 10 0 1
t303 b 4 INT 9 10 10 0 1
t303 c 4 INT 9 10 10 0 1
t303 d 4 INT 9 10 10 0 1
t303 e 4 INT 9 10 10 0 1
t304 a 4 INT 9 10 10 0 1
t304 b 4 INT 9 10 10 0 1
t304 c 4 INT 9 10 10 0 1
t304 d 4 INT 9 10 10 0 1
t304 e 4 INT 9 10 10 0 1
t305 a 4 INT 9 10 10 0 1
t305 b 4 INT 9 10 10 0 1
t305 c 4 INT 9 10 10 0 1
t305 d 4 INT 9 10 10 0 1
t305 e 4 INT 9 10 10 0 1
t306 a 4 INT 9 10 10 0 1
t306 b 4 INT 9 10 10 0 1
t306 c 4 INT 9 10 10 0 1
t306 d 4 INT 9 10 10 0 1
t306 e 4 INT 9 10 10 0 1
t307 a 4 INT 9 10 10 0 1
t307 b 4 INT 9 10 10 0 1
t307 c 4 INT 9 10 10 0 1
t307 d 4 INT 9 10 10 0 1
t307 e 4 INT 9 10 10 0 1
t308 a 4 INT 9 10 10 0 1
t308 b 4 INT 9 10 10 0 1
t308 c 4 INT 9 10 10 0 1
t308 d 4 INT 9 10 10 0 1
t308 e 4 INT 9 10 10 0 1
t309 a 4 INT 9 10 10 0 1
t309 b 4 INT 9 10 10 0 1
t309 c 4 INT 9 10 10 0 1
t309 d 4 INT 9 10 10 0 1
t309 e 4 INT 9 10 10 0 1
t310 a 4 INT 9 10 10 0 1
t310 b 4 INT 9 10 10 0 1
t310 c 4 INT 9 10 10 0 1
t310 d 4 INT 9 10 10 0 1
t310 e 4 INT 9 10 10 0 1
t311 a 4 INT 9 10 10 0 1
t311 b 4 INT 9 10 10 0 1
t311 c 4 INT 9 10 10 0 1
t311 d 4 INT 9 10 10 0 1
t311 e 4 INT 9 10 10 0 1
t312 a 4 INT 9 10 10 0 1
t312 b 4 INT 9 10 10 0 1
t312 c 4 INT 9 10 10 0 1
t312 d 4 INT 9 10 10 0 1
t312 e 4 INT 9 10 10 0 1
t313 a 4 INT 9 10 10 0 1
t313 b 4 INT 9 10 10 0 1
t313 c 4 INT 9 10 10 0 1
t313 d 4 INT 9 10 10 0 1
t313 e 4 INT 9 10 10 0 1
t314 a 4 INT 9 10 10 0 1
t314 b 4 INT 9 10 10 0 1
t314 c 4 INT 9 10 10 0 1
t314 d 4 INT 9 10 10 0 1
t314 e 4 INT 9 10 10 0 1
t315 a 4 INT 9 10 10 0 1
t315 b 4 INT 9 10 10 0 1
t315 c 4 INT 9 10 10 0 1
t315 d 4 INT 9 10 10 0 1
t315 e 4 INT 9 10 10 0 1
t316 a 4 INT 9 10 10 0 1
t316 b 4 INT 9 10 10 0 1
t316 c 4 INT 9 10 10 0 1
t316 d 4 INT 9 10 10 0 1
t316 e 4 INT 9 10 10 0 1
t317 a 4 INT 9 10 10 0 1
t317 b 4 INT 9 10 10 0 1
t317 c 4 INT 9 10 10 0 1
t317 d 4 INT 9 10 10 0 1
t317 e 4 INT 9 10 10 0 1
t318 a 4 INT 9 10 10 0 1
t318 b 4 INT 9 10 10 0 1
t318 c 4 INT 9 10 10 0 1
t318 d 4 INT 9 10 10 0 1
t318 e 4 INT 9 10 10 0 1
t319 a 4 INT 9 10 10 0 1
t319 b 4 INT 9 10 10 0 1
t319 c 4 INT 9 10 10 0 1
t319 d 4 INT 9 10 10 0 1
t319 e 4 INT 9 10 10 0 1
t320 a 4 INT 9 10 10 0 1
t320 b 4 INT 9 10 10 0 1
t320 c 4 INT 9 10 10 0 1
t320 d 4 INT 9 10 10 0 1
t320 e 4 INT 9 10 10 0 1
t321 a 4 INT 9 10 10 0 1
t321 b 4 INT 9 10 10 0 1
t321 c 4 INT 9 10 10 0 1
t321 d 4 INT 9 10 10 0 1
t321 e 4 INT 9 10 10 0 1
t322 a 4 INT 9 10 10 0 1
t322 b 4 INT 9 10 10 0 1
t322 c 4 INT 9 10 10 0 1
t322 d 4 INT 9 10 10 0 1
t322 e 4 INT 9 10 10 0 1
t323 a 4 INT 9 10 10 0 1
t323 b 4 INT 9 10 10 0 1
t323 c 4 INT 9 10 10 0 1
t323 d 4 INT 9 10 10 0 1
t323 e 4 INT 9 10 10 0 1
t324 a 4 INT 9 10 10 0 1
t324 b 4 INT 9 10 10 0 1
t324 c 4 INT 9 10 10 0 1
t324 d 4 INT 9 10 10 0 1
t324 e 4 INT 9 10 10 0 1
t325 a 4 INT 9 10 10 0 1
t325 b 4 INT 9 10 10 0 1
t325 c 4 INT 9 10 10 0 1
t325 d 4 INT 9 10 10 0 1
t325 e 4 INT 9 10 10 0 1
t326 a 4 INT 9 10 10 0 1
t326 b 4 INT 9 10 10 0 1
t326 c 4 INT 9 10 10 0 1
t326 d 4 INT 9 10 10 0 1
t326 e 4 INT 9 10 10 0 1
t327 a 4 INT 9 10 10 0 1
t327 b 4 INT 9 10 10 0 1
t327 c 4 INT 9 10 10 0 1
t327 d 4 INT 9 10 10 0 1
t327 e 4 INT 9 10 10 0 1
t328 a 4 INT 9 10 10 0 1
t328 b 4 INT 9 10 10 0 1
t328 c 4 INT 9 10 10 0 1
t328 d 4 INT 9 10 10 0 1
t328 e 4 INT 9 10 10 0 1
t329 a 4 INT 9 10 10 0 1
t329 b 4 INT 9 10 10 0 1
t329 c 4 INT 9 10 10 0 1
t329 d 4 INT 9 10 10 0 1
t329 e 4 INT 9 10 10 0 1
t330 a 4 INT 9 10 10 0 1
t330 b 4 INT 9 10 10 0 1
t330 c 4 INT 9 10 10 0 1
t330 d 4 INT 9 10 10 0 1
t330 e 4 INT 9 10 10 0 1
t331 a 4 INT 9 10 10 0 1
t331 b 4 INT 9 10 10 0 1
t331 c 4 INT 9 10 10 0 1
t331 d 4 INT 9 10 10 0 1
t331 e 4 INT 9 10 10 0 1
t332 a 4 INT 9 10 10 0 1
t332 b 4 INT 9 10 10 0 1
t332 c 4 INT 9 10 10 0 1
t332 d 4 INT 9 10 10 0 1
t332 e 4 INT 9 10 10 0 1
t333 a 4 INT 9 10 10 0 1
t333 b 4 INT 9 10 10 0 1
t333 c 4 INT 9 10 10 0 1
t333 d 4 INT 9 10 10 0 1
t333 e 4 INT 9 10 10 0 1
t334 a 4 INT 9 10 10 0 1
t334 b 4 INT 9 10 10 0 1
t334 c 4 INT 9 10 10 0 1
t334 d 4 INT 9 10 10 0 1
t334 e 4 INT 9 10 10 0 1
t335 a 4 INT 9 10 10 0 1
t335 b 4 INT 9 10 10 0 1
t335 c 4 INT 9 10 10 0 1
t335 d 4 INT 9 10 10 0 1
t335 e 4 INT 9 10 10 0 1
t336 a 4 INT 9 10 10 0 1
t336 b 4 INT 9 10 10 0 1
t336 c 4 INT 9 10 10 0 1
t336 d 4 INT 9 10 10 0 1
t336 e 4 INT 9 10 10 0 1
t337 a 4 INT 9 10 10 0 1
t337 b 4 INT 9 10 10 0 1
t337 c 4 INT 9 10 10 0 1
t337 d 4 INT 9 10 10 0 1
t337 e 4 INT 9 10 10 0 1
t338 a 4 INT 9 10 10 0 1
t338 b 4 INT 9 10 10 0 1
t338 c 4 INT 9 10 10 0 1
t338 d 4 INT 9 10 10 0 1
t338 e 4 INT 9 10 10 0 1
t339 a 4 INT 9 10 10 0 1
t339 b 4 INT 9 10 10 0 1
t339 c 4 INT 9 10 10 0 1
t339 d 4 INT 9 10 10 0 1
t339 e 4 INT 9 10 10 0 1
t340 a 4 INT 9 10 10 0 1
t340 b 4 INT 9 10 10 0 1
t340 c 4 INT 9 10 10 0 1
t340 d 4 INT 9 10 10 0 1
t340 e 4 INT 9 10 10 0 1
t341 a 4 INT 9 10 10 0 1
t341 b 4 INT 9 10 10 0 1
t341 c 4 INT 9 10 10 0 1
t341 d 4 INT 9 10 10 0 1
t341 e 4 INT 9 10 10 0 1
t342 a 4 INT 9 10 10 0 1
t342 b 4 INT 9 10 10 0 1
t342 c 4 INT 9 10 10 0 1
t342 d 4 INT 9 10 10 0 1
t342 e 4 INT 9 10 10 0 1
t343 a 4 INT 9 10 10 0 1
t343 b 4 INT 9 10 10 0 1
t343 c 4 INT 9 10 10 0 1
t343 d 4 INT 9 10 10 0 1
t343 e 4 INT 9 10 10 0 1
t344 a 4 INT 9 10 10 0 1
t344 b 4 INT 9 10 10 0 1
t344 c 4 INT 9 10 10 0 1
t344 d 4 INT 9 10 10 0 1
t344 e 4 INT 9 10 10 0 1
t345 a 4 INT 9 10 10 0 1
t345 b 4 INT 9 10 10 0 1
t345 c 4 INT 9 10 10 0 1
t345 d 4 INT 9 10 10 0 1
t345 e 4 INT 9 10 10 0 1
t346 a 4 INT 9 10 10 0 1
t346 b 4 INT 9 10 10 0 1
t346 c 4 INT 9 10 10 0 1
t346 d 4 INT 9 10 10 0 1
t346 e 4 INT 9 10 10 0 1
t347 a 4 INT 9 10 10 0 1
t347 b 4 INT 9 10 10 0 1
t347 c 4 INT 9 10 10 0 1
t347 d 4 INT 9 10 10 0 1
t347 e 4 INT 9 10 10 0 1
t348 a 4 INT 9 10 10 0 1
t348 b 4 INT 9 10 10 0 1
t348 c 4 INT 9 10 10 0 1
t348 d 4 INT 9 10 10 0 1
t348 e 4 INT 9 10 10 0 1
t349 a 4 INT 9 10 10 0 1
t349 b 4 INT 9 10 10 0 1
t349 c 4 INT 9 10 10 0 1
t349 d 4 INT 9 10 10 0 1
t349 e 4 INT 9 10 10 0 1
t350 a 4 INT 9 10 10 0 1
t350 b 4 INT 9 10 10 0 1
t350 c 4 INT 9 10 10 0 1
t350 d 4 INT 9 10 10 0 1
t350 e 4 INT 9 10 10 0 1
t351 a 4 INT 9 10 10 0 1
t351 b 4 INT 9 10 10 0 1
t351 c 4 INT 9 10 10 0 1
t351 d 4 INT 9 10 10 0 1
t351 e 4 INT 9 10 10 0 1
t352 a 4 INT 9 10 10 0 1
t352 b 4 INT 9 10 10 0 1
t352 c 4 INT 9 10 10 0 1
t352 d 4 INT 9 10 10 0 1
t352 e 4 INT 9 10 10 0 1
t353 a 4 INT 9 10 10 0 1
t353 b 4 INT 9 10 10 0 1
t353 c 4 INT 9 10 10 0 1
t353 d 4 INT 9 10 10 0 1
t353 e 4 INT 9 10 10 0 1
t354 a 4 INT 9 10 10 0 1
t354 b 4 INT 9 10 10 0 1
t354 c 4 INT 9 10 10 0 1
t354 d 4 INT 9 10 10 0 1
t354 e 4 INT 9 10 10 0 1
t355 a 4 INT 9 10 10 0 1
t355 b 4 INT 9 10 10 0 1
t355 c 4 INT 9 10 10 0 1
t355 d 4 INT 9 10 10 0 1
t355 e 4 INT 9 10 10 0 1
t356 a 4 INT 9 10 10 0 1
t356 b 4 INT 9 10 10 0 1
t356 c 4 INT 9 10 10 0 1
t356 d 4 INT 9 10 10 0 1
t356 e 4 INT 9 10 10 0 1
t357 a 4 INT 9 10 10 0 1
t357 b 4 INT 9 10 10 0 1
t357 c 4 INT 9 10 10 0 1
t357 d 4 INT 9 10 10 0 1
t357 e 4 INT 9 10 10 0 1
t358 a 4 INT 9 10 10 0 1
t358 b 4 INT 9 10 10 0 1
t358 c 4 INT 9 10 10 0 1
t358 d 4 INT 9 10 10 0 1
t358 e 4 INT 9 10 10 0 1
t359 a 4 INT 9 10 10 0 1
t359 b 4 INT 9 10 10 0 1
t359 c 4 INT 9 10 10 0 1
t359 d 4 INT 9 10 10 0 1
t359 e 4 INT 9 10 10 0 1
t360 a 4 INT 9 10 10 0 1
t360 b 4 INT 9 10 10 0 1
t360 c 4 INT 9 10 10 0 1
t360 d 4 INT 9 10 10 0 1
t360 e 4 INT 9 10 10 0 1
t361 a 4 INT 9 10 10 0 1
t361 b 4 INT 9 10 10 0 1
t361 c 4 INT 9 10 10 0 1
t361 d 4 INT 9 10 10 0 1
t361 e 4 INT 9 10 10 0 1
t362 a 4 INT 9 10 10 0 1
t362 b 4 INT 9 10 10 0 1
t362 c 4 INT 9 10 10 0 1
t362 d 4 INT 9 10 10 0 1
t362 e 4 INT 9 10 10 0 1
t363 a 4 INT 9 10 10 0 1
t363 b 4 INT 9 10 10 0 1
t363 c 4 INT 9 10 10 0 1
t363 d 4 INT 9 10 10 0 1
t363 e 4 INT 9 10 10 0 1
t364 a 4 INT 9 10 10 0 1
t364 b 4 INT 9 10 10 0 1
t364 c 4 INT 9 10 10 0 1
t364 d 4 INT 9 10 10 0 1
t364 e 4 INT 9 10 10 0 1
t365 a 4 INT 9 10 10 0 1
t365 b 4 INT 9 10 10 0 1
t365 c 4 INT 9 10 10 0 1
t365 d 4 INT 9 10 10 0 1
t365 e 4 INT 9 10 10 0 1
t366 a 4 INT 9 10 10 0 1
t366 b 4 INT 9 10 10 0 1
t366 c 4 INT 9 10 10 0 1
t366 d 4 INT 9 10 10 0 1
t366 e 4 INT 9 10 10 0 1
t367 a 4 INT 9 10 10 0 1
t367 b 4 INT 9 10 10 0 1
t367 c 4 INT 9 10 10 0 1
t367 d 4 INT 9 10 10 0 1
t367 e 4 INT 9 10 10 0 1
t368 a 4 INT 9 10 10 0 1
t368 b 4 INT 9 10 10 0 1
t368 c 4 INT 9 10 10 0 1
t368 d 4 INT 9 10 10 0 1
t368 e 4 INT 9 10 10 0 1
t369 a 4 INT 9 10 10 0 1
t369 b 4 INT 9 10 10 0 1
t369 c 4 INT 9 10 10 0 1
t369 d 4 INT 9 10 10 0 1
t369 e 4 INT 9 10 10 0 1
t370 a 4 INT 9 10 10 0 1
t370 b 4 INT 9 10 10 0 1
t370 c 4 INT 9 10 10 0 1
t370 d 4 INT 9 10 10 0 1
t370 e 4 INT 9 10 10 0 1
t371 a 4 INT 9 10 10 0 1
t371 b 4 INT 9 10 10 0 1
t371 c 4 INT 9 10 10 0 1
t371 d 4 INT 9 10 10 0 1
t371 e 4 INT 9 10 10 0 1
t372 a 4 INT 9 10 10 0 1
t372 b 4 INT 9 10 10 0 1
t372 c 4 INT 9 10 10 0 1
t372 d 4 INT 9 10 10 0 1
t372 e 4 INT 9 10 10 0 1
t373 a 4 INT 9 10 10 0 1
t373 b 4 INT 9 10 10 0 1
t373 c 4 INT 9 10 10 0 1
t373 d 4 INT 9 10 10 0 1
t373 e 4 INT 9 10 10 0 1
t374 a 4 INT 9 10 10 0 1
t374 b 4 INT 9 10 10 0 1
t374 c 4 INT 9 10 10 0 1
t374 d 4 INT 9 10 10 0 1
t374 e 4 INT 9 10 10 0 1
t375 a 4 INT 9 10 10 0 1
t375 b 4 INT 9 10 10 0 1
t375 c 4 INT 9 10 10 0 1
t375 d 4 INT 9 10 10 0 1
t375 e 4 INT 9 10 10 0 1
t376 a 4 INT 9 10 10 0 1
t376 b 4 INT 9 10 10 0 1
t376 c 4 INT 9 10 10 0 1
t376 d 4 INT 9 10 10 0 1
t376 e 4 INT 9 10 10 0 1
t377 a 4 INT 9 10 10 0 1
t377 b 4 INT 9 10 10 0 1
t377 c 4 INT 9 10 10 0 1
t377 d 4 INT 9 10 10 0 1
t377 e 4 INT 9 10 10 0 1
t378 a 4 INT 9 10 10 0 1
t378 b 4 INT 9 10 10 0 1
t378 c 4 INT 9 10 10 0 1
t378 d 4 INT 9 10 10 0 1
t378 e 4 INT 9 10 10 0 1
t379 a 4 INT 9 10 10 0 1
t379 b 4 INT 9 10 10 0 1
t379 c 4 INT 9 10 10 0 1
t379 d 4 INT 9 10 10 0 1
t379 e 4 INT 9 10 10 0 1
t380 a 4 INT 9 10 10 0 1
t380 b 4 INT 9 10 10 0 1
t380 c 4 INT 9 10 10 0 1
t380 d 4 INT 9 10 10 0 1
t380 e 4 INT 9 10 10 0 1
t381 a 4 INT 9 10 10 0 1
t381 b 4 INT 9 10 10 0 1
t381 c 4 INT 9 10 10 0 1
t381 d 4 INT 9 10 10 0 1
t381 e 4 INT 9 10 10 0 1
t382 a 4 INT 9 10 10 0 1
t382 b 4 INT 9 10 10 0 1
t382 c 4 INT 9 10 10 0 1
t382 d 4 INT 9 10 10 0 1
t382 e 4 INT 9 10 10 0 1
t383 a 4 INT 9 10 10 0 1
t383 b 4 INT 9 10 10 0 1
t383 c 4 INT 9 10 10 0 1
t383 d 4 INT 9 10 10 0 1
t383 e 4 INT 9 10 10 0 1
t384 a 4 INT 9 10 10 0 1
t384 b 4 INT 9 10 10 0 1
t384 c 4 INT 9 10 10 0 1
t384 d 4 INT 9 10 10 0 1
t384 e 4 INT 9 10 10 0 1
t385 a 4 INT 9 10 10 0 1
t385 b 4 INT 9 10 10 0 1
t385 c 4 INT 9 10 10 0 1
t385 d 4 INT 9 10 10 0 1
t385 e 4 INT 9 10 10 0 1
t386 a 4 INT 9 10 10 0 1
t386 b 4 INT 9 10 10 0 1
t386 c 4 INT 9 10 10 0 1
t386 d 4 INT 9 10 10 0 1
t386 e 4 INT 9 10 10 0 1
t387 a 4 INT 9 10 10 0 1
t387 b 4 INT 9 10 10 0 1
t387 c 4 INT 9 10 10 0 1
t387 d 4 INT 9 10 10 0 1
t387 e 4 INT 9 10 10 0 1
t388 a 4 INT 9 10 10 0 1
t388 b 4 INT 9 10 10 0 1
t388 c 4 INT 9 10 10 0 1
t388 d 4 INT 9 10 10 0 1
t388 e 4 INT 9 10 10 0 1
t389 a 4 INT 9 10 10 0 1
t389 b 4 INT 9 10 10 0 1
t389 c 4 INT 9 10 10 0 1
t389 d 4 INT 9 10 10 0 1
t389 e 4 INT 9 10 10 0 1
t390 a 4 INT 9 10 10 0 1
t390 b 4 INT 9 10 10 0 1
t390 c 4 INT 9 10 10 0 1
t390 d 4 INT 9 10 10 0 1
t390 e 4 INT 9 10 10 0 1
t391 a 4 INT 9 10 10 0 1
t391 b 4 INT 9 10 10 0 1
t391 c 4 INT 9 10 10 0 1
t391 d 4 INT 9 10 10 0 1
t391 e 4 INT 9 10 10 0 1
t392 a 4 INT 9 10 10 0 1
t392 b 4 INT 9 10 10 0 1
t392 c 4 INT 9 10 10 0 1
t392 d 4 INT 9 10 10 0 1
t392 e 4 INT 9 10 10 0 1
t393 a 4 INT 9 10 10 0 1
t393 b 4 INT 9 10 10 0 1
t393 c 4 INT 9 10 10 0 1
t393 d 4 INT 9 10 10 0 1
t393 e 4 INT 9 10 10 0 1
t394 a 4 INT 9 10 10 0 1
t394 b 4 INT 9 10 10 0 1
t394 c 4 INT 9 10 10 0 1
t394 d 4 INT 9 10 10 0 1
t394 e 4 INT 9 10 10 0 1
t395 a 4 INT 9 10 10 0 1
t395 b 4 INT 9 10 10 0 1
t395 c 4 INT 9 10 10 0 1
t395 d 4 INT 9 10 10 0 1
t395 e 4 INT 9 10 10 0 1
t396 a 4 INT 9 10 10 0 1
t396 b 4 INT 9 10 10 0 1
t396 c 4 INT 9 10 10 0 1
t396 d 4 INT 9 10 10 0 1
t396 e 4 INT 9 10 10 0 1
t397 a 4 INT 9 10 10 0 1
t397 b 4 INT 9 10 10 0 1
t397 c 4 INT 9 10 10 0 1
t397 d 4 INT 9 10 10 0 1
t397 e 4 INT 9 10 10 0 1
t398 a 4 INT 9 10 10 0 1
t398 b 4 INT 9 10 10 0 1
t398 c 4 INT 9 10 10 0 1
t398 d 4 INT 9 10 10 0 1
t398 e 4 INT 9 10 10 0 1
t399 a 4 INT 9 10 10 0 1
t399 b 4 INT 9 10 10 0 1
t399 c 4 INT 9 10 10 0 1
t399 d 4 INT 9 10 10 0 1
t399 e 4 INT 9 10 10 0 1
DROP TABLE t1;
CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Tables TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=MTR_SUITE_DIR/std_data/test.sqlite3;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8;
SELECT * FROM t1 ORDER BY Table_name;
Table_Qualifier Table_Owner Table_Name Table_Type Remark
t000 TABLE
t001 TABLE
t002 TABLE
t003 TABLE
t004 TABLE
t005 TABLE
t006 TABLE
t007 TABLE
t008 TABLE
t009 TABLE
t010 TABLE
t011 TABLE
t012 TABLE
t013 TABLE
t014 TABLE
t015 TABLE
t016 TABLE
t017 TABLE
t018 TABLE
t019 TABLE
t020 TABLE
t021 TABLE
t022 TABLE
t023 TABLE
t024 TABLE
t025 TABLE
t026 TABLE
t027 TABLE
t028 TABLE
t029 TABLE
t030 TABLE
t031 TABLE
t032 TABLE
t033 TABLE
t034 TABLE
t035 TABLE
t036 TABLE
t037 TABLE
t038 TABLE
t039 TABLE
t040 TABLE
t041 TABLE
t042 TABLE
t043 TABLE
t044 TABLE
t045 TABLE
t046 TABLE
t047 TABLE
t048 TABLE
t049 TABLE
t050 TABLE
t051 TABLE
t052 TABLE
t053 TABLE
t054 TABLE
t055 TABLE
t056 TABLE
t057 TABLE
t058 TABLE
t059 TABLE
t060 TABLE
t061 TABLE
t062 TABLE
t063 TABLE
t064 TABLE
t065 TABLE
t066 TABLE
t067 TABLE
t068 TABLE
t069 TABLE
t070 TABLE
t071 TABLE
t072 TABLE
t073 TABLE
t074 TABLE
t075 TABLE
t076 TABLE
t077 TABLE
t078 TABLE
t079 TABLE
t080 TABLE
t081 TABLE
t082 TABLE
t083 TABLE
t084 TABLE
t085 TABLE
t086 TABLE
t087 TABLE
t088 TABLE
t089 TABLE
t090 TABLE
t091 TABLE
t092 TABLE
t093 TABLE
t094 TABLE
t095 TABLE
t096 TABLE
t097 TABLE
t098 TABLE
t099 TABLE
t1 TABLE
t100 TABLE
t101 TABLE
t102 TABLE
t103 TABLE
t104 TABLE
t105 TABLE
t106 TABLE
t107 TABLE
t108 TABLE
t109 TABLE
t110 TABLE
t111 TABLE
t112 TABLE
t113 TABLE
t114 TABLE
t115 TABLE
t116 TABLE
t117 TABLE
t118 TABLE
t119 TABLE
t120 TABLE
t121 TABLE
t122 TABLE
t123 TABLE
t124 TABLE
t125 TABLE
t126 TABLE
t127 TABLE
t128 TABLE
t129 TABLE
t130 TABLE
t131 TABLE
t132 TABLE
t133 TABLE
t134 TABLE
t135 TABLE
t136 TABLE
t137 TABLE
t138 TABLE
t139 TABLE
t140 TABLE
t141 TABLE
t142 TABLE
t143 TABLE
t144 TABLE
t145 TABLE
t146 TABLE
t147 TABLE
t148 TABLE
t149 TABLE
t150 TABLE
t151 TABLE
t152 TABLE
t153 TABLE
t154 TABLE
t155 TABLE
t156 TABLE
t157 TABLE
t158 TABLE
t159 TABLE
t160 TABLE
t161 TABLE
t162 TABLE
t163 TABLE
t164 TABLE
t165 TABLE
t166 TABLE
t167 TABLE
t168 TABLE
t169 TABLE
t170 TABLE
t171 TABLE
t172 TABLE
t173 TABLE
t174 TABLE
t175 TABLE
t176 TABLE
t177 TABLE
t178 TABLE
t179 TABLE
t180 TABLE
t181 TABLE
t182 TABLE
t183 TABLE
t184 TABLE
t185 TABLE
t186 TABLE
t187 TABLE
t188 TABLE
t189 TABLE
t190 TABLE
t191 TABLE
t192 TABLE
t193 TABLE
t194 TABLE
t195 TABLE
t196 TABLE
t197 TABLE
t198 TABLE
t199 TABLE
t200 TABLE
t201 TABLE
t202 TABLE
t203 TABLE
t204 TABLE
t205 TABLE
t206 TABLE
t207 TABLE
t208 TABLE
t209 TABLE
t210 TABLE
t211 TABLE
t212 TABLE
t213 TABLE
t214 TABLE
t215 TABLE
t216 TABLE
t217 TABLE
t218 TABLE
t219 TABLE
t220 TABLE
t221 TABLE
t222 TABLE
t223 TABLE
t224 TABLE
t225 TABLE
t226 TABLE
t227 TABLE
t228 TABLE
t229 TABLE
t230 TABLE
t231 TABLE
t232 TABLE
t233 TABLE
t234 TABLE
t235 TABLE
t236 TABLE
t237 TABLE
t238 TABLE
t239 TABLE
t240 TABLE
t241 TABLE
t242 TABLE
t243 TABLE
t244 TABLE
t245 TABLE
t246 TABLE
t247 TABLE
t248 TABLE
t249 TABLE
t250 TABLE
t251 TABLE
t252 TABLE
t253 TABLE
t254 TABLE
t255 TABLE
t256 TABLE
t257 TABLE
t258 TABLE
t259 TABLE
t260 TABLE
t261 TABLE
t262 TABLE
t263 TABLE
t264 TABLE
t265 TABLE
t266 TABLE
t267 TABLE
t268 TABLE
t269 TABLE
t270 TABLE
t271 TABLE
t272 TABLE
t273 TABLE
t274 TABLE
t275 TABLE
t276 TABLE
t277 TABLE
t278 TABLE
t279 TABLE
t280 TABLE
t281 TABLE
t282 TABLE
t283 TABLE
t284 TABLE
t285 TABLE
t286 TABLE
t287 TABLE
t288 TABLE
t289 TABLE
t290 TABLE
t291 TABLE
t292 TABLE
t293 TABLE
t294 TABLE
t295 TABLE
t296 TABLE
t297 TABLE
t298 TABLE
t299 TABLE
t300 TABLE
t301 TABLE
t302 TABLE
t303 TABLE
t304 TABLE
t305 TABLE
t306 TABLE
t307 TABLE
t308 TABLE
t309 TABLE
t310 TABLE
t311 TABLE
t312 TABLE
t313 TABLE
t314 TABLE
t315 TABLE
t316 TABLE
t317 TABLE
t318 TABLE
t319 TABLE
t320 TABLE
t321 TABLE
t322 TABLE
t323 TABLE
t324 TABLE
t325 TABLE
t326 TABLE
t327 TABLE
t328 TABLE
t329 TABLE
t330 TABLE
t331 TABLE
t332 TABLE
t333 TABLE
t334 TABLE
t335 TABLE
t336 TABLE
t337 TABLE
t338 TABLE
t339 TABLE
t340 TABLE
t341 TABLE
t342 TABLE
t343 TABLE
t344 TABLE
t345 TABLE
t346 TABLE
t347 TABLE
t348 TABLE
t349 TABLE
t350 TABLE
t351 TABLE
t352 TABLE
t353 TABLE
t354 TABLE
t355 TABLE
t356 TABLE
t357 TABLE
t358 TABLE
t359 TABLE
t360 TABLE
t361 TABLE
t362 TABLE
t363 TABLE
t364 TABLE
t365 TABLE
t366 TABLE
t367 TABLE
t368 TABLE
t369 TABLE
t370 TABLE
t371 TABLE
t372 TABLE
t373 TABLE
t374 TABLE
t375 TABLE
t376 TABLE
t377 TABLE
t378 TABLE
t379 TABLE
t380 TABLE
t381 TABLE
t382 TABLE
t383 TABLE
t384 TABLE
t385 TABLE
t386 TABLE
t387 TABLE
t388 TABLE
t389 TABLE
t390 TABLE
t391 TABLE
t392 TABLE
t393 TABLE
t394 TABLE
t395 TABLE
t396 TABLE
t397 TABLE
t398 TABLE
t399 TABLE
DROP TABLE t1;
#
# Testing unsigned types
#
DROP TABLE IF EXISTS t1;
Warnings:
Note 1051 Unknown table 'test.t1'
CREATE TABLE t1 (
a TINYINT UNSIGNED NOT NULL,
b SMALLINT ZEROFILL NOT NULL,
c INT UNSIGNED NOT NULL,
d BIGINT UNSIGNED NOT NULL,
e CHAR(32) NOT NULL DEFAULT '???') ENGINE=CONNECT TABLE_TYPE=FIX;
Warnings:
Warning 1105 No file name. Table will use t1.fix
DESCRIBE t1;
Field Type Null Key Default Extra
a tinyint(3) unsigned NO NULL
b smallint(5) unsigned zerofill NO NULL
c int(10) unsigned NO NULL
d bigint(20) unsigned NO NULL
e char(32) NO ???
INSERT INTO t1(a,b,c,d) VALUES(255,65535,4294967295,18446744073709551615);
SELECT * FROM t1;
a b c d e
255 65535 4294967295 18446744073709551615 ???
UPDATE t1 SET e = d;
SELECT * FROM t1;
a b c d e
255 65535 4294967295 18446744073709551615 18446744073709551615
UPDATE t1 SET c = d;
Warnings:
Warning 1264 Out of range value for column 'c' at row 1
SELECT * FROM t1;
a b c d e
255 65535 4294967295 18446744073709551615 18446744073709551615
UPDATE t1 SET c = e;
Warnings:
Warning 1264 Out of range value for column 'c' at row 1
SELECT * FROM t1;
a b c d e
255 65535 4294967295 18446744073709551615 18446744073709551615
UPDATE t1 SET d = e;
SELECT * FROM t1;
a b c d e
255 65535 4294967295 18446744073709551615 18446744073709551615
DROP TABLE IF EXISTS t2;
Warnings:
Note 1051 Unknown table 'test.t2'
CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=PROXY TABNAME=t1;
DESCRIBE t2;
Field Type Null Key Default Extra
a tinyint(3) unsigned NO NULL
b smallint(5) unsigned zerofill NO NULL
c int(10) unsigned NO NULL
d bigint(20) unsigned NO NULL
e char(32) NO NULL
SELECT * FROM t2;
a b c d e
255 65535 4294967295 18446744073709551615 18446744073709551615
DROP TABLE t2;
DROP TABLE t1;
...@@ -413,7 +413,7 @@ DROP TABLE t1; ...@@ -413,7 +413,7 @@ DROP TABLE t1;
SET @a=LOAD_FILE('MYSQLD_DATADIR/test/t1.xml'); SET @a=LOAD_FILE('MYSQLD_DATADIR/test/t1.xml');
SELECT CAST(@a AS CHAR CHARACTER SET latin1); SELECT CAST(@a AS CHAR CHARACTER SET latin1);
CAST(@a AS CHAR CHARACTER SET latin1) <?xml version="1.0" encoding="iso-8859-1"?> CAST(@a AS CHAR CHARACTER SET latin1) <?xml version="1.0" encoding="iso-8859-1"?>
<!-- Created by CONNECT Version 1.01.0009 October 29, 2013 --> <!-- Created by CONNECT Version 1.01.0010 November 30, 2013 -->
<t1> <t1>
<line> <line>
<node>ÀÁÂÃ</node> <node>ÀÁÂÃ</node>
......
Warnings:
Warning 1105 No file name. Table will use t1.xml
SET NAMES utf8;
CREATE TABLE t1 (i INT UNIQUE NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='Rownode=N';
ERROR HY000: Table type XML is not indexable
CREATE TABLE t1 (i INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='Rownode=N';
DESCRIBE t1;
Field Type Null Key Default Extra
i int(11) NO NULL
ALTER TABLE t1 ADD UNIQUE(i);
ERROR HY000: Table type XML is not indexable
CREATE UNIQUE INDEX i ON t1(i);
ERROR HY000: Table type XML is not indexable
DESCRIBE t1;
Field Type Null Key Default Extra
i int(11) NO NULL
INSERT INTO t1 VALUES(2),(5),(7);
SELECT * FROM t1 WHERE i = 5;
i
5
ALTER TABLE t1 DROP INDEX i;
ERROR 42000: Can't DROP 'i'; check that column/key exists
DROP INDEX i ON t1;
ERROR 42000: Can't DROP 'i'; check that column/key exists
DROP TABLE t1;
--disable_query_log
--error 0,ER_UNKNOWN_ERROR
CREATE TABLE t1 (a VARCHAR(10))
ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2';
if (!`SELECT count(*) FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'
AND ENGINE='CONNECT'
AND CREATE_OPTIONS LIKE '%`table_type`=XML%'
AND CREATE_OPTIONS LIKE '%xmlsup=libxml2%'`)
{
DROP TABLE IF EXISTS t1;
Skip Need LIBXML2;
}
DROP TABLE t1;
--enable_query_log
--disable_query_log
--error 0,ER_UNKNOWN_ERROR
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Drivers;
if ($mysql_errno)
{
Skip No ODBC support;
}
DROP TABLE t1;
--enable_query_log
--disable_query_log
--error 0,ER_UNKNOWN_ERROR
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Sources;
if ($mysql_errno)
{
Skip No ODBC support;
}
if (!`SELECT count(*) FROM t1 WHERE Name='ConnectEnginePostgresql'`)
{
DROP TABLE t1;
Skip Need ODBC data source ConnectEnginePostgresql;
}
SHOW CREATE TABLE t1;
DROP TABLE t1;
--enable_query_log
...@@ -434,3 +434,23 @@ SELECT * FROM t2; ...@@ -434,3 +434,23 @@ SELECT * FROM t2;
--echo # End of mysqldump ------ --echo # End of mysqldump ------
DROP TABLE t2; DROP TABLE t2;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # Testing getting unsigned types
--echo #
CREATE TABLE t1 (
a TINYINT UNSIGNED NOT NULL,
b SMALLINT ZEROFILL NOT NULL,
c INT UNSIGNED NOT NULL,
d BIGINT UNSIGNED NOT NULL,
e CHAR(32) NOT NULL DEFAULT 'Hello') ENGINE=CONNECT TABLE_TYPE=FIX;
DESCRIBE t1;
INSERT INTO t1(a,b,c,d) VALUES(255,65535,4294967295,18446744073709551615);
SELECT * FROM t1;
CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME=t1;
DESCRIBE t2;
SELECT * FROM t2;
DROP TABLE t2;
DROP TABLE t1;
--source have_odbc.inc
SET NAMES utf8;
# MS ODBC and unixODBC return different error message text,
# so disable displaying error messages
--disable_result_log ONCE
--error ER_UNKNOWN_ERROR
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='Bad connection string';
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Sources;
SHOW CREATE TABLE t1;
DROP TABLE t1;
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Drivers;
SHOW CREATE TABLE t1;
DROP TABLE t1;
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Tables CONNECTION='Not important';
SHOW CREATE TABLE t1;
DROP TABLE t1;
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Columns CONNECTION='Not important';
SHOW CREATE TABLE t1;
DROP TABLE t1;
--
-- The SQL script to create PostgreSQL data for odbc_postgresql.test
--
-- Run this script as a admin user:
-- psql -U postgres < odbc_postgresql.sql
SET NAMES 'UTF8';
DROP DATABASE IF EXISTS mtr;
DROP USER IF EXISTS mtr;
CREATE USER mtr WITH PASSWORD 'mtr';
CREATE DATABASE mtr OWNER=mtr ENCODING='UTF8';
GRANT ALL ON DATABASE mtr TO mtr;
\c mtr
SET role mtr;
CREATE TABLE t1 (a INT NOT NULL);
INSERT INTO t1 VALUES (10),(20),(30);
CREATE VIEW v1 AS SELECT * FROM t1;
CREATE TABLE t2 (a INT NOT NULL);
INSERT INTO t2 VALUES (40),(50),(60);
CREATE SCHEMA schema1 AUTHORIZATION mtr;
CREATE TABLE schema1.t1 (a CHAR(10) NOT NULL);
INSERT INTO schema1.t1 VALUES ('aaa'),('bbb'),('ccc'),('яяя');
CREATE VIEW schema1.v1 AS SELECT * FROM schema1.t1;
CREATE TABLE schema1.t2 (a CHAR(10) NOT NULL);
INSERT INTO schema1.t2 VALUES ('xxx'),('yyy'),('zzz'),('ÄÖÜ');
--source have_odbc_postgresql.inc
#--source include/not_embedded.inc
#
# To configure your system to be able to run this test,
# follow through the following steps:
#
# 1. Install and configure PostgreSQL database to stat on the system startup
#
# 2. Create user, database, schema and tables to be used by mtr:
# psql -U postgres < odbc_postgresql.sql
#
# 3. Install PostgreSQL ODBC Driver.
# - On CentOS, Fedora:
# sudo yum install postgresql-odbc
# - On Ubuntu, Debian:
# sudo apt-get install odbc-postgresql
#
# 4. Create a data source with the name "ConnectEnginePostgresql"
# - On Windows: use odbcadm.exe
# - On Linux: put these lines into /etc/odbc.ini
#
#[ConnectEnginePostgresql]
#Description=PostgreSQL DSN for ConnectSE
#Driver=PostgreSQL
#Database=mtr
#Servername=localhost
#Port=5432
#
SET NAMES utf8;
--echo #
--echo # Checking CATFUNC=Tables
--echo #
--echo
--echo # All tables in all schemas
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables;
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
DROP TABLE t1;
--echo # All tables in all schemas
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='%.%.%';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
DROP TABLE t1;
--echo # All tables in all schemas
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='%.%';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
DROP TABLE t1;
--echo # All tables in the default schema ("public")
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='%';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
DROP TABLE t1;
--echo # All tables "t1" in all schemas
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='%.%.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
DROP TABLE t1;
--echo # All tables "t1" in all schemas
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='%.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
DROP TABLE t1;
--echo # Table "t1" in the default schema ("public")
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
DROP TABLE t1;
--echo # Table "t1" in the schema "public"
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='%.public.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
DROP TABLE t1;
--echo # Table "t1" in the schema "schema1"
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='%.schema1.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
DROP TABLE t1;
--echo # All tables "t1" in all schemas (Catalog name is ignored by PostgreSQL)
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Tables TABNAME='xxx.%.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
DROP TABLE t1;
--echo #
--echo # Checking CATFUNC=Columns
--echo #
--echo
#
# For some reasons SQLColumn (unlike SQLTables) include columns of system
# tables from the schemas like "information_schema", "pg_catalog", "pg_toast".
# So we add the "Table_Owner IN ('public','schema1')" clause into some queries.
#
--echo # All columns in the schemas "public" and "schema1"
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Columns;
SELECT * FROM t1 WHERE Table_Owner IN ('public','schema1') ORDER BY Table_Owner, Table_Name;
DROP TABLE t1;
--echo # All columns in the schemas "public" and "schema1"
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='%.%.%';
SELECT * FROM t1 WHERE Table_Owner IN ('public','schema1') ORDER BY Table_Owner, Table_Name;
DROP TABLE t1;
--echo # All tables "t1" in all schemas
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='%.%.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
DROP TABLE t1;
--echo # Table "t1" in the schema "public"
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='%.public.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
DROP TABLE t1;
--echo # Table "t1" in the schema "schema1"
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='%.schema1.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
DROP TABLE t1;
--echo # All tables "t1" in all schemas (Catalog name is ignored by PostgreSQL)
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='xxx.%.t1';
SELECT * FROM t1 ORDER BY Table_Owner, Table_Name;
DROP TABLE t1;
--echo #
--echo # Checking tables
--echo #
--echo
--echo # Table "t1" in the default schema ("public")
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr';
SHOW CREATE TABLE t1;
SELECT * FROM t1;
CREATE TABLE t2 AS SELECT * FROM t1;
SHOW CREATE TABLE t2;
SELECT * FROM t2;
DROP TABLE t2;
CREATE VIEW v1 AS SELECT * FROM t1;
SELECT * FROM v1;
DROP VIEW v1;
DROP TABLE t1;
--echo # Table "t1" in the schema "public"
CREATE TABLE t1 ENGINE=CONNECT TABNAME='public.t1' TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr';
SHOW CREATE TABLE t1;
SELECT * FROM t1;
DROP TABLE t1;
--echo # Table "t1" in the schema "schema1"
CREATE TABLE t1 ENGINE=CONNECT TABNAME='schema1.t1' CHARSET=utf8 DATA_CHARSET=utf8 TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr';
SHOW CREATE TABLE t1;
SELECT * FROM t1;
CREATE TABLE t2 AS SELECT * FROM t1;
SHOW CREATE TABLE t2;
SELECT * FROM t2;
DROP TABLE t2;
CREATE VIEW v1 AS SELECT * FROM t1;
SELECT * FROM v1;
DROP VIEW v1;
DROP TABLE t1;
--echo # View "v1" in the schema "schema1"
CREATE TABLE t1 ENGINE=CONNECT TABNAME='schema1.v1' CHARSET=utf8 DATA_CHARSET=utf8 TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr';
SHOW CREATE TABLE t1;
SELECT * FROM t1;
CREATE TABLE t2 AS SELECT * FROM t1;
SHOW CREATE TABLE t2;
SELECT * FROM t2;
DROP TABLE t2;
CREATE VIEW v1 AS SELECT * FROM t1;
SELECT * FROM v1;
DROP VIEW v1;
DROP TABLE t1;
--echo # Table "t2" in the schema "schema1"
CREATE TABLE t1 ENGINE=CONNECT TABNAME='schema1.t2' CHARSET=utf8 DATA_CHARSET=utf8 TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEnginePostgresql;UID=mtr;PWD=mtr';
SHOW CREATE TABLE t1;
SELECT * FROM t1;
CREATE TABLE t2 AS SELECT * FROM t1;
SHOW CREATE TABLE t2;
SELECT * FROM t2;
DROP TABLE t2;
CREATE VIEW v1 AS SELECT * FROM t1;
SELECT * FROM v1;
DROP VIEW v1;
DROP TABLE t1;
--source have_odbc_sqlite3.inc --source have_odbc_sqlite3.inc
# #
# To run this test, install SQLite3 ODBC Driver from # To run this test, install SQLite3 ODBC Driver from
# http://www.ch-werner.de/sqliteodbc/ # http://www.ch-werner.de/sqliteodbc/
# #
# Note, the test does not need a DSN to be created # Note, the test does not need a DSN to be created
# (only the driver is required) # (only the driver is required)
# #
# #
# On Windows: # On Windows:
# ----------- # -----------
# Download and run the installer file sqliteodbc.exe # Download and run the installer file sqliteodbc.exe
# Version sqliteodbc-0.991 is known to Work. # Version sqliteodbc-0.991 is known to Work.
# After running the installer the test should start working automatically. # After running the installer the test should start working automatically.
# #
# On Linux: # On Linux:
# -------- # --------
# 1. Download the source tarball, e.g.: sqliteodbc-0.993.tar.gz # 1. Download the source tarball, e.g.: sqliteodbc-0.993.tar.gz
# 2. Unpack the sources: # 2. Unpack the sources:
# tar -zxf sqliteodbc-0.993.tar.gz # tar -zxf sqliteodbc-0.993.tar.gz
# 3. Compile the source and install: # 3. Compile the source and install:
# cd sqliteodbc-0.993 # cd sqliteodbc-0.993
# ./configure --prefix=/opt/sqliteodbc # ./configure --prefix=/opt/sqliteodbc
# make # make
# sudo make install # sudo make install
# #
# (you can use a different --prefix, according to your preferences) # (you can use a different --prefix, according to your preferences)
# #
# 4. Add these lines into /etc/odbcinst.ini # 4. Add these lines into /etc/odbcinst.ini
# #
#[SQLite3 ODBC Driver] #[SQLite3 ODBC Driver]
#Description=SQLite3 ODBC Driver #Description=SQLite3 ODBC Driver
#Driver=/opt/sqliteodbc/libsqlite3odbc.so #Driver=/opt/sqliteodbc/libsqlite3odbc.so
#Setup=/opt/sqliteodbc/libsqlite3odbc.so #Setup=/opt/sqliteodbc/libsqlite3odbc.so
# #
# Adjust the directory "/opt/sqliteodbc/" according to --prefix # Adjust the directory "/opt/sqliteodbc/" according to --prefix
# that you chose on step #3. # that you chose on step #3.
# #
# #
SET NAMES utf8; SET NAMES utf8;
let $MYSQLD_DATADIR= `select @@datadir`; let $MYSQLD_DATADIR= `select @@datadir`;
# #
# For some reasons Windows does not allow to remove the data base # For some reasons Windows does not allow to remove the data base
# file after "DROP TABLE t1". So unlike in odbc_xls.test we won't copy # file after "DROP TABLE t1". So unlike in odbc_xls.test we won't copy
# the data file, we'll use directly the file in std_data. # the data file, we'll use directly the file in std_data.
# As we do not do any modifications in the database, this should be OK. # As we do not do any modifications in the database, this should be OK.
# #
let $Database=$MTR_SUITE_DIR/std_data/test.sqlite3; let $Database=$MTR_SUITE_DIR/std_data/test.sqlite3;
--replace_result $MTR_SUITE_DIR MTR_SUITE_DIR --replace_result $MTR_SUITE_DIR MTR_SUITE_DIR
--eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8; --eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8;
--replace_result $MTR_SUITE_DIR MTR_SUITE_DIR --replace_result $MTR_SUITE_DIR MTR_SUITE_DIR
SHOW CREATE TABLE t1; SHOW CREATE TABLE t1;
SELECT * FROM t1; SELECT * FROM t1;
CREATE TABLE t2 AS SELECT * FROM t1; CREATE TABLE t2 AS SELECT * FROM t1;
SHOW CREATE TABLE t2; SHOW CREATE TABLE t2;
SELECT * FROM t2; SELECT * FROM t2;
DROP TABLE t2; DROP TABLE t2;
CREATE VIEW v1 AS SELECT * FROM t1; CREATE VIEW v1 AS SELECT * FROM t1;
SELECT * FROM v1; SELECT * FROM v1;
DROP VIEW v1; DROP VIEW v1;
DROP TABLE t1; DROP TABLE t1;
--replace_result $MTR_SUITE_DIR MTR_SUITE_DIR --replace_result $MTR_SUITE_DIR MTR_SUITE_DIR
--eval CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Columns TABNAME='t1' TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8 --eval CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Columns TABNAME='t1' TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8
SELECT * FROM t1; SELECT * FROM t1;
DROP TABLE t1; DROP TABLE t1;
--replace_result $MTR_SUITE_DIR MTR_SUITE_DIR --replace_result $MTR_SUITE_DIR MTR_SUITE_DIR
--eval CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Tables TABNAME='t1' TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8 --eval CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Tables TABNAME='t1' TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8
SELECT * FROM t1; SELECT * FROM t1;
DROP TABLE t1; DROP TABLE t1;
--replace_result $MTR_SUITE_DIR MTR_SUITE_DIR
--eval CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Columns TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8
SELECT * FROM t1 ORDER BY Table_name;
DROP TABLE t1;
--replace_result $MTR_SUITE_DIR MTR_SUITE_DIR
--eval CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Tables TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8
SELECT * FROM t1 ORDER BY Table_name;
DROP TABLE t1;
--echo #
--echo # Testing unsigned types
--echo #
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
a TINYINT UNSIGNED NOT NULL,
b SMALLINT ZEROFILL NOT NULL,
c INT UNSIGNED NOT NULL,
d BIGINT UNSIGNED NOT NULL,
e CHAR(32) NOT NULL DEFAULT '???') ENGINE=CONNECT TABLE_TYPE=FIX;
DESCRIBE t1;
INSERT INTO t1(a,b,c,d) VALUES(255,65535,4294967295,18446744073709551615);
SELECT * FROM t1;
UPDATE t1 SET e = d;
SELECT * FROM t1;
UPDATE t1 SET c = d;
SELECT * FROM t1;
UPDATE t1 SET c = e;
SELECT * FROM t1;
UPDATE t1 SET d = e;
SELECT * FROM t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=PROXY TABNAME=t1;
DESCRIBE t2;
SELECT * FROM t2;
# Moved to mysql.test (cannot be executed if embedded)
#DROP TABLE t2;
#CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME=t1;
#DESCRIBE t2;
#SELECT * FROM t2;
DROP TABLE t2;
DROP TABLE t1;
--disable_query_log --source have_libxml2.inc
--error 0,ER_UNKNOWN_ERROR
CREATE TABLE t1 (a VARCHAR(10))
ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2';
if (!`SELECT count(*) FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'
AND ENGINE='CONNECT'
AND CREATE_OPTIONS LIKE '%`table_type`=XML%'
AND CREATE_OPTIONS LIKE '%xmlsup=libxml2%'`)
{
Skip Need LIBXML2;
}
DROP TABLE t1;
--enable_query_log
let $MYSQLD_DATADIR= `select @@datadir`; let $MYSQLD_DATADIR= `select @@datadir`;
......
-- source include/not_embedded.inc -- source include/not_embedded.inc
-- source have_libxml2.inc
--disable_query_log
--error 0,ER_UNKNOWN_ERROR
CREATE TABLE t1 (a VARCHAR(10))
ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2';
if (!`SELECT count(*) FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'
AND ENGINE='CONNECT'
AND CREATE_OPTIONS LIKE '%`table_type`=XML%'
AND CREATE_OPTIONS LIKE '%xmlsup=libxml2%'`)
{
Skip Need LIBXML2;
}
DROP TABLE t1;
--enable_query_log
let $MYSQLD_DATADIR= `select @@datadir`; let $MYSQLD_DATADIR= `select @@datadir`;
......
--source have_libxml2.inc
let $MYSQLD_DATADIR= `select @@datadir`;
SET NAMES utf8;
#
#--echo Testing indexing on not indexable table type
#
--error ER_UNKNOWN_ERROR
CREATE TABLE t1 (i INT UNIQUE NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='Rownode=N';
CREATE TABLE t1 (i INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='Rownode=N';
DESCRIBE t1;
# one could *add* an index to an existing table
--error ER_UNKNOWN_ERROR
ALTER TABLE t1 ADD UNIQUE(i);
--error ER_UNKNOWN_ERROR
CREATE UNIQUE INDEX i ON t1(i);
DESCRIBE t1;
INSERT INTO t1 VALUES(2),(5),(7);
SELECT * FROM t1 WHERE i = 5;
--error ER_CANT_DROP_FIELD_OR_KEY
ALTER TABLE t1 DROP INDEX i;
--error ER_CANT_DROP_FIELD_OR_KEY
DROP INDEX i ON t1;
DROP TABLE t1;
--remove_file $MYSQLD_DATADIR/test/xt1.xml
...@@ -84,7 +84,7 @@ int MYSQLtoPLG(char *typname, char *var) ...@@ -84,7 +84,7 @@ int MYSQLtoPLG(char *typname, char *var)
/************************************************************************/ /************************************************************************/
/* Convert from PlugDB type to MySQL type number */ /* Convert from PlugDB type to MySQL type number */
/************************************************************************/ /************************************************************************/
enum enum_field_types PLGtoMYSQL(int type, bool dbf) enum enum_field_types PLGtoMYSQL(int type, bool dbf, char v)
{ {
enum enum_field_types mytype; enum enum_field_types mytype;
...@@ -99,10 +99,14 @@ enum enum_field_types PLGtoMYSQL(int type, bool dbf) ...@@ -99,10 +99,14 @@ enum enum_field_types PLGtoMYSQL(int type, bool dbf)
mytype = MYSQL_TYPE_DOUBLE; mytype = MYSQL_TYPE_DOUBLE;
break; break;
case TYPE_DATE: case TYPE_DATE:
mytype = (dbf) ? MYSQL_TYPE_DATE : MYSQL_TYPE_DATETIME; mytype = (dbf) ? MYSQL_TYPE_DATE :
(v == 'S') ? MYSQL_TYPE_TIMESTAMP :
(v == 'D') ? MYSQL_TYPE_NEWDATE :
(v == 'T') ? MYSQL_TYPE_TIME :
(v == 'Y') ? MYSQL_TYPE_YEAR : MYSQL_TYPE_DATETIME;
break; break;
case TYPE_STRING: case TYPE_STRING:
mytype = MYSQL_TYPE_VARCHAR; mytype = (v) ? MYSQL_TYPE_VARCHAR : MYSQL_TYPE_STRING;
break; break;
case TYPE_BIGINT: case TYPE_BIGINT:
mytype = MYSQL_TYPE_LONGLONG; mytype = MYSQL_TYPE_LONGLONG;
...@@ -138,12 +142,12 @@ const char *PLGtoMYSQLtype(int type, bool dbf, char v) ...@@ -138,12 +142,12 @@ const char *PLGtoMYSQLtype(int type, bool dbf, char v)
} // endswitch mytype } // endswitch mytype
return "CHAR(0)"; return "CHAR(0)";
} // end of PLGtoMYSQL } // end of PLGtoMYSQLtype
/************************************************************************/ /************************************************************************/
/* Convert from MySQL type to PlugDB type number */ /* Convert from MySQL type to PlugDB type number */
/************************************************************************/ /************************************************************************/
int MYSQLtoPLG(int mytype) int MYSQLtoPLG(int mytype, char *var)
{ {
int type; int type;
...@@ -177,7 +181,6 @@ int MYSQLtoPLG(int mytype) ...@@ -177,7 +181,6 @@ int MYSQLtoPLG(int mytype)
case MYSQL_TYPE_TIME: case MYSQL_TYPE_TIME:
type = TYPE_DATE; type = TYPE_DATE;
break; break;
case MYSQL_TYPE_STRING:
case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_VAR_STRING:
#if !defined(ALPHA) #if !defined(ALPHA)
case MYSQL_TYPE_VARCHAR: case MYSQL_TYPE_VARCHAR:
...@@ -186,6 +189,8 @@ int MYSQLtoPLG(int mytype) ...@@ -186,6 +189,8 @@ int MYSQLtoPLG(int mytype)
case MYSQL_TYPE_TINY_BLOB: case MYSQL_TYPE_TINY_BLOB:
case MYSQL_TYPE_MEDIUM_BLOB: case MYSQL_TYPE_MEDIUM_BLOB:
case MYSQL_TYPE_LONG_BLOB: case MYSQL_TYPE_LONG_BLOB:
if (var) *var = 'V';
case MYSQL_TYPE_STRING:
type = TYPE_STRING; type = TYPE_STRING;
break; break;
default: default:
......
...@@ -4,10 +4,10 @@ ...@@ -4,10 +4,10 @@
#ifndef __MYUTIL__H #ifndef __MYUTIL__H
#define __MYUTIL__H #define __MYUTIL__H
enum enum_field_types PLGtoMYSQL(int type, bool dbf); enum enum_field_types PLGtoMYSQL(int type, bool dbf, char var = 0);
const char *PLGtoMYSQLtype(int type, bool dbf, char var = NULL); const char *PLGtoMYSQLtype(int type, bool dbf, char var = 0);
int MYSQLtoPLG(char *typname, char *var = NULL); int MYSQLtoPLG(char *typname, char *var = NULL);
int MYSQLtoPLG(int mytype); int MYSQLtoPLG(int mytype, char *var = NULL);
char *MyDateFmt(int mytype); char *MyDateFmt(int mytype);
char *MyDateFmt(char *typname); char *MyDateFmt(char *typname);
......
...@@ -121,7 +121,7 @@ int TranslateSQLType(int stp, int prec, int& len, char& v) ...@@ -121,7 +121,7 @@ int TranslateSQLType(int stp, int prec, int& len, char& v)
case SQL_LONGVARCHAR: // (-1) case SQL_LONGVARCHAR: // (-1)
v = 'V'; v = 'V';
type = TYPE_STRING; type = TYPE_STRING;
len = min(abs(len), 255); len = min(abs(len), 256);
break; break;
case SQL_NUMERIC: // 2 case SQL_NUMERIC: // 2
case SQL_DECIMAL: // 3 case SQL_DECIMAL: // 3
...@@ -226,10 +226,10 @@ static CATPARM *AllocCatInfo(PGLOBAL g, CATINFO fid, char *tab, PQRYRES qrp) ...@@ -226,10 +226,10 @@ static CATPARM *AllocCatInfo(PGLOBAL g, CATINFO fid, char *tab, PQRYRES qrp)
cap->Id = fid; cap->Id = fid;
cap->Qrp = qrp; cap->Qrp = qrp;
cap->Tab = (PUCHAR)tab; cap->Tab = (PUCHAR)tab;
cap->Vlen = (SQLLEN* *)PlugSubAlloc(g, NULL, n * sizeof(SDWORD *)); cap->Vlen = (SQLLEN* *)PlugSubAlloc(g, NULL, n * sizeof(SQLLEN *));
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
cap->Vlen[i] = (SQLLEN *)PlugSubAlloc(g, NULL, m * sizeof(SDWORD)); cap->Vlen[i] = (SQLLEN *)PlugSubAlloc(g, NULL, m * sizeof(SQLLEN));
cap->Status = (UWORD *)PlugSubAlloc(g, NULL, m * sizeof(UWORD)); cap->Status = (UWORD *)PlugSubAlloc(g, NULL, m * sizeof(UWORD));
return cap; return cap;
...@@ -540,7 +540,7 @@ PQRYRES ODBCTables(PGLOBAL g, char *dsn, char *tabpat, bool info) ...@@ -540,7 +540,7 @@ PQRYRES ODBCTables(PGLOBAL g, char *dsn, char *tabpat, bool info)
FLD_TYPE, FLD_REM}; FLD_TYPE, FLD_REM};
static unsigned int length[] = {0, 0, 0, 16, 128}; static unsigned int length[] = {0, 0, 0, 16, 128};
int n, ncol = 5; int n, ncol = 5;
int maxres; int maxres;
PQRYRES qrp; PQRYRES qrp;
CATPARM *cap; CATPARM *cap;
ODBConn *ocp = NULL; ODBConn *ocp = NULL;
...@@ -557,7 +557,7 @@ PQRYRES ODBCTables(PGLOBAL g, char *dsn, char *tabpat, bool info) ...@@ -557,7 +557,7 @@ PQRYRES ODBCTables(PGLOBAL g, char *dsn, char *tabpat, bool info)
if (ocp->Open(dsn, 2) < 1) // 2 is openReadOnly if (ocp->Open(dsn, 2) < 1) // 2 is openReadOnly
return NULL; return NULL;
maxres = 512; // This is completely arbitrary maxres = 16384; // This is completely arbitrary
n = ocp->GetMaxValue(SQL_MAX_QUALIFIER_NAME_LEN); n = ocp->GetMaxValue(SQL_MAX_QUALIFIER_NAME_LEN);
length[0] = (n) ? (n + 1) : 128; length[0] = (n) ? (n + 1) : 128;
n = ocp->GetMaxValue(SQL_MAX_USER_NAME_LEN); n = ocp->GetMaxValue(SQL_MAX_USER_NAME_LEN);
...@@ -1123,10 +1123,10 @@ bool ODBConn::Connect(DWORD Options) ...@@ -1123,10 +1123,10 @@ bool ODBConn::Connect(DWORD Options)
PGLOBAL& g = m_G; PGLOBAL& g = m_G;
PDBUSER dup = PlgGetUser(g); PDBUSER dup = PlgGetUser(g);
if (Options & noOdbcDialog || dup->Remote) //if (Options & noOdbcDialog || dup->Remote)
wConnectOption = SQL_DRIVER_NOPROMPT; wConnectOption = SQL_DRIVER_NOPROMPT;
else if (Options & forceOdbcDialog) //else if (Options & forceOdbcDialog)
wConnectOption = SQL_DRIVER_PROMPT; // wConnectOption = SQL_DRIVER_PROMPT;
rc = SQLDriverConnect(m_hdbc, hWnd, (PUCHAR)m_Connect, rc = SQLDriverConnect(m_hdbc, hWnd, (PUCHAR)m_Connect,
SQL_NTS, ConnOut, MAX_CONNECT_LEN, SQL_NTS, ConnOut, MAX_CONNECT_LEN,
...@@ -1986,6 +1986,87 @@ bool ODBConn::GetDrivers(PQRYRES qrp) ...@@ -1986,6 +1986,87 @@ bool ODBConn::GetDrivers(PQRYRES qrp)
return rv; return rv;
} // end of GetDrivers } // end of GetDrivers
/**
A helper class to split an optionally qualified table name into components.
These formats are understood:
"CatalogName.SchemaName.TableName"
"SchemaName.TableName"
"TableName"
*/
class SQLQualifiedName
{
static const uint max_parts= 3; /* Catalog.Schema.Table */
MYSQL_LEX_STRING m_part[max_parts];
char m_buf[512];
void lex_string_set(MYSQL_LEX_STRING *S, char *str, size_t length)
{
S->str= str;
S->length= length;
}
void lex_string_shorten_down(MYSQL_LEX_STRING *S, size_t offs)
{
DBUG_ASSERT(offs <= S->length);
S->str+= offs;
S->length-= offs;
}
/*
Find the rightmost '.' delimiter and return the length
of the qualifier, including the rightmost '.' delimier.
For example, for the string {"a.b.c",5} it will return 4,
which is the length of the qualifier "a.b."
*/
size_t lex_string_find_qualifier(MYSQL_LEX_STRING *S)
{
size_t i;
for (i= S->length; i > 0; i--)
{
if (S->str[i - 1] == '.')
{
S->str[i - 1]= '\0';
return i;
}
}
return 0;
}
public:
/*
Initialize to the given optionally qualified name.
NULL pointer in "name" is supported.
*/
SQLQualifiedName(const char *name)
{
size_t len, i= 0;
if (!name)
goto ret;
/* Initialize the first (rightmost) part */
lex_string_set(&m_part[0], m_buf,
strmake(m_buf, name, sizeof(m_buf) - 1) - m_buf);
/* Initialize the other parts, if exist. */
for (i= 1; i < max_parts; i++)
{
if (!(len= lex_string_find_qualifier(&m_part[i - 1])))
break;
lex_string_set(&m_part[i], m_part[i - 1].str, len - 1);
lex_string_shorten_down(&m_part[i - 1], len);
}
ret:
/* Initialize the remaining parts */
for ( ; i < max_parts; i++)
lex_string_set(&m_part[i], NULL, 0);
}
SQLCHAR *ptr(uint i)
{
DBUG_ASSERT(i < max_parts);
return (SQLCHAR *) (m_part[i].length ? m_part[i].str : NULL);
}
size_t length(uint i)
{
DBUG_ASSERT(i < max_parts);
return m_part[i].length;
}
};
/***********************************************************************/ /***********************************************************************/
/* Allocate recset and call SQLTables, SQLColumns or SQLPrimaryKeys. */ /* Allocate recset and call SQLTables, SQLColumns or SQLPrimaryKeys. */
/***********************************************************************/ /***********************************************************************/
...@@ -2048,29 +2129,38 @@ int ODBConn::GetCatInfo(CATPARM *cap) ...@@ -2048,29 +2129,38 @@ int ODBConn::GetCatInfo(CATPARM *cap)
} else } else
ThrowDBX("0-sized result"); ThrowDBX("0-sized result");
SQLQualifiedName name((const char *) cap->Tab);
// Now do call the proper ODBC API // Now do call the proper ODBC API
switch (cap->Id) { switch (cap->Id) {
case CAT_TAB: case CAT_TAB:
// rc = SQLSetStmtAttr(hstmt, SQL_ATTR_METADATA_ID, // rc = SQLSetStmtAttr(hstmt, SQL_ATTR_METADATA_ID,
// (SQLPOINTER)false, 0); // (SQLPOINTER)false, 0);
fnc = "SQLTables"; fnc = "SQLTables";
rc = SQLTables(hstmt, NULL, 0, NULL, 0, cap->Tab, SQL_NTS, rc = SQLTables(hstmt, name.ptr(2), name.length(2),
cap->Pat, SQL_NTS); name.ptr(1), name.length(1),
name.ptr(0), name.length(0),
cap->Pat, SQL_NTS);
break; break;
case CAT_COL: case CAT_COL:
// rc = SQLSetStmtAttr(hstmt, SQL_ATTR_METADATA_ID, // rc = SQLSetStmtAttr(hstmt, SQL_ATTR_METADATA_ID,
// (SQLPOINTER)true, 0); // (SQLPOINTER)true, 0);
fnc = "SQLColumns"; fnc = "SQLColumns";
rc = SQLColumns(hstmt, NULL, 0, NULL, 0, cap->Tab, SQL_NTS, rc = SQLColumns(hstmt, name.ptr(2), name.length(2),
cap->Pat, SQL_NTS); name.ptr(1), name.length(1),
name.ptr(0), name.length(0),
cap->Pat, SQL_NTS);
break; break;
case CAT_KEY: case CAT_KEY:
fnc = "SQLPrimaryKeys"; fnc = "SQLPrimaryKeys";
rc = SQLPrimaryKeys(hstmt, NULL, 0, NULL, 0, cap->Tab, SQL_NTS); rc = SQLPrimaryKeys(hstmt, name.ptr(2), name.length(2),
name.ptr(1), name.length(1),
name.ptr(0), name.length(0));
break; break;
case CAT_STAT: case CAT_STAT:
fnc = "SQLStatistics"; fnc = "SQLStatistics";
rc = SQLStatistics(hstmt, NULL, 0, NULL, 0, cap->Tab, SQL_NTS, rc = SQLStatistics(hstmt, name.ptr(2), name.length(2),
name.ptr(1), name.length(1),
name.ptr(0), name.length(0),
cap->Unique, cap->Accuracy); cap->Unique, cap->Accuracy);
break; break;
case CAT_SPC: case CAT_SPC:
...@@ -2088,7 +2178,7 @@ int ODBConn::GetCatInfo(CATPARM *cap) ...@@ -2088,7 +2178,7 @@ int ODBConn::GetCatInfo(CATPARM *cap)
if (m_RowsetSize == 1 && cap->Qrp->Maxres > 1) { if (m_RowsetSize == 1 && cap->Qrp->Maxres > 1) {
pval = (PVAL *)PlugSubAlloc(m_G, NULL, n * sizeof(PVAL)); pval = (PVAL *)PlugSubAlloc(m_G, NULL, n * sizeof(PVAL));
vlen = (SQLLEN *)PlugSubAlloc(m_G, NULL, n * sizeof(SDWORD *)); vlen = (SQLLEN *)PlugSubAlloc(m_G, NULL, n * sizeof(SQLLEN *));
} // endif } // endif
// Now bind the column buffers // Now bind the column buffers
......
...@@ -330,7 +330,9 @@ enum COLUSE {U_P = 0x01, /* the projection list. */ ...@@ -330,7 +330,9 @@ enum COLUSE {U_P = 0x01, /* the projection list. */
U_VIRTUAL = 0x20, /* a VIRTUAL column */ U_VIRTUAL = 0x20, /* a VIRTUAL column */
U_NULLS = 0x40, /* The column may have nulls */ U_NULLS = 0x40, /* The column may have nulls */
U_IS_NULL = 0x80, /* The column has a null value */ U_IS_NULL = 0x80, /* The column has a null value */
U_SPECIAL = 0x100}; /* The column is special */ U_SPECIAL = 0x100, /* The column is special */
U_UNSIGNED = 0x200, /* The column type is unsigned */
U_ZEROFILL = 0x400}; /* The column is zero filled */
/***********************************************************************/ /***********************************************************************/
/* DB description class and block pointer definitions. */ /* DB description class and block pointer definitions. */
......
...@@ -278,6 +278,18 @@ PQRYRES PlgAllocResult(PGLOBAL g, int ncol, int maxres, int ids, ...@@ -278,6 +278,18 @@ PQRYRES PlgAllocResult(PGLOBAL g, int ncol, int maxres, int ids,
PCOLRES *pcrp, crp; PCOLRES *pcrp, crp;
PQRYRES qrp; PQRYRES qrp;
// Save stack and allocation environment and prepare error return
if (g->jump_level == MAX_JUMP) {
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
return NULL;
} // endif jump_level
if (setjmp(g->jumper[++g->jump_level]) != 0) {
printf("%s\n", g->Message);
qrp = NULL;
goto fin;
} // endif rc
/************************************************************************/ /************************************************************************/
/* Allocate the structure used to contain the result set. */ /* Allocate the structure used to contain the result set. */
/************************************************************************/ /************************************************************************/
...@@ -342,6 +354,8 @@ PQRYRES PlgAllocResult(PGLOBAL g, int ncol, int maxres, int ids, ...@@ -342,6 +354,8 @@ PQRYRES PlgAllocResult(PGLOBAL g, int ncol, int maxres, int ids,
*pcrp = NULL; *pcrp = NULL;
fin:
g->jump_level--;
return qrp; return qrp;
} // end of PlgAllocResult } // end of PlgAllocResult
......
...@@ -1087,7 +1087,12 @@ void DOSCOL::ReadColumn(PGLOBAL g) ...@@ -1087,7 +1087,12 @@ void DOSCOL::ReadColumn(PGLOBAL g)
case TYPE_SHORT: case TYPE_SHORT:
case TYPE_TINY: case TYPE_TINY:
case TYPE_BIGINT: case TYPE_BIGINT:
Value->SetValue_char(p, field - Dcm); if (Value->SetValue_char(p, field - Dcm)) {
sprintf(g->Message, "Out of range value for column %s at row %d",
Name, tdbp->RowNumber(g));
PushWarning(g, tdbp);
} // endif SetValue_char
break; break;
case TYPE_FLOAT: case TYPE_FLOAT:
Value->SetValue_char(p, field); Value->SetValue_char(p, field);
...@@ -1104,7 +1109,11 @@ void DOSCOL::ReadColumn(PGLOBAL g) ...@@ -1104,7 +1109,11 @@ void DOSCOL::ReadColumn(PGLOBAL g)
} // endswitch Buf_Type } // endswitch Buf_Type
else else
Value->SetValue_char(p, field); if (Value->SetValue_char(p, field)) {
sprintf(g->Message, "Out of range value for column %s at row %d",
Name, tdbp->RowNumber(g));
PushWarning(g, tdbp);
} // endif SetValue_char
break; break;
default: default:
......
...@@ -375,7 +375,12 @@ void BINCOL::ReadColumn(PGLOBAL g) ...@@ -375,7 +375,12 @@ void BINCOL::ReadColumn(PGLOBAL g)
Value->SetValue(*(double*)p); Value->SetValue(*(double*)p);
break; break;
case 'C': // Text case 'C': // Text
Value->SetValue_char(p, Long); if (Value->SetValue_char(p, Long)) {
sprintf(g->Message, "Out of range value for column %s at row %d",
Name, tdbp->RowNumber(g));
PushWarning(g, tdbp);
} // endif SetValue_char
break; break;
default: default:
sprintf(g->Message, MSG(BAD_BIN_FMT), Fmt, Name); sprintf(g->Message, MSG(BAD_BIN_FMT), Fmt, Name);
......
...@@ -556,6 +556,15 @@ bool TDBCAT::InitCol(PGLOBAL g) ...@@ -556,6 +556,15 @@ bool TDBCAT::InitCol(PGLOBAL g)
return false; return false;
} // end of InitCol } // end of InitCol
/***********************************************************************/
/* SetRecpos: Replace the table at the specified position. */
/***********************************************************************/
bool TDBCAT::SetRecpos(PGLOBAL g, int recpos)
{
N = recpos - 1;
return false;
} // end of SetRecpos
/***********************************************************************/ /***********************************************************************/
/* Data Base read routine for CAT access method. */ /* Data Base read routine for CAT access method. */
/***********************************************************************/ /***********************************************************************/
......
...@@ -1284,13 +1284,18 @@ void MYSQLCOL::ReadColumn(PGLOBAL g) ...@@ -1284,13 +1284,18 @@ void MYSQLCOL::ReadColumn(PGLOBAL g)
htrc("MySQL ReadColumn: name=%s buf=%s\n", Name, buf); htrc("MySQL ReadColumn: name=%s buf=%s\n", Name, buf);
// TODO: have a true way to differenciate temporal values // TODO: have a true way to differenciate temporal values
if (strlen(buf) == 8) if (Buf_Type == TYPE_DATE && strlen(buf) == 8)
// This is a TIME value // This is a TIME value
p = strcat(strcpy(tim, "1970-01-01 "), buf); p = strcat(strcpy(tim, "1970-01-01 "), buf);
else else
p = buf; p = buf;
Value->SetValue_char(p, strlen(p)); if (Value->SetValue_char(p, strlen(p))) {
sprintf(g->Message, "Out of range value for column %s at row %d",
Name, tdbp->RowNumber(g));
PushWarning(g, tdbp);
} // endif SetValue_char
} else { } else {
if (Nullable) if (Nullable)
Value->SetNull(true); Value->SetNull(true);
......
...@@ -1083,7 +1083,7 @@ void ODBCCOL::AllocateBuffers(PGLOBAL g, int rows) ...@@ -1083,7 +1083,7 @@ void ODBCCOL::AllocateBuffers(PGLOBAL g, int rows)
} // endelse } // endelse
if (rows > 1) if (rows > 1)
StrLen = (SQLLEN *)PlugSubAlloc(g, NULL, rows * sizeof(int)); StrLen = (SQLLEN *)PlugSubAlloc(g, NULL, rows * sizeof(SQLLEN));
} // end of AllocateBuffers } // end of AllocateBuffers
......
...@@ -117,7 +117,7 @@ TABLE_SHARE *GetTableShare(PGLOBAL g, THD *thd, const char *db, ...@@ -117,7 +117,7 @@ TABLE_SHARE *GetTableShare(PGLOBAL g, THD *thd, const char *db,
/************************************************************************/ /************************************************************************/
/* TabColumns: constructs the result blocks containing all the columns */ /* TabColumns: constructs the result blocks containing all the columns */
/* of the object table that will be retrieved by GetData commands. */ /* description of the object table that will be retrieved by discovery.*/
/************************************************************************/ /************************************************************************/
PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db, PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
const char *name, bool& info) const char *name, bool& info)
...@@ -128,8 +128,8 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db, ...@@ -128,8 +128,8 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
static XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC, static XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC,
FLD_LENGTH, FLD_SCALE, FLD_RADIX, FLD_NULL, FLD_LENGTH, FLD_SCALE, FLD_RADIX, FLD_NULL,
FLD_REM, FLD_NO, FLD_CHARSET}; FLD_REM, FLD_NO, FLD_CHARSET};
static unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 256, 32, 32}; static unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 0, 32, 32};
char *fld, *fmt; char *fld, *fmt, v;
int i, n, ncol = sizeof(buftyp) / sizeof(int); int i, n, ncol = sizeof(buftyp) / sizeof(int);
int len, type, prec; int len, type, prec;
bool mysql; bool mysql;
...@@ -164,6 +164,7 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db, ...@@ -164,6 +164,7 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
// Some columns must be renamed // Some columns must be renamed
for (i = 0, crp = qrp->Colresp; crp; crp = crp->Next) for (i = 0, crp = qrp->Colresp; crp; crp = crp->Next)
switch (++i) { switch (++i) {
case 2: crp->Nulls = (char*)PlugSubAlloc(g, NULL, n); break;
case 10: crp->Name = "Date_fmt"; break; case 10: crp->Name = "Date_fmt"; break;
case 11: crp->Name = "Collation"; break; case 11: crp->Name = "Collation"; break;
} // endswitch i } // endswitch i
...@@ -181,8 +182,9 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db, ...@@ -181,8 +182,9 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
crp = qrp->Colresp; // Column_Name crp = qrp->Colresp; // Column_Name
fld = (char *)fp->field_name; fld = (char *)fp->field_name;
crp->Kdata->SetValue(fld, i); crp->Kdata->SetValue(fld, i);
v = 0;
if ((type = MYSQLtoPLG(fp->type())) == TYPE_ERROR) { if ((type = MYSQLtoPLG(fp->type(), &v)) == TYPE_ERROR) {
sprintf(g->Message, "Unsupported column type %s", GetTypeName(type)); sprintf(g->Message, "Unsupported column type %s", GetTypeName(type));
qrp = NULL; qrp = NULL;
break; break;
...@@ -190,6 +192,14 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db, ...@@ -190,6 +192,14 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
crp = crp->Next; // Data_Type crp = crp->Next; // Data_Type
crp->Kdata->SetValue(type, i); crp->Kdata->SetValue(type, i);
if (fp->flags & ZEROFILL_FLAG)
crp->Nulls[i] = 'Z';
else if (fp->flags & UNSIGNED_FLAG)
crp->Nulls[i] = 'U';
else
crp->Nulls[i] = v;
crp = crp->Next; // Type_Name crp = crp->Next; // Type_Name
crp->Kdata->SetValue(GetTypeName(type), i); crp->Kdata->SetValue(GetTypeName(type), i);
...@@ -212,10 +222,10 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db, ...@@ -212,10 +222,10 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
crp->Kdata->SetValue(len, i); crp->Kdata->SetValue(len, i);
crp = crp->Next; // Length crp = crp->Next; // Length
len = fp->field_length; prec = (type == TYPE_FLOAT) ? fp->decimals() : 0;
len = (prec == 31) ? 0 : fp->field_length;
crp->Kdata->SetValue(len, i); crp->Kdata->SetValue(len, i);
prec = (type == TYPE_FLOAT) ? fp->decimals() : 0;
crp = crp->Next; // Scale crp = crp->Next; // Scale
crp->Kdata->SetValue(prec, i); crp->Kdata->SetValue(prec, i);
...@@ -233,7 +243,7 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db, ...@@ -233,7 +243,7 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
else else
crp->Kdata->Reset(i); crp->Kdata->Reset(i);
crp = crp->Next; // New crp = crp->Next; // New (date format)
crp->Kdata->SetValue((fmt) ? fmt : (char*) "", i); crp->Kdata->SetValue((fmt) ? fmt : (char*) "", i);
crp = crp->Next; // New (charset) crp = crp->Next; // New (charset)
......
...@@ -95,7 +95,8 @@ bool user_connect::user_init() ...@@ -95,7 +95,8 @@ bool user_connect::user_init()
PDBUSER dup= NULL; PDBUSER dup= NULL;
// Areasize= 64M because of VEC tables. Should be parameterisable // Areasize= 64M because of VEC tables. Should be parameterisable
g= PlugInit(NULL, 67108864); //g= PlugInit(NULL, 67108864);
g= PlugInit(NULL, 134217728); // 128M because of embedded tests (???)
// Check whether the initialization is complete // Check whether the initialization is complete
if (!g || !g->Sarea || PlugSubSet(g, g->Sarea, g->Sarea_Size) if (!g || !g->Sarea || PlugSubSet(g, g->Sarea, g->Sarea_Size)
......
...@@ -191,7 +191,7 @@ void VALBLK::ChkIndx(int n) ...@@ -191,7 +191,7 @@ void VALBLK::ChkIndx(int n)
void VALBLK::ChkTyp(PVAL v) void VALBLK::ChkTyp(PVAL v)
{ {
if (Check && Type != v->GetType()) { if (Check && (Type != v->GetType() || Unsigned != v->IsUnsigned())) {
PGLOBAL& g = Global; PGLOBAL& g = Global;
strcpy(g->Message, MSG(VALTYPE_NOMATCH)); strcpy(g->Message, MSG(VALTYPE_NOMATCH));
longjmp(g->jumper[g->jump_level], Type); longjmp(g->jumper[g->jump_level], Type);
...@@ -201,7 +201,7 @@ void VALBLK::ChkTyp(PVAL v) ...@@ -201,7 +201,7 @@ void VALBLK::ChkTyp(PVAL v)
void VALBLK::ChkTyp(PVBLK vb) void VALBLK::ChkTyp(PVBLK vb)
{ {
if (Check && Type != vb->GetType()) { if (Check && (Type != vb->GetType() || Unsigned != vb->IsUnsigned())) {
PGLOBAL& g = Global; PGLOBAL& g = Global;
strcpy(g->Message, MSG(VALTYPE_NOMATCH)); strcpy(g->Message, MSG(VALTYPE_NOMATCH));
longjmp(g->jumper[g->jump_level], Type); longjmp(g->jumper[g->jump_level], Type);
...@@ -304,28 +304,44 @@ void TYPBLK<TYPE>::SetValue(PSZ p, int n) ...@@ -304,28 +304,44 @@ void TYPBLK<TYPE>::SetValue(PSZ p, int n)
longjmp(g->jumper[g->jump_level], Type); longjmp(g->jumper[g->jump_level], Type);
} // endif Check } // endif Check
Typp[n] = GetTypedValue(p); bool minus;
ulonglong maxval = MaxVal();
ulonglong val = CharToNumber(p, strlen(p), maxval, Unsigned, &minus);
if (minus && val < maxval)
Typp[n] = (TYPE)(-(signed)val);
else
Typp[n] = (TYPE)val;
SetNull(n, false); SetNull(n, false);
} // end of SetValue } // end of SetValue
template <class TYPE>
ulonglong TYPBLK<TYPE>::MaxVal(void) {DBUG_ASSERT(false); return 0;}
template <> template <>
int TYPBLK<int>::GetTypedValue(PSZ p) {return atol(p);} ulonglong TYPBLK<short>::MaxVal(void) {return INT_MAX16;}
template <>
uint TYPBLK<uint>::GetTypedValue(PSZ p) {return (unsigned)atol(p);}
template <> template <>
short TYPBLK<short>::GetTypedValue(PSZ p) {return (short)atoi(p);} ulonglong TYPBLK<ushort>::MaxVal(void) {return UINT_MAX16;}
template <> template <>
ushort TYPBLK<ushort>::GetTypedValue(PSZ p) {return (ushort)atoi(p);} ulonglong TYPBLK<int>::MaxVal(void) {return INT_MAX32;}
template <> template <>
longlong TYPBLK<longlong>::GetTypedValue(PSZ p) {return atoll(p);} ulonglong TYPBLK<uint>::MaxVal(void) {return UINT_MAX32;}
template <> template <>
ulonglong TYPBLK<ulonglong>::GetTypedValue(PSZ p) {return (unsigned)atoll(p);} ulonglong TYPBLK<char>::MaxVal(void) {return INT_MAX8;}
template <> template <>
double TYPBLK<double>::GetTypedValue(PSZ p) {return atof(p);} ulonglong TYPBLK<uchar>::MaxVal(void) {return UINT_MAX8;}
template <> template <>
char TYPBLK<char>::GetTypedValue(PSZ p) {return (char)atoi(p);} ulonglong TYPBLK<longlong>::MaxVal(void) {return INT_MAX64;}
template <> template <>
uchar TYPBLK<uchar>::GetTypedValue(PSZ p) {return (uchar)atoi(p);} ulonglong TYPBLK<ulonglong>::MaxVal(void) {return ULONGLONG_MAX;}
/***********************************************************************/ /***********************************************************************/
/* Set one value in a block from an array of characters. */ /* Set one value in a block from an array of characters. */
...@@ -557,12 +573,36 @@ char *CHRBLK::GetCharValue(int n) ...@@ -557,12 +573,36 @@ char *CHRBLK::GetCharValue(int n)
return (char *)GetValPtrEx(n); return (char *)GetValPtrEx(n);
} // end of GetCharValue } // end of GetCharValue
/***********************************************************************/
/* Return the value of the nth element converted to tiny int. */
/***********************************************************************/
char CHRBLK::GetTinyValue(int n)
{
bool m;
ulonglong val = CharToNumber((char*)GetValPtr(n), Long, INT_MAX8,
false, &m);
return (m && val < INT_MAX8) ? (char)(-(signed)val) : (char)val;
} // end of GetTinyValue
/***********************************************************************/
/* Return the value of the nth element converted to unsigned tiny int.*/
/***********************************************************************/
uchar CHRBLK::GetUTinyValue(int n)
{
return (uchar)CharToNumber((char*)GetValPtr(n), Long, UINT_MAX8, true);
} // end of GetTinyValue
/***********************************************************************/ /***********************************************************************/
/* Return the value of the nth element converted to short. */ /* Return the value of the nth element converted to short. */
/***********************************************************************/ /***********************************************************************/
short CHRBLK::GetShortValue(int n) short CHRBLK::GetShortValue(int n)
{ {
return (short)atoi((char *)GetValPtrEx(n)); bool m;
ulonglong val = CharToNumber((char*)GetValPtr(n), Long, INT_MAX16,
false, &m);
return (m && val < INT_MAX16) ? (short)(-(signed)val) : (short)val;
} // end of GetShortValue } // end of GetShortValue
/***********************************************************************/ /***********************************************************************/
...@@ -570,7 +610,7 @@ short CHRBLK::GetShortValue(int n) ...@@ -570,7 +610,7 @@ short CHRBLK::GetShortValue(int n)
/***********************************************************************/ /***********************************************************************/
ushort CHRBLK::GetUShortValue(int n) ushort CHRBLK::GetUShortValue(int n)
{ {
return (ushort)atoi((char *)GetValPtrEx(n)); return (ushort)CharToNumber((char*)GetValPtr(n), Long, UINT_MAX16, true);
} // end of GetShortValue } // end of GetShortValue
/***********************************************************************/ /***********************************************************************/
...@@ -578,7 +618,11 @@ ushort CHRBLK::GetUShortValue(int n) ...@@ -578,7 +618,11 @@ ushort CHRBLK::GetUShortValue(int n)
/***********************************************************************/ /***********************************************************************/
int CHRBLK::GetIntValue(int n) int CHRBLK::GetIntValue(int n)
{ {
return atol((char *)GetValPtrEx(n)); bool m;
ulonglong val = CharToNumber((char*)GetValPtr(n), Long, INT_MAX32,
false, &m);
return (m && val < INT_MAX32) ? (int)(-(signed)val) : (int)val;
} // end of GetIntValue } // end of GetIntValue
/***********************************************************************/ /***********************************************************************/
...@@ -586,7 +630,7 @@ int CHRBLK::GetIntValue(int n) ...@@ -586,7 +630,7 @@ int CHRBLK::GetIntValue(int n)
/***********************************************************************/ /***********************************************************************/
uint CHRBLK::GetUIntValue(int n) uint CHRBLK::GetUIntValue(int n)
{ {
return (unsigned)atol((char *)GetValPtrEx(n)); return (uint)CharToNumber((char*)GetValPtr(n), Long, UINT_MAX32, true);
} // end of GetIntValue } // end of GetIntValue
/***********************************************************************/ /***********************************************************************/
...@@ -594,7 +638,11 @@ uint CHRBLK::GetUIntValue(int n) ...@@ -594,7 +638,11 @@ uint CHRBLK::GetUIntValue(int n)
/***********************************************************************/ /***********************************************************************/
longlong CHRBLK::GetBigintValue(int n) longlong CHRBLK::GetBigintValue(int n)
{ {
return atoll((char *)GetValPtrEx(n)); bool m;
ulonglong val = CharToNumber((char*)GetValPtr(n), Long, INT_MAX64,
false, &m);
return (m && val < INT_MAX64) ? (longlong)(-(signed)val) : (longlong)val;
} // end of GetBigintValue } // end of GetBigintValue
/***********************************************************************/ /***********************************************************************/
...@@ -602,8 +650,8 @@ longlong CHRBLK::GetBigintValue(int n) ...@@ -602,8 +650,8 @@ longlong CHRBLK::GetBigintValue(int n)
/***********************************************************************/ /***********************************************************************/
ulonglong CHRBLK::GetUBigintValue(int n) ulonglong CHRBLK::GetUBigintValue(int n)
{ {
return (unsigned)atoll((char *)GetValPtrEx(n)); return CharToNumber((char*)GetValPtr(n), Long, ULONGLONG_MAX, true);
} // end of GetBigintValue } // end of GetUBigintValue
/***********************************************************************/ /***********************************************************************/
/* Return the value of the nth element converted to double. */ /* Return the value of the nth element converted to double. */
...@@ -613,22 +661,6 @@ double CHRBLK::GetFloatValue(int n) ...@@ -613,22 +661,6 @@ double CHRBLK::GetFloatValue(int n)
return atof((char *)GetValPtrEx(n)); return atof((char *)GetValPtrEx(n));
} // end of GetFloatValue } // end of GetFloatValue
/***********************************************************************/
/* Return the value of the nth element converted to tiny int. */
/***********************************************************************/
char CHRBLK::GetTinyValue(int n)
{
return (char)atoi((char *)GetValPtrEx(n));
} // end of GetTinyValue
/***********************************************************************/
/* Return the value of the nth element converted to unsigned tiny int.*/
/***********************************************************************/
uchar CHRBLK::GetUTinyValue(int n)
{
return (uchar)atoi((char *)GetValPtrEx(n));
} // end of GetTinyValue
/***********************************************************************/ /***********************************************************************/
/* Set one value in a block. */ /* Set one value in a block. */
/***********************************************************************/ /***********************************************************************/
...@@ -869,6 +901,86 @@ void STRBLK::Init(PGLOBAL g, bool check) ...@@ -869,6 +901,86 @@ void STRBLK::Init(PGLOBAL g, bool check)
Global = g; Global = g;
} // end of Init } // end of Init
/***********************************************************************/
/* Get the tiny value represented by the Strp string. */
/***********************************************************************/
char STRBLK::GetTinyValue(int n)
{
bool m;
ulonglong val = CharToNumber(Strp[n], strlen(Strp[n]), INT_MAX8,
false, &m);
return (m && val < INT_MAX8) ? (char)(-(signed)val) : (char)val;
} // end of GetTinyValue
/***********************************************************************/
/* Get the unsigned tiny value represented by the Strp string. */
/***********************************************************************/
uchar STRBLK::GetUTinyValue(int n)
{
return (uchar)CharToNumber(Strp[n], strlen(Strp[n]), UINT_MAX8, true);
} // end of GetUTinyValue
/***********************************************************************/
/* Get the short value represented by the Strp string. */
/***********************************************************************/
short STRBLK::GetShortValue(int n)
{
bool m;
ulonglong val = CharToNumber(Strp[n], strlen(Strp[n]), INT_MAX16,
false, &m);
return (m && val < INT_MAX16) ? (short)(-(signed)val) : (short)val;
} // end of GetShortValue
/***********************************************************************/
/* Get the unsigned short value represented by the Strp string. */
/***********************************************************************/
ushort STRBLK::GetUShortValue(int n)
{
return (ushort)CharToNumber(Strp[n], strlen(Strp[n]), UINT_MAX16, true);
} // end of GetUshortValue
/***********************************************************************/
/* Get the integer value represented by the Strp string. */
/***********************************************************************/
int STRBLK::GetIntValue(int n)
{
bool m;
ulonglong val = CharToNumber(Strp[n], strlen(Strp[n]), INT_MAX32,
false, &m);
return (m && val < INT_MAX32) ? (int)(-(signed)val) : (int)val;
} // end of GetIntValue
/***********************************************************************/
/* Get the unsigned integer value represented by the Strp string. */
/***********************************************************************/
uint STRBLK::GetUIntValue(int n)
{
return (uint)CharToNumber(Strp[n], strlen(Strp[n]), UINT_MAX32, true);
} // end of GetUintValue
/***********************************************************************/
/* Get the big integer value represented by the Strp string. */
/***********************************************************************/
longlong STRBLK::GetBigintValue(int n)
{
bool m;
ulonglong val = CharToNumber(Strp[n], strlen(Strp[n]), INT_MAX64,
false, &m);
return (m && val < INT_MAX64) ? (-(signed)val) : (longlong)val;
} // end of GetBigintValue
/***********************************************************************/
/* Get the unsigned big integer value represented by the Strp string. */
/***********************************************************************/
ulonglong STRBLK::GetUBigintValue(int n)
{
return CharToNumber(Strp[n], strlen(Strp[n]), ULONGLONG_MAX, true);
} // end of GetUBigintValue
/***********************************************************************/ /***********************************************************************/
/* Set one value in a block from a value in another block. */ /* Set one value in a block from a value in another block. */
/***********************************************************************/ /***********************************************************************/
......
...@@ -45,9 +45,12 @@ class VALBLK : public BLOCK { ...@@ -45,9 +45,12 @@ class VALBLK : public BLOCK {
{if (To_Nulls) {To_Nulls[n] = (b) ? '*' : 0;}} {if (To_Nulls) {To_Nulls[n] = (b) ? '*' : 0;}}
virtual bool IsNull(int n) {return To_Nulls && To_Nulls[n];} virtual bool IsNull(int n) {return To_Nulls && To_Nulls[n];}
virtual void SetNullable(bool b); virtual void SetNullable(bool b);
virtual bool IsUnsigned(void) {return Unsigned;}
virtual void Init(PGLOBAL g, bool check) = 0; virtual void Init(PGLOBAL g, bool check) = 0;
virtual int GetVlen(void) = 0; virtual int GetVlen(void) = 0;
virtual PSZ GetCharValue(int n); virtual PSZ GetCharValue(int n);
virtual char GetTinyValue(int n) = 0;
virtual uchar GetUTinyValue(int n) = 0;
virtual short GetShortValue(int n) = 0; virtual short GetShortValue(int n) = 0;
virtual ushort GetUShortValue(int n) = 0; virtual ushort GetUShortValue(int n) = 0;
virtual int GetIntValue(int n) = 0; virtual int GetIntValue(int n) = 0;
...@@ -55,8 +58,6 @@ class VALBLK : public BLOCK { ...@@ -55,8 +58,6 @@ class VALBLK : public BLOCK {
virtual longlong GetBigintValue(int n) = 0; virtual longlong GetBigintValue(int n) = 0;
virtual ulonglong GetUBigintValue(int n) = 0; virtual ulonglong GetUBigintValue(int n) = 0;
virtual double GetFloatValue(int n) = 0; virtual double GetFloatValue(int n) = 0;
virtual char GetTinyValue(int n) = 0;
virtual uchar GetUTinyValue(int n) = 0;
virtual void ReAlloc(void *mp, int n) {Blkp = mp; Nval = n;} virtual void ReAlloc(void *mp, int n) {Blkp = mp; Nval = n;}
virtual void Reset(int n) = 0; virtual void Reset(int n) = 0;
virtual bool SetFormat(PGLOBAL g, PSZ fmt, int len, int year = 0); virtual bool SetFormat(PGLOBAL g, PSZ fmt, int len, int year = 0);
...@@ -123,6 +124,8 @@ class TYPBLK : public VALBLK { ...@@ -123,6 +124,8 @@ class TYPBLK : public VALBLK {
virtual void Init(PGLOBAL g, bool check); virtual void Init(PGLOBAL g, bool check);
virtual int GetVlen(void) {return sizeof(TYPE);} virtual int GetVlen(void) {return sizeof(TYPE);}
//virtual PSZ GetCharValue(int n); //virtual PSZ GetCharValue(int n);
virtual char GetTinyValue(int n) {return (char)Typp[n];}
virtual uchar GetUTinyValue(int n) {return (uchar)Typp[n];}
virtual short GetShortValue(int n) {return (short)Typp[n];} virtual short GetShortValue(int n) {return (short)Typp[n];}
virtual ushort GetUShortValue(int n) {return (ushort)Typp[n];} virtual ushort GetUShortValue(int n) {return (ushort)Typp[n];}
virtual int GetIntValue(int n) {return (int)Typp[n];} virtual int GetIntValue(int n) {return (int)Typp[n];}
...@@ -130,8 +133,6 @@ class TYPBLK : public VALBLK { ...@@ -130,8 +133,6 @@ class TYPBLK : public VALBLK {
virtual longlong GetBigintValue(int n) {return (longlong)Typp[n];} virtual longlong GetBigintValue(int n) {return (longlong)Typp[n];}
virtual ulonglong GetUBigintValue(int n) {return (ulonglong)Typp[n];} virtual ulonglong GetUBigintValue(int n) {return (ulonglong)Typp[n];}
virtual double GetFloatValue(int n) {return (double)Typp[n];} virtual double GetFloatValue(int n) {return (double)Typp[n];}
virtual char GetTinyValue(int n) {return (char)Typp[n];}
virtual uchar GetUTinyValue(int n) {return (uchar)Typp[n];}
virtual void Reset(int n) {Typp[n] = 0;} virtual void Reset(int n) {Typp[n] = 0;}
// Methods // Methods
...@@ -168,9 +169,9 @@ class TYPBLK : public VALBLK { ...@@ -168,9 +169,9 @@ class TYPBLK : public VALBLK {
protected: protected:
// Specialized functions // Specialized functions
static ulonglong MaxVal(void);
TYPE GetTypedValue(PVAL vp); TYPE GetTypedValue(PVAL vp);
TYPE GetTypedValue(PVBLK blk, int n); TYPE GetTypedValue(PVBLK blk, int n);
TYPE GetTypedValue(PSZ s);
// Members // Members
TYPE* const &Typp; TYPE* const &Typp;
...@@ -189,6 +190,8 @@ class CHRBLK : public VALBLK { ...@@ -189,6 +190,8 @@ class CHRBLK : public VALBLK {
virtual void Init(PGLOBAL g, bool check); virtual void Init(PGLOBAL g, bool check);
virtual int GetVlen(void) {return Long;} virtual int GetVlen(void) {return Long;}
virtual PSZ GetCharValue(int n); virtual PSZ GetCharValue(int n);
virtual char GetTinyValue(int n);
virtual uchar GetUTinyValue(int n);
virtual short GetShortValue(int n); virtual short GetShortValue(int n);
virtual ushort GetUShortValue(int n); virtual ushort GetUShortValue(int n);
virtual int GetIntValue(int n); virtual int GetIntValue(int n);
...@@ -196,8 +199,6 @@ class CHRBLK : public VALBLK { ...@@ -196,8 +199,6 @@ class CHRBLK : public VALBLK {
virtual longlong GetBigintValue(int n); virtual longlong GetBigintValue(int n);
virtual ulonglong GetUBigintValue(int n); virtual ulonglong GetUBigintValue(int n);
virtual double GetFloatValue(int n); virtual double GetFloatValue(int n);
virtual char GetTinyValue(int n);
virtual uchar GetUTinyValue(int n);
virtual void Reset(int n); virtual void Reset(int n);
virtual void SetPrec(int p) {Ci = (p != 0);} virtual void SetPrec(int p) {Ci = (p != 0);}
virtual bool IsCi(void) {return Ci;} virtual bool IsCi(void) {return Ci;}
...@@ -242,15 +243,15 @@ class STRBLK : public VALBLK { ...@@ -242,15 +243,15 @@ class STRBLK : public VALBLK {
virtual void Init(PGLOBAL g, bool check); virtual void Init(PGLOBAL g, bool check);
virtual int GetVlen(void) {return sizeof(PSZ);} virtual int GetVlen(void) {return sizeof(PSZ);}
virtual PSZ GetCharValue(int n) {return Strp[n];} virtual PSZ GetCharValue(int n) {return Strp[n];}
virtual short GetShortValue(int n) {return (short)atoi(Strp[n]);} virtual char GetTinyValue(int n);
virtual ushort GetUShortValue(int n) {return (ushort)atoi(Strp[n]);} virtual uchar GetUTinyValue(int n);
virtual int GetIntValue(int n) {return atol(Strp[n]);} virtual short GetShortValue(int n);
virtual uint GetUIntValue(int n) {return (unsigned)atol(Strp[n]);} virtual ushort GetUShortValue(int n);
virtual longlong GetBigintValue(int n) {return atoll(Strp[n]);} virtual int GetIntValue(int n);
virtual ulonglong GetUBigintValue(int n) {return (unsigned)atoll(Strp[n]);} virtual uint GetUIntValue(int n);
virtual longlong GetBigintValue(int n);
virtual ulonglong GetUBigintValue(int n);
virtual double GetFloatValue(int n) {return atof(Strp[n]);} virtual double GetFloatValue(int n) {return atof(Strp[n]);}
virtual char GetTinyValue(int n) {return (char)atoi(Strp[n]);}
virtual uchar GetUTinyValue(int n) {return (uchar)atoi(Strp[n]);}
virtual void Reset(int n) {Strp[n] = NULL;} virtual void Reset(int n) {Strp[n] = NULL;}
// Methods // Methods
......
...@@ -90,6 +90,56 @@ PSZ strlwr(PSZ s); ...@@ -90,6 +90,56 @@ PSZ strlwr(PSZ s);
} }
#endif // !WIN32 #endif // !WIN32
/***********************************************************************/
/* Get a long long number from its character representation. */
/* IN p: Pointer to the numeric string */
/* IN n: The string length */
/* IN maxval: The number max value */
/* IN un: True if the number must be unsigned */
/* OUT rc: Set to TRUE for out of range value */
/* OUT minus: Set to true if the number is negative */
/* Returned val: The resulting number */
/***********************************************************************/
ulonglong CharToNumber(char *p, int n, ulonglong maxval,
bool un, bool *minus, bool *rc)
{
char *p2;
uchar c;
ulonglong val;
if (minus) *minus = false;
if (rc) *rc = false;
// Eliminate leading blanks or 0
for (p2 = p + n; p < p2 && (*p == ' ' || *p == '0'); p++) ;
// Get an eventual sign character
switch (*p) {
case '-':
if (un) {
if (rc) *rc = true;
return 0;
} else {
maxval++;
if (minus) *minus = true;
} // endif Unsigned
case '+':
p++;
break;
} // endswitch *p
for (val = 0; p < p2 && (c = (uchar)(*p - '0')) < 10; p++)
if (val > (maxval - c) / 10) {
val = maxval;
if (rc) *rc = true;
break;
} else
val = val * 10 + c;
return val;
} // end of CharToNumber
/***********************************************************************/ /***********************************************************************/
/* GetTypeName: returns the PlugDB internal type name. */ /* GetTypeName: returns the PlugDB internal type name. */
/***********************************************************************/ /***********************************************************************/
...@@ -479,6 +529,36 @@ TYPVAL<TYPE>::TYPVAL(TYPE n, int type, int prec, bool un) ...@@ -479,6 +529,36 @@ TYPVAL<TYPE>::TYPVAL(TYPE n, int type, int prec, bool un)
Prec = prec; Prec = prec;
} // end of TYPVAL constructor } // end of TYPVAL constructor
/***********************************************************************/
/* Return unsigned max value for the type. */
/***********************************************************************/
template <class TYPE>
ulonglong TYPVAL<TYPE>::MaxVal(void) {DBUG_ASSERT(false); return 0;}
template <>
ulonglong TYPVAL<short>::MaxVal(void) {return INT_MAX16;}
template <>
ulonglong TYPVAL<ushort>::MaxVal(void) {return UINT_MAX16;}
template <>
ulonglong TYPVAL<int>::MaxVal(void) {return INT_MAX32;}
template <>
ulonglong TYPVAL<uint>::MaxVal(void) {return UINT_MAX32;}
template <>
ulonglong TYPVAL<char>::MaxVal(void) {return INT_MAX8;}
template <>
ulonglong TYPVAL<uchar>::MaxVal(void) {return UINT_MAX8;}
template <>
ulonglong TYPVAL<longlong>::MaxVal(void) {return INT_MAX64;}
template <>
ulonglong TYPVAL<ulonglong>::MaxVal(void) {return ULONGLONG_MAX;}
/***********************************************************************/ /***********************************************************************/
/* TYPVAL GetValLen: returns the print length of the typed object. */ /* TYPVAL GetValLen: returns the print length of the typed object. */
/***********************************************************************/ /***********************************************************************/
...@@ -556,45 +636,29 @@ uchar TYPVAL<uchar>::GetTypedValue(PVAL valp) ...@@ -556,45 +636,29 @@ uchar TYPVAL<uchar>::GetTypedValue(PVAL valp)
/* TYPVAL SetValue: convert chars extracted from a line to TYPE value.*/ /* TYPVAL SetValue: convert chars extracted from a line to TYPE value.*/
/***********************************************************************/ /***********************************************************************/
template <class TYPE> template <class TYPE>
void TYPVAL<TYPE>::SetValue_char(char *p, int n) bool TYPVAL<TYPE>::SetValue_char(char *p, int n)
{ {
char *p2, buf[32]; bool rc, minus;
bool minus = false; ulonglong maxval = MaxVal();
ulonglong val = CharToNumber(p, n, maxval, Unsigned, &minus, &rc);
for (p2 = p + n; p < p2 && *p == ' '; p++) ;
if (minus && val < maxval)
for (Tval = 0, minus = false; p < p2; p++) Tval = (TYPE)(-(signed)val);
switch (*p) { else
case '-': Tval = (TYPE)val;
minus = true;
case '+':
break;
case '0': Tval = Tval * 10; break;
case '1': Tval = Tval * 10 + 1; break;
case '2': Tval = Tval * 10 + 2; break;
case '3': Tval = Tval * 10 + 3; break;
case '4': Tval = Tval * 10 + 4; break;
case '5': Tval = Tval * 10 + 5; break;
case '6': Tval = Tval * 10 + 6; break;
case '7': Tval = Tval * 10 + 7; break;
case '8': Tval = Tval * 10 + 8; break;
case '9': Tval = Tval * 10 + 9; break;
default:
p = p2;
} // endswitch *p
if (minus && Tval)
Tval = (-(signed)Tval) ? -(signed)Tval : Tval;
if (trace > 1) if (trace > 1) {
char buf[64];
htrc(strcat(strcat(strcpy(buf, " setting %s to: "), Fmt), "\n"), htrc(strcat(strcat(strcpy(buf, " setting %s to: "), Fmt), "\n"),
GetTypeName(Type), Tval); GetTypeName(Type), Tval);
} // endif trace
Null = false; Null = false;
return rc;
} // end of SetValue } // end of SetValue
template <> template <>
void TYPVAL<double>::SetValue_char(char *p, int n) bool TYPVAL<double>::SetValue_char(char *p, int n)
{ {
if (p) { if (p) {
char buf[32]; char buf[32];
...@@ -615,6 +679,7 @@ void TYPVAL<double>::SetValue_char(char *p, int n) ...@@ -615,6 +679,7 @@ void TYPVAL<double>::SetValue_char(char *p, int n)
Null = Nullable; Null = Nullable;
} // endif p } // endif p
return false;
} // end of SetValue } // end of SetValue
/***********************************************************************/ /***********************************************************************/
...@@ -624,7 +689,7 @@ template <class TYPE> ...@@ -624,7 +689,7 @@ template <class TYPE>
void TYPVAL<TYPE>::SetValue_psz(PSZ s) void TYPVAL<TYPE>::SetValue_psz(PSZ s)
{ {
if (s) { if (s) {
Tval = GetTypedValue(s); SetValue_char(s, (int)strlen(s));
Null = false; Null = false;
} else { } else {
Reset(); Reset();
...@@ -633,25 +698,6 @@ void TYPVAL<TYPE>::SetValue_psz(PSZ s) ...@@ -633,25 +698,6 @@ void TYPVAL<TYPE>::SetValue_psz(PSZ s)
} // end of SetValue } // end of SetValue
template <>
int TYPVAL<int>::GetTypedValue(PSZ s) {return atol(s);}
template <>
uint TYPVAL<uint>::GetTypedValue(PSZ s) {return (unsigned)atol(s);}
template <>
short TYPVAL<short>::GetTypedValue(PSZ s) {return (short)atoi(s);}
template <>
ushort TYPVAL<ushort>::GetTypedValue(PSZ s) {return (ushort)atoi(s);}
template <>
longlong TYPVAL<longlong>::GetTypedValue(PSZ s) {return atoll(s);}
template <>
ulonglong TYPVAL<ulonglong>::GetTypedValue(PSZ s) {return (unsigned)atoll(s);}
template <>
double TYPVAL<double>::GetTypedValue(PSZ s) {return atof(s);}
template <>
char TYPVAL<char>::GetTypedValue(PSZ s) {return (char)atoi(s);}
template <>
uchar TYPVAL<uchar>::GetTypedValue(PSZ s) {return (uchar)atoi(s);}
/***********************************************************************/ /***********************************************************************/
/* TYPVAL SetValue: set value with a TYPE extracted from a block. */ /* TYPVAL SetValue: set value with a TYPE extracted from a block. */
/***********************************************************************/ /***********************************************************************/
...@@ -668,7 +714,7 @@ int TYPVAL<int>::GetTypedValue(PVBLK blk, int n) ...@@ -668,7 +714,7 @@ int TYPVAL<int>::GetTypedValue(PVBLK blk, int n)
template <> template <>
uint TYPVAL<uint>::GetTypedValue(PVBLK blk, int n) uint TYPVAL<uint>::GetTypedValue(PVBLK blk, int n)
{return (unsigned)blk->GetIntValue(n);} {return blk->GetUIntValue(n);}
template <> template <>
short TYPVAL<short>::GetTypedValue(PVBLK blk, int n) short TYPVAL<short>::GetTypedValue(PVBLK blk, int n)
...@@ -676,7 +722,7 @@ short TYPVAL<short>::GetTypedValue(PVBLK blk, int n) ...@@ -676,7 +722,7 @@ short TYPVAL<short>::GetTypedValue(PVBLK blk, int n)
template <> template <>
ushort TYPVAL<ushort>::GetTypedValue(PVBLK blk, int n) ushort TYPVAL<ushort>::GetTypedValue(PVBLK blk, int n)
{return (unsigned)blk->GetShortValue(n);} {return blk->GetUShortValue(n);}
template <> template <>
longlong TYPVAL<longlong>::GetTypedValue(PVBLK blk, int n) longlong TYPVAL<longlong>::GetTypedValue(PVBLK blk, int n)
...@@ -684,7 +730,7 @@ longlong TYPVAL<longlong>::GetTypedValue(PVBLK blk, int n) ...@@ -684,7 +730,7 @@ longlong TYPVAL<longlong>::GetTypedValue(PVBLK blk, int n)
template <> template <>
ulonglong TYPVAL<ulonglong>::GetTypedValue(PVBLK blk, int n) ulonglong TYPVAL<ulonglong>::GetTypedValue(PVBLK blk, int n)
{return (unsigned)blk->GetBigintValue(n);} {return blk->GetUBigintValue(n);}
template <> template <>
double TYPVAL<double>::GetTypedValue(PVBLK blk, int n) double TYPVAL<double>::GetTypedValue(PVBLK blk, int n)
...@@ -696,7 +742,7 @@ char TYPVAL<char>::GetTypedValue(PVBLK blk, int n) ...@@ -696,7 +742,7 @@ char TYPVAL<char>::GetTypedValue(PVBLK blk, int n)
template <> template <>
uchar TYPVAL<uchar>::GetTypedValue(PVBLK blk, int n) uchar TYPVAL<uchar>::GetTypedValue(PVBLK blk, int n)
{return (unsigned)blk->GetTinyValue(n);} {return blk->GetUTinyValue(n);}
/***********************************************************************/ /***********************************************************************/
/* TYPVAL SetBinValue: with bytes extracted from a line. */ /* TYPVAL SetBinValue: with bytes extracted from a line. */
...@@ -830,6 +876,8 @@ bool TYPVAL<TYPE>::IsEqual(PVAL vp, bool chktype) ...@@ -830,6 +876,8 @@ bool TYPVAL<TYPE>::IsEqual(PVAL vp, bool chktype)
return true; return true;
else if (chktype && Type != vp->GetType()) else if (chktype && Type != vp->GetType())
return false; return false;
else if (chktype && Unsigned != vp->IsUnsigned())
return false;
else if (Null || vp->IsNull()) else if (Null || vp->IsNull())
return false; return false;
else else
...@@ -931,6 +979,82 @@ TYPVAL<PSZ>::TYPVAL(PGLOBAL g, PSZ s, int n, int c) ...@@ -931,6 +979,82 @@ TYPVAL<PSZ>::TYPVAL(PGLOBAL g, PSZ s, int n, int c)
Ci = (c != 0); Ci = (c != 0);
} // end of STRING constructor } // end of STRING constructor
/***********************************************************************/
/* Get the tiny value represented by the Strp string. */
/***********************************************************************/
char TYPVAL<PSZ>::GetTinyValue(void)
{
bool m;
ulonglong val = CharToNumber(Strp, strlen(Strp), INT_MAX8, false, &m);
return (m && val < INT_MAX8) ? (char)(-(signed)val) : (char)val;
} // end of GetTinyValue
/***********************************************************************/
/* Get the unsigned tiny value represented by the Strp string. */
/***********************************************************************/
uchar TYPVAL<PSZ>::GetUTinyValue(void)
{
return (uchar)CharToNumber(Strp, strlen(Strp), UINT_MAX8, true);
} // end of GetUTinyValue
/***********************************************************************/
/* Get the short value represented by the Strp string. */
/***********************************************************************/
short TYPVAL<PSZ>::GetShortValue(void)
{
bool m;
ulonglong val = CharToNumber(Strp, strlen(Strp), INT_MAX16, false, &m);
return (m && val < INT_MAX16) ? (short)(-(signed)val) : (short)val;
} // end of GetShortValue
/***********************************************************************/
/* Get the unsigned short value represented by the Strp string. */
/***********************************************************************/
ushort TYPVAL<PSZ>::GetUShortValue(void)
{
return (ushort)CharToNumber(Strp, strlen(Strp), UINT_MAX16, true);
} // end of GetUshortValue
/***********************************************************************/
/* Get the integer value represented by the Strp string. */
/***********************************************************************/
int TYPVAL<PSZ>::GetIntValue(void)
{
bool m;
ulonglong val = CharToNumber(Strp, strlen(Strp), INT_MAX32, false, &m);
return (m && val < INT_MAX32) ? (int)(-(signed)val) : (int)val;
} // end of GetIntValue
/***********************************************************************/
/* Get the unsigned integer value represented by the Strp string. */
/***********************************************************************/
uint TYPVAL<PSZ>::GetUIntValue(void)
{
return (uint)CharToNumber(Strp, strlen(Strp), UINT_MAX32, true);
} // end of GetUintValue
/***********************************************************************/
/* Get the big integer value represented by the Strp string. */
/***********************************************************************/
longlong TYPVAL<PSZ>::GetBigintValue(void)
{
bool m;
ulonglong val = CharToNumber(Strp, strlen(Strp), INT_MAX64, false, &m);
return (m && val < INT_MAX64) ? (-(signed)val) : (longlong)val;
} // end of GetBigintValue
/***********************************************************************/
/* Get the unsigned big integer value represented by the Strp string. */
/***********************************************************************/
ulonglong TYPVAL<PSZ>::GetUBigintValue(void)
{
return CharToNumber(Strp, strlen(Strp), ULONGLONG_MAX, true);
} // end of GetUBigintValue
/***********************************************************************/ /***********************************************************************/
/* STRING SetValue: copy the value of another Value object. */ /* STRING SetValue: copy the value of another Value object. */
/***********************************************************************/ /***********************************************************************/
...@@ -952,9 +1076,13 @@ bool TYPVAL<PSZ>::SetValue_pval(PVAL valp, bool chktype) ...@@ -952,9 +1076,13 @@ bool TYPVAL<PSZ>::SetValue_pval(PVAL valp, bool chktype)
/***********************************************************************/ /***********************************************************************/
/* STRING SetValue: fill string with chars extracted from a line. */ /* STRING SetValue: fill string with chars extracted from a line. */
/***********************************************************************/ /***********************************************************************/
void TYPVAL<PSZ>::SetValue_char(char *p, int n) bool TYPVAL<PSZ>::SetValue_char(char *p, int n)
{ {
bool rc;
if (p) { if (p) {
rc = n > Len;
if ((n = min(n, Len))) { if ((n = min(n, Len))) {
strncpy(Strp, p, n); strncpy(Strp, p, n);
...@@ -973,10 +1101,12 @@ void TYPVAL<PSZ>::SetValue_char(char *p, int n) ...@@ -973,10 +1101,12 @@ void TYPVAL<PSZ>::SetValue_char(char *p, int n)
Null = false; Null = false;
} else { } else {
rc = false;
Reset(); Reset();
Null = Nullable; Null = Nullable;
} // endif p } // endif p
return rc;
} // end of SetValue_char } // end of SetValue_char
/***********************************************************************/ /***********************************************************************/
...@@ -1179,53 +1309,6 @@ char *TYPVAL<PSZ>::GetCharString(char *p) ...@@ -1179,53 +1309,6 @@ char *TYPVAL<PSZ>::GetCharString(char *p)
return Strp; return Strp;
} // end of GetCharString } // end of GetCharString
#if 0
/***********************************************************************/
/* STRING GetShortString: get short representation of a char value. */
/***********************************************************************/
char *TYPVAL<PSZ>::GetShortString(char *p, int n)
{
sprintf(p, "%*hd", n, (short)(Null ? 0 : atoi(Strp)));
return p;
} // end of GetShortString
/***********************************************************************/
/* STRING GetIntString: get int representation of a char value. */
/***********************************************************************/
char *TYPVAL<PSZ>::GetIntString(char *p, int n)
{
sprintf(p, "%*ld", n, (Null) ? 0 : atol(Strp));
return p;
} // end of GetIntString
/***********************************************************************/
/* STRING GetBigintString: get big int representation of a char value.*/
/***********************************************************************/
char *TYPVAL<PSZ>::GetBigintString(char *p, int n)
{
sprintf(p, "%*lld", n, (Null) ? 0 : atoll(Strp));
return p;
} // end of GetBigintString
/***********************************************************************/
/* STRING GetFloatString: get double representation of a char value. */
/***********************************************************************/
char *TYPVAL<PSZ>::GetFloatString(char *p, int n, int prec)
{
sprintf(p, "%*.*lf", n, (prec < 0) ? 2 : prec, Null ? 0 : atof(Strp));
return p;
} // end of GetFloatString
/***********************************************************************/
/* STRING GetTinyString: get tiny int representation of a char value. */
/***********************************************************************/
char *TYPVAL<PSZ>::GetTinyString(char *p, int n)
{
sprintf(p, "%*d", n, (Null) ? 0 : (char)atoi(Strp));
return p;
} // end of GetIntString
#endif // 0
/***********************************************************************/ /***********************************************************************/
/* STRING compare value with another Value. */ /* STRING compare value with another Value. */
/***********************************************************************/ /***********************************************************************/
...@@ -1353,11 +1436,7 @@ void DTVAL::SetTimeShift(void) ...@@ -1353,11 +1436,7 @@ void DTVAL::SetTimeShift(void)
} // end of SetTimeShift } // end of SetTimeShift
/***********************************************************************/ // Added by Alexander Barkov
/* GetGmTime: returns a pointer to a static tm structure obtained */
/* though the gmtime C function. The purpose of this function is to */
/* extend the range of valid dates by accepting negative time values. */
/***********************************************************************/
static void TIME_to_localtime(struct tm *tm, const MYSQL_TIME *ltime) static void TIME_to_localtime(struct tm *tm, const MYSQL_TIME *ltime)
{ {
bzero(tm, sizeof(*tm)); bzero(tm, sizeof(*tm));
...@@ -1369,7 +1448,7 @@ static void TIME_to_localtime(struct tm *tm, const MYSQL_TIME *ltime) ...@@ -1369,7 +1448,7 @@ static void TIME_to_localtime(struct tm *tm, const MYSQL_TIME *ltime)
tm->tm_sec= ltime->second; tm->tm_sec= ltime->second;
} }
// Added by Alexander Barkov
static struct tm *gmtime_mysql(const time_t *timep, struct tm *tm) static struct tm *gmtime_mysql(const time_t *timep, struct tm *tm)
{ {
MYSQL_TIME ltime; MYSQL_TIME ltime;
...@@ -1378,7 +1457,11 @@ static struct tm *gmtime_mysql(const time_t *timep, struct tm *tm) ...@@ -1378,7 +1457,11 @@ static struct tm *gmtime_mysql(const time_t *timep, struct tm *tm)
return tm; return tm;
} }
/***********************************************************************/
/* GetGmTime: returns a pointer to a static tm structure obtained */
/* though the gmtime C function. The purpose of this function is to */
/* extend the range of valid dates by accepting negative time values. */
/***********************************************************************/
struct tm *DTVAL::GetGmTime(struct tm *tm_buffer) struct tm *DTVAL::GetGmTime(struct tm *tm_buffer)
{ {
struct tm *datm; struct tm *datm;
...@@ -1401,12 +1484,7 @@ struct tm *DTVAL::GetGmTime(struct tm *tm_buffer) ...@@ -1401,12 +1484,7 @@ struct tm *DTVAL::GetGmTime(struct tm *tm_buffer)
return datm; return datm;
} // end of GetGmTime } // end of GetGmTime
/***********************************************************************/ // Added by Alexander Barkov
/* MakeTime: calculates a date value from a tm structures using the */
/* mktime C function. The purpose of this function is to extend the */
/* range of valid dates by accepting to set negative time values. */
/***********************************************************************/
static time_t mktime_mysql(struct tm *ptm) static time_t mktime_mysql(struct tm *ptm)
{ {
MYSQL_TIME ltime; MYSQL_TIME ltime;
...@@ -1417,6 +1495,11 @@ static time_t mktime_mysql(struct tm *ptm) ...@@ -1417,6 +1495,11 @@ static time_t mktime_mysql(struct tm *ptm)
return error_code ? (time_t) -1 : t; return error_code ? (time_t) -1 : t;
} }
/***********************************************************************/
/* MakeTime: calculates a date value from a tm structures using the */
/* mktime C function. The purpose of this function is to extend the */
/* range of valid dates by accepting to set negative time values. */
/***********************************************************************/
bool DTVAL::MakeTime(struct tm *ptm) bool DTVAL::MakeTime(struct tm *ptm)
{ {
int n, y = ptm->tm_year; int n, y = ptm->tm_year;
...@@ -1573,8 +1656,10 @@ bool DTVAL::SetValue_pval(PVAL valp, bool chktype) ...@@ -1573,8 +1656,10 @@ bool DTVAL::SetValue_pval(PVAL valp, bool chktype)
/***********************************************************************/ /***********************************************************************/
/* SetValue: convert chars extracted from a line to date value. */ /* SetValue: convert chars extracted from a line to date value. */
/***********************************************************************/ /***********************************************************************/
void DTVAL::SetValue_char(char *p, int n) bool DTVAL::SetValue_char(char *p, int n)
{ {
bool rc;
if (Pdtp) { if (Pdtp) {
char *p2; char *p2;
int ndv; int ndv;
...@@ -1583,7 +1668,9 @@ void DTVAL::SetValue_char(char *p, int n) ...@@ -1583,7 +1668,9 @@ void DTVAL::SetValue_char(char *p, int n)
// Trim trailing blanks // Trim trailing blanks
for (p2 = p + n -1; p < p2 && *p2 == ' '; p2--) ; for (p2 = p + n -1; p < p2 && *p2 == ' '; p2--) ;
n = min(p2 - p + 1, Len); if ((rc = (n = p2 - p + 1) > Len))
n = Len;
memcpy(Sdate, p, n); memcpy(Sdate, p, n);
Sdate[n] = '\0'; Sdate[n] = '\0';
...@@ -1595,8 +1682,9 @@ void DTVAL::SetValue_char(char *p, int n) ...@@ -1595,8 +1682,9 @@ void DTVAL::SetValue_char(char *p, int n)
Null = false; Null = false;
} else } else
TYPVAL<int>::SetValue_char(p, n); rc = TYPVAL<int>::SetValue_char(p, n);
return rc;
} // end of SetValue } // end of SetValue
/***********************************************************************/ /***********************************************************************/
...@@ -1696,6 +1784,7 @@ char *DTVAL::ShowValue(char *buf, int len) ...@@ -1696,6 +1784,7 @@ char *DTVAL::ShowValue(char *buf, int len)
} // end of ShowValue } // end of ShowValue
#if 0 // Not used by CONNECT
/***********************************************************************/ /***********************************************************************/
/* Returns a member of the struct tm representation of the date. */ /* Returns a member of the struct tm representation of the date. */
/***********************************************************************/ /***********************************************************************/
...@@ -1745,6 +1834,7 @@ bool DTVAL::WeekNum(PGLOBAL g, int& nval) ...@@ -1745,6 +1834,7 @@ bool DTVAL::WeekNum(PGLOBAL g, int& nval)
// Everything should be Ok // Everything should be Ok
return false; return false;
} // end of WeekNum } // end of WeekNum
#endif // 0
/***********************************************************************/ /***********************************************************************/
/* FormatValue: This function set vp (a STRING value) to the string */ /* FormatValue: This function set vp (a STRING value) to the string */
......
...@@ -16,11 +16,6 @@ ...@@ -16,11 +16,6 @@
#include "assert.h" #include "assert.h"
#include "block.h" #include "block.h"
#if defined(WIN32)
#define strtoll _strtoi64
#define atoll(S) strtoll(S, NULL, 10)
#endif // WIN32
/***********************************************************************/ /***********************************************************************/
/* Types used in some class definitions. */ /* Types used in some class definitions. */
/***********************************************************************/ /***********************************************************************/
...@@ -55,6 +50,8 @@ DllExport bool IsTypeNum(int type); ...@@ -55,6 +50,8 @@ DllExport bool IsTypeNum(int type);
DllExport PVAL AllocateValue(PGLOBAL, PVAL, int = TYPE_VOID, int = 0); DllExport PVAL AllocateValue(PGLOBAL, PVAL, int = TYPE_VOID, int = 0);
DllExport PVAL AllocateValue(PGLOBAL, int, int len = 0, int prec = 0, DllExport PVAL AllocateValue(PGLOBAL, int, int len = 0, int prec = 0,
PSZ fmt = NULL); PSZ fmt = NULL);
DllExport ulonglong CharToNumber(char *, int, ulonglong, bool,
bool *minus = NULL, bool *rc = NULL);
/***********************************************************************/ /***********************************************************************/
/* Class VALUE represents a constant or variable of any valid type. */ /* Class VALUE represents a constant or variable of any valid type. */
...@@ -96,7 +93,7 @@ class DllExport VALUE : public BLOCK { ...@@ -96,7 +93,7 @@ class DllExport VALUE : public BLOCK {
// Methods // Methods
virtual bool SetValue_pval(PVAL valp, bool chktype = false) = 0; virtual bool SetValue_pval(PVAL valp, bool chktype = false) = 0;
virtual void SetValue_char(char *p, int n) = 0; virtual bool SetValue_char(char *p, int n) = 0;
virtual void SetValue_psz(PSZ s) = 0; virtual void SetValue_psz(PSZ s) = 0;
virtual void SetValue(char c) {assert(false);} virtual void SetValue(char c) {assert(false);}
virtual void SetValue(uchar c) {assert(false);} virtual void SetValue(uchar c) {assert(false);}
...@@ -112,11 +109,6 @@ class DllExport VALUE : public BLOCK { ...@@ -112,11 +109,6 @@ class DllExport VALUE : public BLOCK {
virtual bool GetBinValue(void *buf, int buflen, bool go) = 0; virtual bool GetBinValue(void *buf, int buflen, bool go) = 0;
virtual char *ShowValue(char *buf, int len = 0) = 0; virtual char *ShowValue(char *buf, int len = 0) = 0;
virtual char *GetCharString(char *p) = 0; virtual char *GetCharString(char *p) = 0;
//virtual char *GetShortString(char *p, int n) {return "#####";}
//virtual char *GetIntString(char *p, int n) = 0;
//virtual char *GetBigintString(char *p, int n) = 0;
//virtual char *GetFloatString(char *p, int n, int prec) = 0;
//virtual char *GetTinyString(char *p, int n) {return "?";}
virtual bool IsEqual(PVAL vp, bool chktype) = 0; virtual bool IsEqual(PVAL vp, bool chktype) = 0;
virtual bool FormatValue(PVAL vp, char *fmt) = 0; virtual bool FormatValue(PVAL vp, char *fmt) = 0;
...@@ -169,7 +161,7 @@ class DllExport TYPVAL : public VALUE { ...@@ -169,7 +161,7 @@ class DllExport TYPVAL : public VALUE {
// Methods // Methods
virtual bool SetValue_pval(PVAL valp, bool chktype); virtual bool SetValue_pval(PVAL valp, bool chktype);
virtual void SetValue_char(char *p, int n); virtual bool SetValue_char(char *p, int n);
virtual void SetValue_psz(PSZ s); virtual void SetValue_psz(PSZ s);
virtual void SetValue(char c) {Tval = (TYPE)c; Null = false;} virtual void SetValue(char c) {Tval = (TYPE)c; Null = false;}
virtual void SetValue(uchar c) {Tval = (TYPE)c; Null = false;} virtual void SetValue(uchar c) {Tval = (TYPE)c; Null = false;}
...@@ -185,11 +177,6 @@ class DllExport TYPVAL : public VALUE { ...@@ -185,11 +177,6 @@ class DllExport TYPVAL : public VALUE {
virtual bool GetBinValue(void *buf, int buflen, bool go); virtual bool GetBinValue(void *buf, int buflen, bool go);
virtual char *ShowValue(char *buf, int); virtual char *ShowValue(char *buf, int);
virtual char *GetCharString(char *p); virtual char *GetCharString(char *p);
//virtual char *GetShortString(char *p, int n);
//virtual char *GetIntString(char *p, int n);
//virtual char *GetBigintString(char *p, int n);
//virtual char *GetFloatString(char *p, int n, int prec = -1);
//virtual char *GetTinyString(char *p, int n);
virtual bool IsEqual(PVAL vp, bool chktype); virtual bool IsEqual(PVAL vp, bool chktype);
virtual bool SetConstFormat(PGLOBAL, FORMAT&); virtual bool SetConstFormat(PGLOBAL, FORMAT&);
virtual bool FormatValue(PVAL vp, char *fmt); virtual bool FormatValue(PVAL vp, char *fmt);
...@@ -201,9 +188,10 @@ class DllExport TYPVAL : public VALUE { ...@@ -201,9 +188,10 @@ class DllExport TYPVAL : public VALUE {
TYPVAL(void) : VALUE(TYPE_ERROR) {} TYPVAL(void) : VALUE(TYPE_ERROR) {}
// Specialized functions // Specialized functions
TYPE GetTypedValue(PVAL vp); static ulonglong MaxVal(void);
TYPE GetTypedValue(PVBLK blk, int n); TYPE GetTypedValue(PVAL vp);
TYPE GetTypedValue(PSZ s); TYPE GetTypedValue(PVBLK blk, int n);
// TYPE GetTypedValue(PSZ s);
// Members // Members
TYPE Tval; TYPE Tval;
...@@ -227,21 +215,21 @@ class DllExport TYPVAL<PSZ>: public VALUE { ...@@ -227,21 +215,21 @@ class DllExport TYPVAL<PSZ>: public VALUE {
virtual int GetValPrec() {return (Ci) ? 1 : 0;} virtual int GetValPrec() {return (Ci) ? 1 : 0;}
virtual int GetSize(void) {return (Strp) ? strlen(Strp) : 0;} virtual int GetSize(void) {return (Strp) ? strlen(Strp) : 0;}
virtual PSZ GetCharValue(void) {return Strp;} virtual PSZ GetCharValue(void) {return Strp;}
virtual char GetTinyValue(void) {return (char)atoi(Strp);} virtual char GetTinyValue(void);
virtual uchar GetUTinyValue(void) {return (uchar)atoi(Strp);} virtual uchar GetUTinyValue(void);
virtual short GetShortValue(void) {return (short)atoi(Strp);} virtual short GetShortValue(void);
virtual ushort GetUShortValue(void) {return (ushort)atoi(Strp);} virtual ushort GetUShortValue(void);
virtual int GetIntValue(void) {return atol(Strp);} virtual int GetIntValue(void);
virtual uint GetUIntValue(void) {return (uint)atol(Strp);} virtual uint GetUIntValue(void);
virtual longlong GetBigintValue(void) {return atoll(Strp);} virtual longlong GetBigintValue(void);
virtual ulonglong GetUBigintValue(void) {return (ulonglong)atoll(Strp);} virtual ulonglong GetUBigintValue(void);
virtual double GetFloatValue(void) {return atof(Strp);} virtual double GetFloatValue(void) {return atof(Strp);}
virtual void *GetTo_Val(void) {return Strp;} virtual void *GetTo_Val(void) {return Strp;}
virtual void SetPrec(int prec) {Ci = prec != 0;} virtual void SetPrec(int prec) {Ci = prec != 0;}
// Methods // Methods
virtual bool SetValue_pval(PVAL valp, bool chktype); virtual bool SetValue_pval(PVAL valp, bool chktype);
virtual void SetValue_char(char *p, int n); virtual bool SetValue_char(char *p, int n);
virtual void SetValue_psz(PSZ s); virtual void SetValue_psz(PSZ s);
virtual void SetValue_pvblk(PVBLK blk, int n); virtual void SetValue_pvblk(PVBLK blk, int n);
virtual void SetValue(char c); virtual void SetValue(char c);
...@@ -257,23 +245,10 @@ class DllExport TYPVAL<PSZ>: public VALUE { ...@@ -257,23 +245,10 @@ class DllExport TYPVAL<PSZ>: public VALUE {
virtual bool GetBinValue(void *buf, int buflen, bool go); virtual bool GetBinValue(void *buf, int buflen, bool go);
virtual char *ShowValue(char *buf, int); virtual char *ShowValue(char *buf, int);
virtual char *GetCharString(char *p); virtual char *GetCharString(char *p);
//virtual char *GetShortString(char *p, int n);
//virtual char *GetIntString(char *p, int n);
//virtual char *GetBigintString(char *p, int n);
//virtual char *GetFloatString(char *p, int n, int prec = -1);
//virtual char *GetTinyString(char *p, int n);
virtual bool IsEqual(PVAL vp, bool chktype); virtual bool IsEqual(PVAL vp, bool chktype);
virtual bool FormatValue(PVAL vp, char *fmt); virtual bool FormatValue(PVAL vp, char *fmt);
virtual bool SetConstFormat(PGLOBAL, FORMAT&); virtual bool SetConstFormat(PGLOBAL, FORMAT&);
// Specialized functions
//template <class T>
//T GetValue_as(T type) {return Strp;}
//int GetValue_as(int type) {return atol(Strp);}
//short GetValue_as(short type) {return (short)atoi(Strp);}
//longlong GetValue_as(longlong type) {return atoll(Strp);}
//double GetValue_as(double type) {return atof(Strp);}
// Members // Members
PSZ Strp; PSZ Strp;
bool Ci; // true if case insensitive bool Ci; // true if case insensitive
...@@ -295,7 +270,7 @@ class DllExport DTVAL : public TYPVAL<int> { ...@@ -295,7 +270,7 @@ class DllExport DTVAL : public TYPVAL<int> {
// Implementation // Implementation
virtual bool SetValue_pval(PVAL valp, bool chktype); virtual bool SetValue_pval(PVAL valp, bool chktype);
virtual void SetValue_char(char *p, int n); virtual bool SetValue_char(char *p, int n);
virtual void SetValue_psz(PSZ s); virtual void SetValue_psz(PSZ s);
virtual void SetValue_pvblk(PVBLK blk, int n); virtual void SetValue_pvblk(PVBLK blk, int n);
virtual char *GetCharString(char *p); virtual char *GetCharString(char *p);
...@@ -304,15 +279,15 @@ class DllExport DTVAL : public TYPVAL<int> { ...@@ -304,15 +279,15 @@ class DllExport DTVAL : public TYPVAL<int> {
bool SetFormat(PGLOBAL g, PSZ fmt, int len, int year = 0); bool SetFormat(PGLOBAL g, PSZ fmt, int len, int year = 0);
bool SetFormat(PGLOBAL g, PVAL valp); bool SetFormat(PGLOBAL g, PVAL valp);
bool IsFormatted(void) {return Pdtp != NULL;} bool IsFormatted(void) {return Pdtp != NULL;}
bool GetTmMember(OPVAL op, int& mval); // bool GetTmMember(OPVAL op, int& mval);
bool DateDiff(DTVAL *dtp, OPVAL op, int& tdif); // bool DateDiff(DTVAL *dtp, OPVAL op, int& tdif);
bool MakeTime(struct tm *ptm); bool MakeTime(struct tm *ptm);
static void SetTimeShift(void); static void SetTimeShift(void);
static int GetShift(void) {return Shift;} static int GetShift(void) {return Shift;}
// Methods // Methods
bool MakeDate(PGLOBAL g, int *val, int nval); bool MakeDate(PGLOBAL g, int *val, int nval);
bool WeekNum(PGLOBAL g, int& nval); // bool WeekNum(PGLOBAL g, int& nval);
struct tm *GetGmTime(struct tm *); struct tm *GetGmTime(struct tm *);
......
...@@ -134,6 +134,7 @@ bool CONSTANT::Compare(PXOB xp) ...@@ -134,6 +134,7 @@ bool CONSTANT::Compare(PXOB xp)
} // end of Compare } // end of Compare
#if 0
/***********************************************************************/ /***********************************************************************/
/* Rephrase: temporary implementation used by PlugRephraseSQL. */ /* Rephrase: temporary implementation used by PlugRephraseSQL. */
/***********************************************************************/ /***********************************************************************/
...@@ -166,6 +167,7 @@ bool CONSTANT::Rephrase(PGLOBAL g, PSZ work) ...@@ -166,6 +167,7 @@ bool CONSTANT::Rephrase(PGLOBAL g, PSZ work)
return false; return false;
} // end of Rephrase } // end of Rephrase
#endif // 0
/***********************************************************************/ /***********************************************************************/
/* Make file output of a constant object. */ /* Make file output of a constant object. */
......
...@@ -124,7 +124,7 @@ class DllExport CONSTANT : public XOBJECT { ...@@ -124,7 +124,7 @@ class DllExport CONSTANT : public XOBJECT {
{return Value->SetConstFormat(g, fmt);} {return Value->SetConstFormat(g, fmt);}
virtual int CheckSpcCol(PTDB, int) {return 1;} virtual int CheckSpcCol(PTDB, int) {return 1;}
void Convert(PGLOBAL g, int newtype); void Convert(PGLOBAL g, int newtype);
bool Rephrase(PGLOBAL g, PSZ work); // bool Rephrase(PGLOBAL g, PSZ work);
void SetValue(PVAL vp) {Value = vp;} void SetValue(PVAL vp) {Value = vp;}
virtual bool VerifyColumn(PTBX txp) {return true;} virtual bool VerifyColumn(PTBX txp) {return true;}
virtual bool VerifyTdb(PTDB& tdbp) {return true;} virtual bool VerifyTdb(PTDB& tdbp) {return true;}
......
...@@ -242,6 +242,7 @@ class TDBCAT : public TDBASE { ...@@ -242,6 +242,7 @@ class TDBCAT : public TDBASE {
virtual int GetRecpos(void) {return N;} virtual int GetRecpos(void) {return N;}
virtual int GetProgCur(void) {return N;} virtual int GetProgCur(void) {return N;}
virtual int RowNumber(PGLOBAL g, bool b = false) {return N + 1;} virtual int RowNumber(PGLOBAL g, bool b = false) {return N + 1;}
virtual bool SetRecpos(PGLOBAL g, int recpos);
// Database routines // Database routines
virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n);
......
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