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)
Buf_Type = cdp->Buf_Type;
ColUse |= cdp->Flags; // Used by CONNECT
Nullable = !!(cdp->Flags & U_NULLS);
Unsigned = !!(cdp->Flags & U_UNSIGNED);
} else {
Name = NULL;
memset(&Format, 0, sizeof(FORMAT));
......@@ -48,6 +49,7 @@ COLBLK::COLBLK(PCOLDEF cdp, PTDB tdbp, int i)
Long = 0;
Buf_Type = TYPE_ERROR;
Nullable = false;
Unsigned = false;
} // endif cdp
To_Tdb = tdbp;
......@@ -171,9 +173,12 @@ bool COLBLK::InitValue(PGLOBAL g)
if (Value)
return false; // Already done
// Unsigned can be set only for valid value types
int prec = (Unsigned) ? 1 : GetPrecision();
// Allocate a Value object
if (!(Value = AllocateValue(g, Buf_Type, Format.Length,
GetPrecision(), GetDomain())))
prec, GetDomain())))
return true;
AddStatus(BUF_READY);
......
......@@ -83,6 +83,7 @@ class DllExport COLBLK : public XOBJECT {
PTDB To_Tdb; // Points to Table Descriptor Block
PXCOL To_Kcol; // Points to Xindex matching column
bool Nullable; // True if nullable
bool Unsigned; // True if unsigned
int Index; // Column number in table
int Opt; // Cluster/sort information
int Buf_Type; // Data type
......
......@@ -591,7 +591,7 @@ int CntIndexInit(PGLOBAL g, PTDB ptdb, int id)
if (!ptdb)
return -1;
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;
} else
tdbp= (PTDBDOX)ptdb;
......@@ -685,6 +685,7 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op,
char *kp= (char*)key;
int n;
short lg;
bool rcb;
RCODE rc;
PVAL valp;
PCOL colp;
......@@ -694,7 +695,7 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op,
if (!ptdb)
return RC_FX;
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;
} else
tdbp= (PTDBDOX)ptdb;
......@@ -719,9 +720,20 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op,
if (colp->GetColUse(U_VAR)) {
lg= *(short*)kp;
kp+= sizeof(short);
valp->SetValue_char(kp, (int)lg);
rcb= valp->SetValue_char(kp, (int)lg);
} 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
valp->SetBinValue((void*)kp);
......@@ -759,7 +771,7 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len,
const uchar *p, *kp;
int i, n, k[2];
short lg;
bool b;
bool b, rcb;
PVAL valp;
PCOL colp;
PTDBDOX tdbp;
......@@ -768,7 +780,7 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len,
if (!ptdb)
return -1;
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));
return -1;
} else
......@@ -802,9 +814,21 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len,
if (colp->GetColUse(U_VAR)) {
lg= *(short*)p;
p+= sizeof(short);
valp->SetValue_char((char*)p, (int)lg);
rcb= valp->SetValue_char((char*)p, (int)lg);
} 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
valp->SetBinValue((void*)p);
......
......@@ -165,7 +165,7 @@ extern "C" char nmfile[];
extern "C" char pdebug[];
extern "C" {
char version[]= "Version 1.01.0009 October 29, 2013";
char version[]= "Version 1.01.0010 November 30, 2013";
#if defined(XMSG)
char msglang[]; // Default message language
......@@ -777,7 +777,7 @@ int ha_connect::GetIntegerOption(char *opname)
if (opval == (ulonglong)NO_IVAL && options && 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;
} // end of GetIntegerOption
......@@ -936,6 +936,12 @@ void *ha_connect::GetColumnOption(PGLOBAL g, void *field, PCOLINFO pcf)
break;
} // 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
if (fp->real_maybe_null())
pcf->Flags |= U_NULLS;
......@@ -1341,7 +1347,15 @@ int ha_connect::MakeRecord(char *buf)
} else
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)));
} // endif store
......@@ -1930,7 +1944,7 @@ int ha_connect::optimize(THD* thd, HA_CHECK_OPT* check_opt)
if (tdbp || (tdbp= GetTDB(g))) {
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;
} else if ((rc= ((PTDBASE)tdbp)->ResetTableOpt(g, true))) {
if (rc == RC_INFO) {
......@@ -2392,9 +2406,12 @@ int ha_connect::rnd_init(bool scan)
if (!g || !table || xmod == MODE_INSERT)
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())
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
// handler to retrieve write-only fields to be able to compare
......@@ -2521,7 +2538,7 @@ int ha_connect::rnd_next(uchar *buf)
void ha_connect::position(const uchar *record)
{
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());
DBUG_VOID_RETURN;
} // end of position
......@@ -3030,12 +3047,18 @@ int ha_connect::external_lock(THD *thd, int lock_type)
rc= 2; // Logical error ???
else if (g->Xchk) {
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 newsep= ((PCHK)g->Xchk)->newsep;
PTDBDOS tdp= (PTDBDOS)(tdbp ? tdbp : GetTDB(g));
if (!tdp)
DBUG_RETURN(HA_ERR_INTERNAL_ERROR);
PTDBDOS tdp= (PTDBDOS)tdbp;
PDOSDEF ddp= (PDOSDEF)tdp->GetDef();
PIXDEF xp, xp1, xp2, drp=NULL, adp= NULL;
......@@ -3145,7 +3168,8 @@ int ha_connect::external_lock(THD *thd, int lock_type)
g->Xchk= new(g) XCHK;
((PCHK)g->Xchk)->oldsep= GetBooleanOption("Sepindex", false);
((PCHK)g->Xchk)->oldpix= GetIndexInfo();
} // endif xcheck
} else
g->Xchk= NULL;
if (cras)
g->Createas= 1; // To tell created table to ignore FLAG
......@@ -3464,25 +3488,45 @@ static bool add_fields(PGLOBAL g,
// void *vcolinfo,
// engine_option_value *create_options,
int flg,
bool dbf)
bool dbf,
char v)
{
register Create_field *new_field;
char *length, *decimals;
enum_field_types type= PLGtoMYSQL(typ, dbf);
char *length, *decimals= NULL;
enum_field_types type;
//Virtual_column_info *vcol_info= (Virtual_column_info *)vcolinfo;
engine_option_value *crop;
LEX_STRING *comment= thd->make_lex_string(rem, strlen(rem));
LEX_STRING *field_name= thd->make_lex_string(name, strlen(name));
LEX_STRING *comment;
LEX_STRING *field_name;
DBUG_ENTER("ha_connect::add_fields");
length= (char*)PlugSubAlloc(g, NULL, 8);
sprintf(length, "%d", len);
if (dec) {
decimals= (char*)PlugSubAlloc(g, NULL, 8);
sprintf(decimals, "%d", dec);
if (len) {
if (!v && typ == TYPE_STRING && len > 255)
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
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) {
engine_option_value *start= NULL, *end= NULL;
......@@ -3511,7 +3555,7 @@ static bool add_fields(PGLOBAL g,
#else // !NEW_WAY
static bool add_field(String *sql, const char *field_name, int typ,
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;
bool error= false;
......@@ -3528,16 +3572,33 @@ static bool add_field(String *sql, const char *field_name, int typ,
if (!strcmp(type, "DOUBLE")) {
error|= sql->append(',');
// dec must be <= len and <= 31
error|= sql->append_ulonglong(min(dec, (len - 1)));
// dec must be < len and < 31
error|= sql->append_ulonglong(min(dec, (min(len, 31) - 1)));
} // endif dec
error|= sql->append(')');
} // endif len
if (v == 'U')
error|= sql->append(" UNSIGNED");
else if (v == 'Z')
error|= sql->append(" ZEROFILL");
if (tm)
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) {
error|= sql->append(" COMMENT '");
error|= sql->append_for_single_quote(rem, strlen(rem));
......@@ -3808,7 +3869,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
TABLE_SHARE *table_s,
HA_CREATE_INFO *create_info)
{
char spc= ',', qch= 0;
char v, spc= ',', qch= 0;
const char *fncn= "?";
const char *user, *fn, *db, *host, *pwd, *sep, *tbl, *src;
const char *col, *ocl, *rnk, *pic, *fcl;
......@@ -3830,7 +3891,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
//CHARSET_INFO *cs;
Alter_info alter_info;
#else // !NEW_WAY
char v, buf[1024];
char buf[1024];
String sql(buf, sizeof(buf), 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,
tab= table_s->table_name.str; // Default value
#if defined(NEW_WAY)
add_option(thd, create_info, "tabname", tab);
// add_option(thd, create_info, "tabname", tab);
#endif // NEW_WAY
} // endif tab
......@@ -4044,8 +4105,8 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
} // endif src
if (ok) {
char *cnm, *rem;
int i, len, dec, typ, flg;
char *cnm, *rem, *dft;
int i, len, prec, dec, typ, flg;
PDBUSER dup= PlgGetUser(g);
PCATLG cat= (dup) ? dup->Catalog : NULL;
......@@ -4151,19 +4212,21 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
#if defined(NEW_WAY)
// Now add the field
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
// 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;
#endif // !NEW_WAY
} // endfor crp
} else // Not a catalog table
for (i= 0; !rc && i < qrp->Nblin; i++) {
typ= len= dec= 0;
typ= len= prec= dec= 0;
tm= NOT_NULL_FLAG;
cnm= (char*)"noname";
dft= NULL;
#if defined(NEW_WAY)
rem= "";
// cs= NULL;
......@@ -4181,6 +4244,10 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
v = (crp->Nulls) ? crp->Nulls[i] : 0;
break;
case FLD_PREC:
// PREC must be always before LENGTH
len= prec= crp->Kdata->GetIntValue(i);
break;
case FLD_LENGTH:
len= crp->Kdata->GetIntValue(i);
break;
case FLD_SCALE:
......@@ -4200,6 +4267,9 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
// cs= get_charset_by_name(csn, 0);
// break;
case FLD_DEFAULT:
dft= crp->Kdata->GetCharValue(i);
break;
default:
break; // Ignore
} // endswitch Fld
......@@ -4209,16 +4279,16 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
int plgtyp;
// 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);
my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0));
return HA_ERR_INTERNAL_ERROR;
} else
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)
len += (dec + 2); // To be safe
prec += (dec + 2); // To be safe
else
dec= 0;
......@@ -4227,14 +4297,16 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
// Make the arguments as required by add_fields
if (typ == TYPE_DATE)
len= 0;
prec= 0;
else if (typ == TYPE_FLOAT)
prec= len;
// Now add the field
#if defined(NEW_WAY)
rc= add_fields(g, thd, &alter_info, cnm, typ, len, dec,
tm, rem, 0, true);
rc= add_fields(g, thd, &alter_info, cnm, typ, prec, dec,
tm, rem, 0, dbf, v);
#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;
#endif // !NEW_WAY
} // endfor i
......@@ -4553,9 +4625,9 @@ int ha_connect::create(const char *name, TABLE *table_arg,
} // 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) {
// The file name is not specified, create a default file in
// the database directory named table_name.table_type.
......@@ -4619,42 +4691,63 @@ int ha_connect::create(const char *name, TABLE *table_arg,
} // endif filename
// To check whether indexes have to be made or remade
if (!g->Xchk) {
PIXDEF xdp;
} // endif type
// To check whether indexes have to be made or remade
if (!g->Xchk) {
PIXDEF xdp;
// We should be in CREATE TABLE
if (thd_sql_command(table->in_use) != SQLCOM_CREATE_TABLE)
push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0,
"Wrong command in create, please contact CONNECT team");
// We should be in CREATE TABLE
if (thd_sql_command(table->in_use) != SQLCOM_CREATE_TABLE)
push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0,
"Wrong command in create, please contact CONNECT team");
// Get the index definitions
if (xdp= GetIndexInfo()) {
// Get the index definitions
if (xdp= GetIndexInfo()) {
if (IsTypeIndexable(type)) {
PDBUSER dup= PlgGetUser(g);
PCATLG cat= (dup) ? dup->Catalog : NULL;
if (cat) {
cat->SetDataPath(g, table_arg->s->db.str);
if ((rc= optimize(table->in_use, NULL))) {
printf("Create rc=%d %s\n", rc, g->Message);
my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0));
rc= HA_ERR_INTERNAL_ERROR;
} else
CloseTable(g);
} // 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 {
((PCHK)g->Xchk)->newsep= GetBooleanOption("Sepindex", false);
((PCHK)g->Xchk)->newpix= GetIndexInfo();
} // endif Xchk
} else {
PIXDEF xdp= GetIndexInfo();
table= st;
} // endif type
if (xdp) {
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);
} // end of create
......
......@@ -172,21 +172,6 @@ bool IsTypeNullable(TABTYPE type)
{
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) {
case TAB_MAC:
case TAB_DIR:
......@@ -222,6 +207,31 @@ bool IsTypeFixed(TABTYPE type)
return fix;
} // 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. */
/***********************************************************************/
......
......@@ -38,6 +38,7 @@ TABTYPE GetTypeID(const char *type);
bool IsFileType(TABTYPE type);
bool IsTypeNullable(TABTYPE type);
bool IsTypeFixed(TABTYPE type);
bool IsTypeIndexable(TABTYPE type);
uint GetFuncID(const char *func);
/***********************************************************************/
......
......@@ -46,21 +46,6 @@
#define DLL_EXPORT // Items are exported from this DLL
#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 MYSQL_PLUGIN_IMPORT uint mysqld_port;
......@@ -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,
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,
FLD_KEY, FLD_SCALE, FLD_RADIX, FLD_NULL,
FLD_REM, FLD_NO, FLD_CHARSET};
static unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 256, 32, 32};
char *fld, *fmt, v, cmd[128];
FLD_REM, FLD_NO, FLD_DEFAULT, FLD_CHARSET};
static unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 0, 32, 0, 32};
char *fld, *fmt, v, cmd[128], uns[16], zero[16];
int i, n, nf, ncol = sizeof(buftyp) / sizeof(int);
int len, type, prec, rc, k = 0;
PQRYRES qrp;
......@@ -122,9 +107,10 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db,
} // endif n
/********************************************************************/
/* Get the size of the name columns. */
/* Get the size of the name and default columns. */
/********************************************************************/
length[0] = myc.GetFieldLength(0);
length[10] = myc.GetFieldLength(5);
} else {
n = 0;
length[0] = 128;
......@@ -164,18 +150,29 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db,
crp = qrp->Colresp; // Column_Name
crp->Kdata->SetValue(fld, i);
// Get type, type name, and precision
// Get type, type name, precision, unsigned and zerofill
fld = myc.GetCharField(1);
prec = 0;
len = 0;
v = 0;
if ((nf = sscanf(fld, "%[^(](%d,%d", cmd, &len, &prec)) < 1) {
sprintf(g->Message, MSG(BAD_FIELD_TYPE), fld);
myc.Close();
return NULL;
} else
qrp->Nblin++;
*uns = 0;
*zero = 0;
switch ((nf = sscanf(fld, "%[^(](%d,%d", cmd, &len, &prec))) {
case 3:
nf = sscanf(fld, "%[^(](%d,%d) %s %s", cmd, &len, &prec, uns, zero);
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) {
sprintf(g->Message, "Unsupported column type %s", cmd);
......@@ -184,9 +181,16 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db,
} else if (type == TYPE_STRING)
len = min(len, 4096);
qrp->Nblin++;
crp = crp->Next; // Data_Type
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->Kdata->SetValue(cmd, i);
......@@ -200,7 +204,7 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db,
crp = crp->Next; // Precision
crp->Kdata->SetValue(len, i);
crp = crp->Next; // was Length
crp = crp->Next; // key (was Length)
fld = myc.GetCharField(4);
crp->Kdata->SetValue(fld, i);
......@@ -218,9 +222,13 @@ PQRYRES MyColumns(PGLOBAL g, const char *host, const char *db,
fld = myc.GetCharField(8);
crp->Kdata->SetValue(fld, i);
crp = crp->Next; // New
crp = crp->Next; // Date format
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)
fld = myc.GetCharField(2);
crp->Kdata->SetValue(fld, i);
......@@ -657,6 +665,7 @@ PQRYRES MYSQLC::GetResult(PGLOBAL g, bool pdb)
{
char *fmt;
int n;
bool uns;
PCOLRES *pcrp, crp;
PQRYRES qrp;
MYSQL_FIELD *fld;
......@@ -707,9 +716,10 @@ PQRYRES MYSQLC::GetResult(PGLOBAL g, bool pdb)
crp->Prec = (crp->Type == TYPE_FLOAT) ? fld->decimals : 0;
crp->Length = fld->max_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,
crp->Clen, 0, FALSE, TRUE, FALSE))) {
crp->Clen, 0, FALSE, TRUE, uns))) {
sprintf(g->Message, MSG(INV_RESULT_TYPE),
GetFormatType(crp->Type));
return NULL;
......
......@@ -13,3 +13,5 @@ MASTER_MYSOCK= @mysqld.1.socket
SLAVE_MYPORT= @mysqld.2.port
SLAVE_MYSOCK= @mysqld.2.socket
PGCLIENTENCODING= UTF8
......@@ -238,3 +238,38 @@ CREATE TABLE `t2` (
# End of mysqldump ------
DROP TABLE t2;
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;
Table Create Table
t1 CREATE TABLE `t1` (
`id` int(20) NOT NULL,
`group` int(11) NOT NULL,
`a\\b` int(11) NOT NULL,
`a\\` int(10) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL
`group` int(11) NOT NULL DEFAULT '1',
`a\\b` int(11) NOT NULL DEFAULT '2',
`a\\` int(10) unsigned 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'
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');
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;
id group a\\b a\\ name
1 1 2 NULL foo
......
......@@ -204,7 +204,7 @@ t1 CREATE TABLE `t1` (
`a` date DEFAULT NULL,
`b` datetime 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
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT' `TABLE_TYPE`='MYSQL'
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;
Table_Qualifier Table_Owner Table_Name Table_Type Remark
t1 TABLE
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;
SET @a=LOAD_FILE('MYSQLD_DATADIR/test/t1.xml');
SELECT CAST(@a AS CHAR CHARACTER SET latin1);
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>
<line>
<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;
--echo # End of mysqldump ------
DROP TABLE t2;
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
#
# To run this test, install SQLite3 ODBC Driver from
# http://www.ch-werner.de/sqliteodbc/
#
# Note, the test does not need a DSN to be created
# (only the driver is required)
#
#
# On Windows:
# -----------
# Download and run the installer file sqliteodbc.exe
# Version sqliteodbc-0.991 is known to Work.
# After running the installer the test should start working automatically.
#
# On Linux:
# --------
# 1. Download the source tarball, e.g.: sqliteodbc-0.993.tar.gz
# 2. Unpack the sources:
# tar -zxf sqliteodbc-0.993.tar.gz
# 3. Compile the source and install:
# cd sqliteodbc-0.993
# ./configure --prefix=/opt/sqliteodbc
# make
# sudo make install
#
# (you can use a different --prefix, according to your preferences)
#
# 4. Add these lines into /etc/odbcinst.ini
#
#[SQLite3 ODBC Driver]
#Description=SQLite3 ODBC Driver
#Driver=/opt/sqliteodbc/libsqlite3odbc.so
#Setup=/opt/sqliteodbc/libsqlite3odbc.so
#
# Adjust the directory "/opt/sqliteodbc/" according to --prefix
# that you chose on step #3.
#
#
SET NAMES utf8;
let $MYSQLD_DATADIR= `select @@datadir`;
#
# 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
# 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.
#
let $Database=$MTR_SUITE_DIR/std_data/test.sqlite3;
--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;
--replace_result $MTR_SUITE_DIR MTR_SUITE_DIR
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;
--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
SELECT * FROM t1;
DROP TABLE t1;
--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
SELECT * FROM t1;
DROP TABLE t1;
--source have_odbc_sqlite3.inc
#
# To run this test, install SQLite3 ODBC Driver from
# http://www.ch-werner.de/sqliteodbc/
#
# Note, the test does not need a DSN to be created
# (only the driver is required)
#
#
# On Windows:
# -----------
# Download and run the installer file sqliteodbc.exe
# Version sqliteodbc-0.991 is known to Work.
# After running the installer the test should start working automatically.
#
# On Linux:
# --------
# 1. Download the source tarball, e.g.: sqliteodbc-0.993.tar.gz
# 2. Unpack the sources:
# tar -zxf sqliteodbc-0.993.tar.gz
# 3. Compile the source and install:
# cd sqliteodbc-0.993
# ./configure --prefix=/opt/sqliteodbc
# make
# sudo make install
#
# (you can use a different --prefix, according to your preferences)
#
# 4. Add these lines into /etc/odbcinst.ini
#
#[SQLite3 ODBC Driver]
#Description=SQLite3 ODBC Driver
#Driver=/opt/sqliteodbc/libsqlite3odbc.so
#Setup=/opt/sqliteodbc/libsqlite3odbc.so
#
# Adjust the directory "/opt/sqliteodbc/" according to --prefix
# that you chose on step #3.
#
#
SET NAMES utf8;
let $MYSQLD_DATADIR= `select @@datadir`;
#
# 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
# 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.
#
let $Database=$MTR_SUITE_DIR/std_data/test.sqlite3;
--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;
--replace_result $MTR_SUITE_DIR MTR_SUITE_DIR
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;
--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
SELECT * FROM t1;
DROP TABLE t1;
--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
SELECT * FROM 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
--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
--source have_libxml2.inc
let $MYSQLD_DATADIR= `select @@datadir`;
......
-- source include/not_embedded.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
-- source have_libxml2.inc
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)
/************************************************************************/
/* 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;
......@@ -99,10 +99,14 @@ enum enum_field_types PLGtoMYSQL(int type, bool dbf)
mytype = MYSQL_TYPE_DOUBLE;
break;
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;
case TYPE_STRING:
mytype = MYSQL_TYPE_VARCHAR;
mytype = (v) ? MYSQL_TYPE_VARCHAR : MYSQL_TYPE_STRING;
break;
case TYPE_BIGINT:
mytype = MYSQL_TYPE_LONGLONG;
......@@ -138,12 +142,12 @@ const char *PLGtoMYSQLtype(int type, bool dbf, char v)
} // endswitch mytype
return "CHAR(0)";
} // end of PLGtoMYSQL
} // end of PLGtoMYSQLtype
/************************************************************************/
/* Convert from MySQL type to PlugDB type number */
/************************************************************************/
int MYSQLtoPLG(int mytype)
int MYSQLtoPLG(int mytype, char *var)
{
int type;
......@@ -177,7 +181,6 @@ int MYSQLtoPLG(int mytype)
case MYSQL_TYPE_TIME:
type = TYPE_DATE;
break;
case MYSQL_TYPE_STRING:
case MYSQL_TYPE_VAR_STRING:
#if !defined(ALPHA)
case MYSQL_TYPE_VARCHAR:
......@@ -186,6 +189,8 @@ int MYSQLtoPLG(int mytype)
case MYSQL_TYPE_TINY_BLOB:
case MYSQL_TYPE_MEDIUM_BLOB:
case MYSQL_TYPE_LONG_BLOB:
if (var) *var = 'V';
case MYSQL_TYPE_STRING:
type = TYPE_STRING;
break;
default:
......
......@@ -4,10 +4,10 @@
#ifndef __MYUTIL__H
#define __MYUTIL__H
enum enum_field_types PLGtoMYSQL(int type, bool dbf);
const char *PLGtoMYSQLtype(int type, bool dbf, char var = NULL);
enum enum_field_types PLGtoMYSQL(int type, bool dbf, char var = 0);
const char *PLGtoMYSQLtype(int type, bool dbf, char var = 0);
int MYSQLtoPLG(char *typname, char *var = NULL);
int MYSQLtoPLG(int mytype);
int MYSQLtoPLG(int mytype, char *var = NULL);
char *MyDateFmt(int mytype);
char *MyDateFmt(char *typname);
......
......@@ -121,7 +121,7 @@ int TranslateSQLType(int stp, int prec, int& len, char& v)
case SQL_LONGVARCHAR: // (-1)
v = 'V';
type = TYPE_STRING;
len = min(abs(len), 255);
len = min(abs(len), 256);
break;
case SQL_NUMERIC: // 2
case SQL_DECIMAL: // 3
......@@ -226,10 +226,10 @@ static CATPARM *AllocCatInfo(PGLOBAL g, CATINFO fid, char *tab, PQRYRES qrp)
cap->Id = fid;
cap->Qrp = qrp;
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++)
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));
return cap;
......@@ -540,7 +540,7 @@ PQRYRES ODBCTables(PGLOBAL g, char *dsn, char *tabpat, bool info)
FLD_TYPE, FLD_REM};
static unsigned int length[] = {0, 0, 0, 16, 128};
int n, ncol = 5;
int maxres;
int maxres;
PQRYRES qrp;
CATPARM *cap;
ODBConn *ocp = NULL;
......@@ -557,7 +557,7 @@ PQRYRES ODBCTables(PGLOBAL g, char *dsn, char *tabpat, bool info)
if (ocp->Open(dsn, 2) < 1) // 2 is openReadOnly
return NULL;
maxres = 512; // This is completely arbitrary
maxres = 16384; // This is completely arbitrary
n = ocp->GetMaxValue(SQL_MAX_QUALIFIER_NAME_LEN);
length[0] = (n) ? (n + 1) : 128;
n = ocp->GetMaxValue(SQL_MAX_USER_NAME_LEN);
......@@ -1123,10 +1123,10 @@ bool ODBConn::Connect(DWORD Options)
PGLOBAL& g = m_G;
PDBUSER dup = PlgGetUser(g);
if (Options & noOdbcDialog || dup->Remote)
//if (Options & noOdbcDialog || dup->Remote)
wConnectOption = SQL_DRIVER_NOPROMPT;
else if (Options & forceOdbcDialog)
wConnectOption = SQL_DRIVER_PROMPT;
//else if (Options & forceOdbcDialog)
// wConnectOption = SQL_DRIVER_PROMPT;
rc = SQLDriverConnect(m_hdbc, hWnd, (PUCHAR)m_Connect,
SQL_NTS, ConnOut, MAX_CONNECT_LEN,
......@@ -1986,6 +1986,87 @@ bool ODBConn::GetDrivers(PQRYRES qrp)
return rv;
} // 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. */
/***********************************************************************/
......@@ -2048,29 +2129,38 @@ int ODBConn::GetCatInfo(CATPARM *cap)
} else
ThrowDBX("0-sized result");
SQLQualifiedName name((const char *) cap->Tab);
// Now do call the proper ODBC API
switch (cap->Id) {
case CAT_TAB:
// rc = SQLSetStmtAttr(hstmt, SQL_ATTR_METADATA_ID,
// (SQLPOINTER)false, 0);
fnc = "SQLTables";
rc = SQLTables(hstmt, NULL, 0, NULL, 0, cap->Tab, SQL_NTS,
cap->Pat, SQL_NTS);
rc = SQLTables(hstmt, name.ptr(2), name.length(2),
name.ptr(1), name.length(1),
name.ptr(0), name.length(0),
cap->Pat, SQL_NTS);
break;
case CAT_COL:
// rc = SQLSetStmtAttr(hstmt, SQL_ATTR_METADATA_ID,
// (SQLPOINTER)true, 0);
fnc = "SQLColumns";
rc = SQLColumns(hstmt, NULL, 0, NULL, 0, cap->Tab, SQL_NTS,
cap->Pat, SQL_NTS);
rc = SQLColumns(hstmt, name.ptr(2), name.length(2),
name.ptr(1), name.length(1),
name.ptr(0), name.length(0),
cap->Pat, SQL_NTS);
break;
case CAT_KEY:
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;
case CAT_STAT:
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);
break;
case CAT_SPC:
......@@ -2088,7 +2178,7 @@ int ODBConn::GetCatInfo(CATPARM *cap)
if (m_RowsetSize == 1 && cap->Qrp->Maxres > 1) {
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
// Now bind the column buffers
......
......@@ -330,7 +330,9 @@ enum COLUSE {U_P = 0x01, /* the projection list. */
U_VIRTUAL = 0x20, /* a VIRTUAL column */
U_NULLS = 0x40, /* The column may have nulls */
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. */
......
......@@ -278,6 +278,18 @@ PQRYRES PlgAllocResult(PGLOBAL g, int ncol, int maxres, int ids,
PCOLRES *pcrp, crp;
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. */
/************************************************************************/
......@@ -342,6 +354,8 @@ PQRYRES PlgAllocResult(PGLOBAL g, int ncol, int maxres, int ids,
*pcrp = NULL;
fin:
g->jump_level--;
return qrp;
} // end of PlgAllocResult
......
......@@ -1087,7 +1087,12 @@ void DOSCOL::ReadColumn(PGLOBAL g)
case TYPE_SHORT:
case TYPE_TINY:
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;
case TYPE_FLOAT:
Value->SetValue_char(p, field);
......@@ -1104,7 +1109,11 @@ void DOSCOL::ReadColumn(PGLOBAL g)
} // endswitch Buf_Type
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;
default:
......
......@@ -375,7 +375,12 @@ void BINCOL::ReadColumn(PGLOBAL g)
Value->SetValue(*(double*)p);
break;
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;
default:
sprintf(g->Message, MSG(BAD_BIN_FMT), Fmt, Name);
......
......@@ -556,6 +556,15 @@ bool TDBCAT::InitCol(PGLOBAL g)
return false;
} // 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. */
/***********************************************************************/
......
......@@ -1284,13 +1284,18 @@ void MYSQLCOL::ReadColumn(PGLOBAL g)
htrc("MySQL ReadColumn: name=%s buf=%s\n", Name, buf);
// 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
p = strcat(strcpy(tim, "1970-01-01 "), buf);
else
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 {
if (Nullable)
Value->SetNull(true);
......
......@@ -1083,7 +1083,7 @@ void ODBCCOL::AllocateBuffers(PGLOBAL g, int rows)
} // endelse
if (rows > 1)
StrLen = (SQLLEN *)PlugSubAlloc(g, NULL, rows * sizeof(int));
StrLen = (SQLLEN *)PlugSubAlloc(g, NULL, rows * sizeof(SQLLEN));
} // end of AllocateBuffers
......
......@@ -117,7 +117,7 @@ TABLE_SHARE *GetTableShare(PGLOBAL g, THD *thd, const char *db,
/************************************************************************/
/* 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,
const char *name, bool& info)
......@@ -128,8 +128,8 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
static XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC,
FLD_LENGTH, FLD_SCALE, FLD_RADIX, FLD_NULL,
FLD_REM, FLD_NO, FLD_CHARSET};
static unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 256, 32, 32};
char *fld, *fmt;
static unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 0, 32, 32};
char *fld, *fmt, v;
int i, n, ncol = sizeof(buftyp) / sizeof(int);
int len, type, prec;
bool mysql;
......@@ -164,6 +164,7 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
// Some columns must be renamed
for (i = 0, crp = qrp->Colresp; crp; crp = crp->Next)
switch (++i) {
case 2: crp->Nulls = (char*)PlugSubAlloc(g, NULL, n); break;
case 10: crp->Name = "Date_fmt"; break;
case 11: crp->Name = "Collation"; break;
} // endswitch i
......@@ -181,8 +182,9 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
crp = qrp->Colresp; // Column_Name
fld = (char *)fp->field_name;
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));
qrp = NULL;
break;
......@@ -190,6 +192,14 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
crp = crp->Next; // Data_Type
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->Kdata->SetValue(GetTypeName(type), i);
......@@ -212,10 +222,10 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
crp->Kdata->SetValue(len, i);
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);
prec = (type == TYPE_FLOAT) ? fp->decimals() : 0;
crp = crp->Next; // Scale
crp->Kdata->SetValue(prec, i);
......@@ -233,7 +243,7 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
else
crp->Kdata->Reset(i);
crp = crp->Next; // New
crp = crp->Next; // New (date format)
crp->Kdata->SetValue((fmt) ? fmt : (char*) "", i);
crp = crp->Next; // New (charset)
......
......@@ -95,7 +95,8 @@ bool user_connect::user_init()
PDBUSER dup= NULL;
// 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
if (!g || !g->Sarea || PlugSubSet(g, g->Sarea, g->Sarea_Size)
......
......@@ -191,7 +191,7 @@ void VALBLK::ChkIndx(int n)
void VALBLK::ChkTyp(PVAL v)
{
if (Check && Type != v->GetType()) {
if (Check && (Type != v->GetType() || Unsigned != v->IsUnsigned())) {
PGLOBAL& g = Global;
strcpy(g->Message, MSG(VALTYPE_NOMATCH));
longjmp(g->jumper[g->jump_level], Type);
......@@ -201,7 +201,7 @@ void VALBLK::ChkTyp(PVAL v)
void VALBLK::ChkTyp(PVBLK vb)
{
if (Check && Type != vb->GetType()) {
if (Check && (Type != vb->GetType() || Unsigned != vb->IsUnsigned())) {
PGLOBAL& g = Global;
strcpy(g->Message, MSG(VALTYPE_NOMATCH));
longjmp(g->jumper[g->jump_level], Type);
......@@ -304,28 +304,44 @@ void TYPBLK<TYPE>::SetValue(PSZ p, int n)
longjmp(g->jumper[g->jump_level], Type);
} // 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);
} // end of SetValue
template <class TYPE>
ulonglong TYPBLK<TYPE>::MaxVal(void) {DBUG_ASSERT(false); return 0;}
template <>
int TYPBLK<int>::GetTypedValue(PSZ p) {return atol(p);}
template <>
uint TYPBLK<uint>::GetTypedValue(PSZ p) {return (unsigned)atol(p);}
ulonglong TYPBLK<short>::MaxVal(void) {return INT_MAX16;}
template <>
short TYPBLK<short>::GetTypedValue(PSZ p) {return (short)atoi(p);}
ulonglong TYPBLK<ushort>::MaxVal(void) {return UINT_MAX16;}
template <>
ushort TYPBLK<ushort>::GetTypedValue(PSZ p) {return (ushort)atoi(p);}
ulonglong TYPBLK<int>::MaxVal(void) {return INT_MAX32;}
template <>
longlong TYPBLK<longlong>::GetTypedValue(PSZ p) {return atoll(p);}
ulonglong TYPBLK<uint>::MaxVal(void) {return UINT_MAX32;}
template <>
ulonglong TYPBLK<ulonglong>::GetTypedValue(PSZ p) {return (unsigned)atoll(p);}
ulonglong TYPBLK<char>::MaxVal(void) {return INT_MAX8;}
template <>
double TYPBLK<double>::GetTypedValue(PSZ p) {return atof(p);}
ulonglong TYPBLK<uchar>::MaxVal(void) {return UINT_MAX8;}
template <>
char TYPBLK<char>::GetTypedValue(PSZ p) {return (char)atoi(p);}
ulonglong TYPBLK<longlong>::MaxVal(void) {return INT_MAX64;}
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. */
......@@ -557,12 +573,36 @@ char *CHRBLK::GetCharValue(int n)
return (char *)GetValPtrEx(n);
} // 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. */
/***********************************************************************/
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
/***********************************************************************/
......@@ -570,7 +610,7 @@ short CHRBLK::GetShortValue(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
/***********************************************************************/
......@@ -578,7 +618,11 @@ ushort CHRBLK::GetUShortValue(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
/***********************************************************************/
......@@ -586,7 +630,7 @@ int CHRBLK::GetIntValue(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
/***********************************************************************/
......@@ -594,7 +638,11 @@ uint CHRBLK::GetUIntValue(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
/***********************************************************************/
......@@ -602,8 +650,8 @@ longlong CHRBLK::GetBigintValue(int n)
/***********************************************************************/
ulonglong CHRBLK::GetUBigintValue(int n)
{
return (unsigned)atoll((char *)GetValPtrEx(n));
} // end of GetBigintValue
return CharToNumber((char*)GetValPtr(n), Long, ULONGLONG_MAX, true);
} // end of GetUBigintValue
/***********************************************************************/
/* Return the value of the nth element converted to double. */
......@@ -613,22 +661,6 @@ double CHRBLK::GetFloatValue(int n)
return atof((char *)GetValPtrEx(n));
} // 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. */
/***********************************************************************/
......@@ -869,6 +901,86 @@ void STRBLK::Init(PGLOBAL g, bool check)
Global = g;
} // 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. */
/***********************************************************************/
......
......@@ -45,9 +45,12 @@ class VALBLK : public BLOCK {
{if (To_Nulls) {To_Nulls[n] = (b) ? '*' : 0;}}
virtual bool IsNull(int n) {return To_Nulls && To_Nulls[n];}
virtual void SetNullable(bool b);
virtual bool IsUnsigned(void) {return Unsigned;}
virtual void Init(PGLOBAL g, bool check) = 0;
virtual int GetVlen(void) = 0;
virtual PSZ GetCharValue(int n);
virtual char GetTinyValue(int n) = 0;
virtual uchar GetUTinyValue(int n) = 0;
virtual short GetShortValue(int n) = 0;
virtual ushort GetUShortValue(int n) = 0;
virtual int GetIntValue(int n) = 0;
......@@ -55,8 +58,6 @@ class VALBLK : public BLOCK {
virtual longlong GetBigintValue(int n) = 0;
virtual ulonglong GetUBigintValue(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 Reset(int n) = 0;
virtual bool SetFormat(PGLOBAL g, PSZ fmt, int len, int year = 0);
......@@ -123,6 +124,8 @@ class TYPBLK : public VALBLK {
virtual void Init(PGLOBAL g, bool check);
virtual int GetVlen(void) {return sizeof(TYPE);}
//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 ushort GetUShortValue(int n) {return (ushort)Typp[n];}
virtual int GetIntValue(int n) {return (int)Typp[n];}
......@@ -130,8 +133,6 @@ class TYPBLK : public VALBLK {
virtual longlong GetBigintValue(int n) {return (longlong)Typp[n];}
virtual ulonglong GetUBigintValue(int n) {return (ulonglong)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;}
// Methods
......@@ -168,9 +169,9 @@ class TYPBLK : public VALBLK {
protected:
// Specialized functions
static ulonglong MaxVal(void);
TYPE GetTypedValue(PVAL vp);
TYPE GetTypedValue(PVBLK blk, int n);
TYPE GetTypedValue(PSZ s);
// Members
TYPE* const &Typp;
......@@ -189,6 +190,8 @@ class CHRBLK : public VALBLK {
virtual void Init(PGLOBAL g, bool check);
virtual int GetVlen(void) {return Long;}
virtual PSZ GetCharValue(int n);
virtual char GetTinyValue(int n);
virtual uchar GetUTinyValue(int n);
virtual short GetShortValue(int n);
virtual ushort GetUShortValue(int n);
virtual int GetIntValue(int n);
......@@ -196,8 +199,6 @@ class CHRBLK : public VALBLK {
virtual longlong GetBigintValue(int n);
virtual ulonglong GetUBigintValue(int n);
virtual double GetFloatValue(int n);
virtual char GetTinyValue(int n);
virtual uchar GetUTinyValue(int n);
virtual void Reset(int n);
virtual void SetPrec(int p) {Ci = (p != 0);}
virtual bool IsCi(void) {return Ci;}
......@@ -242,15 +243,15 @@ class STRBLK : public VALBLK {
virtual void Init(PGLOBAL g, bool check);
virtual int GetVlen(void) {return sizeof(PSZ);}
virtual PSZ GetCharValue(int n) {return Strp[n];}
virtual short GetShortValue(int n) {return (short)atoi(Strp[n]);}
virtual ushort GetUShortValue(int n) {return (ushort)atoi(Strp[n]);}
virtual int GetIntValue(int n) {return atol(Strp[n]);}
virtual uint GetUIntValue(int n) {return (unsigned)atol(Strp[n]);}
virtual longlong GetBigintValue(int n) {return atoll(Strp[n]);}
virtual ulonglong GetUBigintValue(int n) {return (unsigned)atoll(Strp[n]);}
virtual char GetTinyValue(int n);
virtual uchar GetUTinyValue(int n);
virtual short GetShortValue(int n);
virtual ushort GetUShortValue(int n);
virtual int GetIntValue(int 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 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;}
// Methods
......
......@@ -90,6 +90,56 @@ PSZ strlwr(PSZ s);
}
#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. */
/***********************************************************************/
......@@ -479,6 +529,36 @@ TYPVAL<TYPE>::TYPVAL(TYPE n, int type, int prec, bool un)
Prec = prec;
} // 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. */
/***********************************************************************/
......@@ -556,45 +636,29 @@ uchar TYPVAL<uchar>::GetTypedValue(PVAL valp)
/* TYPVAL SetValue: convert chars extracted from a line to TYPE value.*/
/***********************************************************************/
template <class TYPE>
void TYPVAL<TYPE>::SetValue_char(char *p, int n)
{
char *p2, buf[32];
bool minus = false;
for (p2 = p + n; p < p2 && *p == ' '; p++) ;
for (Tval = 0, minus = false; p < p2; p++)
switch (*p) {
case '-':
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;
bool TYPVAL<TYPE>::SetValue_char(char *p, int n)
{
bool rc, minus;
ulonglong maxval = MaxVal();
ulonglong val = CharToNumber(p, n, maxval, Unsigned, &minus, &rc);
if (minus && val < maxval)
Tval = (TYPE)(-(signed)val);
else
Tval = (TYPE)val;
if (trace > 1)
if (trace > 1) {
char buf[64];
htrc(strcat(strcat(strcpy(buf, " setting %s to: "), Fmt), "\n"),
GetTypeName(Type), Tval);
} // endif trace
Null = false;
return rc;
} // end of SetValue
template <>
void TYPVAL<double>::SetValue_char(char *p, int n)
bool TYPVAL<double>::SetValue_char(char *p, int n)
{
if (p) {
char buf[32];
......@@ -615,6 +679,7 @@ void TYPVAL<double>::SetValue_char(char *p, int n)
Null = Nullable;
} // endif p
return false;
} // end of SetValue
/***********************************************************************/
......@@ -624,7 +689,7 @@ template <class TYPE>
void TYPVAL<TYPE>::SetValue_psz(PSZ s)
{
if (s) {
Tval = GetTypedValue(s);
SetValue_char(s, (int)strlen(s));
Null = false;
} else {
Reset();
......@@ -633,25 +698,6 @@ void TYPVAL<TYPE>::SetValue_psz(PSZ s)
} // 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. */
/***********************************************************************/
......@@ -668,7 +714,7 @@ int TYPVAL<int>::GetTypedValue(PVBLK blk, int n)
template <>
uint TYPVAL<uint>::GetTypedValue(PVBLK blk, int n)
{return (unsigned)blk->GetIntValue(n);}
{return blk->GetUIntValue(n);}
template <>
short TYPVAL<short>::GetTypedValue(PVBLK blk, int n)
......@@ -676,7 +722,7 @@ short TYPVAL<short>::GetTypedValue(PVBLK blk, int n)
template <>
ushort TYPVAL<ushort>::GetTypedValue(PVBLK blk, int n)
{return (unsigned)blk->GetShortValue(n);}
{return blk->GetUShortValue(n);}
template <>
longlong TYPVAL<longlong>::GetTypedValue(PVBLK blk, int n)
......@@ -684,7 +730,7 @@ longlong TYPVAL<longlong>::GetTypedValue(PVBLK blk, int n)
template <>
ulonglong TYPVAL<ulonglong>::GetTypedValue(PVBLK blk, int n)
{return (unsigned)blk->GetBigintValue(n);}
{return blk->GetUBigintValue(n);}
template <>
double TYPVAL<double>::GetTypedValue(PVBLK blk, int n)
......@@ -696,7 +742,7 @@ char TYPVAL<char>::GetTypedValue(PVBLK blk, int n)
template <>
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. */
......@@ -830,6 +876,8 @@ bool TYPVAL<TYPE>::IsEqual(PVAL vp, bool chktype)
return true;
else if (chktype && Type != vp->GetType())
return false;
else if (chktype && Unsigned != vp->IsUnsigned())
return false;
else if (Null || vp->IsNull())
return false;
else
......@@ -931,6 +979,82 @@ TYPVAL<PSZ>::TYPVAL(PGLOBAL g, PSZ s, int n, int c)
Ci = (c != 0);
} // 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. */
/***********************************************************************/
......@@ -952,9 +1076,13 @@ bool TYPVAL<PSZ>::SetValue_pval(PVAL valp, bool chktype)
/***********************************************************************/
/* 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) {
rc = n > Len;
if ((n = min(n, Len))) {
strncpy(Strp, p, n);
......@@ -973,10 +1101,12 @@ void TYPVAL<PSZ>::SetValue_char(char *p, int n)
Null = false;
} else {
rc = false;
Reset();
Null = Nullable;
} // endif p
return rc;
} // end of SetValue_char
/***********************************************************************/
......@@ -1179,53 +1309,6 @@ char *TYPVAL<PSZ>::GetCharString(char *p)
return Strp;
} // 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. */
/***********************************************************************/
......@@ -1353,11 +1436,7 @@ void DTVAL::SetTimeShift(void)
} // end of SetTimeShift
/***********************************************************************/
/* 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. */
/***********************************************************************/
// Added by Alexander Barkov
static void TIME_to_localtime(struct tm *tm, const MYSQL_TIME *ltime)
{
bzero(tm, sizeof(*tm));
......@@ -1369,7 +1448,7 @@ static void TIME_to_localtime(struct tm *tm, const MYSQL_TIME *ltime)
tm->tm_sec= ltime->second;
}
// Added by Alexander Barkov
static struct tm *gmtime_mysql(const time_t *timep, struct tm *tm)
{
MYSQL_TIME ltime;
......@@ -1378,7 +1457,11 @@ static struct tm *gmtime_mysql(const time_t *timep, struct tm *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 *datm;
......@@ -1401,12 +1484,7 @@ struct tm *DTVAL::GetGmTime(struct tm *tm_buffer)
return datm;
} // end of GetGmTime
/***********************************************************************/
/* 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. */
/***********************************************************************/
// Added by Alexander Barkov
static time_t mktime_mysql(struct tm *ptm)
{
MYSQL_TIME ltime;
......@@ -1417,6 +1495,11 @@ static time_t mktime_mysql(struct tm *ptm)
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)
{
int n, y = ptm->tm_year;
......@@ -1573,8 +1656,10 @@ bool DTVAL::SetValue_pval(PVAL valp, bool chktype)
/***********************************************************************/
/* 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) {
char *p2;
int ndv;
......@@ -1583,7 +1668,9 @@ void DTVAL::SetValue_char(char *p, int n)
// Trim trailing blanks
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);
Sdate[n] = '\0';
......@@ -1595,8 +1682,9 @@ void DTVAL::SetValue_char(char *p, int n)
Null = false;
} else
TYPVAL<int>::SetValue_char(p, n);
rc = TYPVAL<int>::SetValue_char(p, n);
return rc;
} // end of SetValue
/***********************************************************************/
......@@ -1696,6 +1784,7 @@ char *DTVAL::ShowValue(char *buf, int len)
} // end of ShowValue
#if 0 // Not used by CONNECT
/***********************************************************************/
/* Returns a member of the struct tm representation of the date. */
/***********************************************************************/
......@@ -1745,6 +1834,7 @@ bool DTVAL::WeekNum(PGLOBAL g, int& nval)
// Everything should be Ok
return false;
} // end of WeekNum
#endif // 0
/***********************************************************************/
/* FormatValue: This function set vp (a STRING value) to the string */
......
......@@ -16,11 +16,6 @@
#include "assert.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. */
/***********************************************************************/
......@@ -55,6 +50,8 @@ DllExport bool IsTypeNum(int type);
DllExport PVAL AllocateValue(PGLOBAL, PVAL, int = TYPE_VOID, int = 0);
DllExport PVAL AllocateValue(PGLOBAL, int, int len = 0, int prec = 0,
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. */
......@@ -96,7 +93,7 @@ class DllExport VALUE : public BLOCK {
// Methods
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(char c) {assert(false);}
virtual void SetValue(uchar c) {assert(false);}
......@@ -112,11 +109,6 @@ class DllExport VALUE : public BLOCK {
virtual bool GetBinValue(void *buf, int buflen, bool go) = 0;
virtual char *ShowValue(char *buf, int len = 0) = 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 FormatValue(PVAL vp, char *fmt) = 0;
......@@ -169,7 +161,7 @@ class DllExport TYPVAL : public VALUE {
// Methods
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(char 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 {
virtual bool GetBinValue(void *buf, int buflen, bool go);
virtual char *ShowValue(char *buf, int);
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 SetConstFormat(PGLOBAL, FORMAT&);
virtual bool FormatValue(PVAL vp, char *fmt);
......@@ -201,9 +188,10 @@ class DllExport TYPVAL : public VALUE {
TYPVAL(void) : VALUE(TYPE_ERROR) {}
// Specialized functions
TYPE GetTypedValue(PVAL vp);
TYPE GetTypedValue(PVBLK blk, int n);
TYPE GetTypedValue(PSZ s);
static ulonglong MaxVal(void);
TYPE GetTypedValue(PVAL vp);
TYPE GetTypedValue(PVBLK blk, int n);
// TYPE GetTypedValue(PSZ s);
// Members
TYPE Tval;
......@@ -227,21 +215,21 @@ class DllExport TYPVAL<PSZ>: public VALUE {
virtual int GetValPrec() {return (Ci) ? 1 : 0;}
virtual int GetSize(void) {return (Strp) ? strlen(Strp) : 0;}
virtual PSZ GetCharValue(void) {return Strp;}
virtual char GetTinyValue(void) {return (char)atoi(Strp);}
virtual uchar GetUTinyValue(void) {return (uchar)atoi(Strp);}
virtual short GetShortValue(void) {return (short)atoi(Strp);}
virtual ushort GetUShortValue(void) {return (ushort)atoi(Strp);}
virtual int GetIntValue(void) {return atol(Strp);}
virtual uint GetUIntValue(void) {return (uint)atol(Strp);}
virtual longlong GetBigintValue(void) {return atoll(Strp);}
virtual ulonglong GetUBigintValue(void) {return (ulonglong)atoll(Strp);}
virtual char GetTinyValue(void);
virtual uchar GetUTinyValue(void);
virtual short GetShortValue(void);
virtual ushort GetUShortValue(void);
virtual int GetIntValue(void);
virtual uint GetUIntValue(void);
virtual longlong GetBigintValue(void);
virtual ulonglong GetUBigintValue(void);
virtual double GetFloatValue(void) {return atof(Strp);}
virtual void *GetTo_Val(void) {return Strp;}
virtual void SetPrec(int prec) {Ci = prec != 0;}
// Methods
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_pvblk(PVBLK blk, int n);
virtual void SetValue(char c);
......@@ -257,23 +245,10 @@ class DllExport TYPVAL<PSZ>: public VALUE {
virtual bool GetBinValue(void *buf, int buflen, bool go);
virtual char *ShowValue(char *buf, int);
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 FormatValue(PVAL vp, char *fmt);
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
PSZ Strp;
bool Ci; // true if case insensitive
......@@ -295,7 +270,7 @@ class DllExport DTVAL : public TYPVAL<int> {
// Implementation
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_pvblk(PVBLK blk, int n);
virtual char *GetCharString(char *p);
......@@ -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, PVAL valp);
bool IsFormatted(void) {return Pdtp != NULL;}
bool GetTmMember(OPVAL op, int& mval);
bool DateDiff(DTVAL *dtp, OPVAL op, int& tdif);
// bool GetTmMember(OPVAL op, int& mval);
// bool DateDiff(DTVAL *dtp, OPVAL op, int& tdif);
bool MakeTime(struct tm *ptm);
static void SetTimeShift(void);
static int GetShift(void) {return Shift;}
// Methods
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 *);
......
......@@ -134,6 +134,7 @@ bool CONSTANT::Compare(PXOB xp)
} // end of Compare
#if 0
/***********************************************************************/
/* Rephrase: temporary implementation used by PlugRephraseSQL. */
/***********************************************************************/
......@@ -166,6 +167,7 @@ bool CONSTANT::Rephrase(PGLOBAL g, PSZ work)
return false;
} // end of Rephrase
#endif // 0
/***********************************************************************/
/* Make file output of a constant object. */
......
......@@ -124,7 +124,7 @@ class DllExport CONSTANT : public XOBJECT {
{return Value->SetConstFormat(g, fmt);}
virtual int CheckSpcCol(PTDB, int) {return 1;}
void Convert(PGLOBAL g, int newtype);
bool Rephrase(PGLOBAL g, PSZ work);
// bool Rephrase(PGLOBAL g, PSZ work);
void SetValue(PVAL vp) {Value = vp;}
virtual bool VerifyColumn(PTBX txp) {return true;}
virtual bool VerifyTdb(PTDB& tdbp) {return true;}
......
......@@ -242,6 +242,7 @@ class TDBCAT : public TDBASE {
virtual int GetRecpos(void) {return N;}
virtual int GetProgCur(void) {return N;}
virtual int RowNumber(PGLOBAL g, bool b = false) {return N + 1;}
virtual bool SetRecpos(PGLOBAL g, int recpos);
// Database routines
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