summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--storage/connect/ha_connect.cc49
-rw-r--r--storage/connect/mycat.cc33
-rw-r--r--storage/connect/tabmysql.cpp2
-rw-r--r--storage/connect/tabutil.cpp10
-rw-r--r--storage/connect/tabutil.h2
5 files changed, 58 insertions, 38 deletions
diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc
index 5adf8747841..38b5e74c38c 100644
--- a/storage/connect/ha_connect.cc
+++ b/storage/connect/ha_connect.cc
@@ -680,6 +680,10 @@ char *ha_connect::GetStringOption(char *opname, char *sdef)
// Return the handler default value
if (!stricmp(opname, "Dbname") || !stricmp(opname, "Database"))
opval= (char*)GetDBName(NULL); // Current database
+ else if (!stricmp(opname, "Type")) // Default type
+ opval= (!options) ? NULL :
+ (options->srcdef) ? "MYSQL" :
+ (options->tabname) ? "PROXY" : "DOS";
else if (!stricmp(opname, "User")) // Connected user
opval= table->in_use->main_security_ctx.user;
else if (!stricmp(opname, "Host")) // Connected user host
@@ -2671,7 +2675,9 @@ int ha_connect::delete_all_rows()
bool ha_connect::check_privileges(THD *thd, PTOS options)
{
if (!options->type) {
- if (options->tabname)
+ if (options->srcdef)
+ options->type= "MYSQL";
+ else if (options->tabname)
options->type= "PROXY";
else
options->type= "DOS";
@@ -3336,7 +3342,7 @@ static bool add_field(String *sql, const char *field_name, const char *type,
if (len) {
error|= sql->append('(');
error|= sql->append_ulonglong(len);
- if (dec) {
+ if (dec || !strcmp(type, "DOUBLE")) {
error|= sql->append(',');
error|= sql->append_ulonglong(dec);
}
@@ -3379,7 +3385,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
#endif // WIN32
int port= 0, hdr= 0, mxr= 0, b= 0;
uint tm, fnc= FNC_NO, supfnc= (FNC_NO | FNC_COL);
- bool ok= false, dbf= false;
+ bool bif, ok= false, dbf= false;
TABTYPE ttp= TAB_UNDEF;
MEM_ROOT *mem= thd->mem_root;
PQRYRES qrp;
@@ -3546,6 +3552,11 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
ok= false;
} // endif supfnc
+ if (src && fnc != FNC_NO) {
+ strcpy(g->Message, "Cannot make catalog table from srcdef");
+ ok= false;
+ } // endif src
+
// Here we should test the flag column options when
// this function is called in case of CREATE .. SELECT
@@ -3561,7 +3572,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
else
return HA_ERR_INTERNAL_ERROR; // Should never happen
- if (src && fnc == FNC_NO)
+ if (src)
qrp= SrcColumns(g, host, db, user, pwd, src, port);
else switch (ttp) {
case TAB_DBF:
@@ -3606,7 +3617,12 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
case TAB_PRX:
case TAB_TBL:
case TAB_XCL:
- qrp= TabColumns(g, thd, db, tab, fnc == FNC_COL);
+ bif= fnc == FNC_COL;
+ qrp= TabColumns(g, thd, db, tab, bif);
+
+ if (!qrp && bif && fnc != FNC_COL) // tab is a view
+ qrp= MyColumns(g, host, db, user, pwd, tab, NULL, port, false);
+
break;
default:
strcpy(g->Message, "System error during assisted discovery");
@@ -3624,9 +3640,10 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
cnm= encode(g, crp->Name);
type= PLGtoMYSQLtype(crp->Type, dbf);
len= crp->Length;
+ dec= crp->Prec;
// Now add the field
- if (add_field(&sql, cnm, type, len, 0, NOT_NULL_FLAG, 0))
+ if (add_field(&sql, cnm, type, len, dec, NOT_NULL_FLAG, 0))
b= HA_ERR_OUT_OF_MEM;
} // endfor crp
@@ -3780,6 +3797,9 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
} // endif charset
+ if (xtrace)
+ printf("s_init: %.*s\n", sql.length(), sql.ptr());
+
if (!b)
b= table_s->init_from_sql_statement_string(thd, true,
sql.ptr(), sql.length());
@@ -3837,18 +3857,11 @@ int ha_connect::create(const char *name, TABLE *table_arg,
// Check table type
if (type == TAB_UNDEF) {
- if (!options->tabname) {
- strcpy(g->Message, "No table_type. Will be set to DOS");
- push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0, g->Message);
- type= TAB_DOS;
- options->type= "DOS";
- } else {
- strcpy(g->Message, "No table_type. Will be set to PROXY");
- push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0, g->Message);
- type= TAB_PRX;
- options->type= "PROXY";
- } // endif fnc
-
+ options->type= (options->srcdef) ? "MYSQL" :
+ (options->tabname) ? "PROXY" : "DOS";
+ type= GetTypeID(options->type);
+ sprintf(g->Message, "No table_type. Will be set to %s", options->type);
+ push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0, g->Message);
} else if (type == TAB_NIY) {
sprintf(g->Message, "Unsupported table type %s", options->type);
my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0));
diff --git a/storage/connect/mycat.cc b/storage/connect/mycat.cc
index b5767b02180..e243a706f01 100644
--- a/storage/connect/mycat.cc
+++ b/storage/connect/mycat.cc
@@ -390,20 +390,23 @@ char *MYCAT::GetStringCatInfo(PGLOBAL g, PSZ what, PSZ sdef)
strcpy(sval, s);
} else if (!stricmp(what, "filename")) {
// Return default file name
- char *ftype= Hc->GetStringOption("Type", "dos");
+ char *ftype= Hc->GetStringOption("Type", "*");
int i, n;
- sval= (char*)PlugSubAlloc(g, NULL, strlen(Hc->GetTableName()) + 12);
- strcat(strcpy(sval, Hc->GetTableName()), ".");
- n= strlen(sval);
-
- // Fold ftype to lower case
- for (i= 0; i < 12; i++)
- if (!ftype[i]) {
- sval[n+i]= 0;
- break;
- } else
- sval[n+i]= tolower(ftype[i]);
+ if (IsFileType(GetTypeID(ftype))) {
+ sval= (char*)PlugSubAlloc(g, NULL, strlen(Hc->GetTableName()) + 12);
+ strcat(strcpy(sval, Hc->GetTableName()), ".");
+ n= strlen(sval);
+
+ // Fold ftype to lower case
+ for (i= 0; i < 12; i++)
+ if (!ftype[i]) {
+ sval[n+i]= 0;
+ break;
+ } else
+ sval[n+i]= tolower(ftype[i]);
+
+ } // endif FileType
} else
sval = NULL;
@@ -416,7 +419,7 @@ char *MYCAT::GetStringCatInfo(PGLOBAL g, PSZ what, PSZ sdef)
/***********************************************************************/
int MYCAT::GetColCatInfo(PGLOBAL g, PTABDEF defp)
{
- char *type= GetStringCatInfo(g, "Type", "DOS");
+ char *type= GetStringCatInfo(g, "Type", "*");
int i, loff, poff, nof, nlg;
void *field= NULL;
TABTYPE tc;
@@ -598,8 +601,8 @@ PRELDEF MYCAT::GetTableDesc(PGLOBAL g, LPCSTR name,
printf("GetTableDesc: name=%s am=%s\n", name, SVP(type));
// If not specified get the type of this table
- if (!type && !(type= Hc->GetStringOption("Type")))
- type= (Hc->GetStringOption("Tabname")) ? "PROXY" : "DOS";
+ if (!type)
+ type= Hc->GetStringOption("Type","*");
return MakeTableDesc(g, name, type);
} // end of GetTableDesc
diff --git a/storage/connect/tabmysql.cpp b/storage/connect/tabmysql.cpp
index f06e8e9bd57..1a19b4cbf33 100644
--- a/storage/connect/tabmysql.cpp
+++ b/storage/connect/tabmysql.cpp
@@ -790,7 +790,7 @@ bool TDBMYSQL::OpenDB(PGLOBAL g)
} // endif m_Res
#endif // 0
- if (Srcdef)
+ if (!m_Rc && Srcdef)
if (SetColumnRanks(g))
return true;
diff --git a/storage/connect/tabutil.cpp b/storage/connect/tabutil.cpp
index 5c4b428b09a..04271d1a460 100644
--- a/storage/connect/tabutil.cpp
+++ b/storage/connect/tabutil.cpp
@@ -120,7 +120,7 @@ TABLE_SHARE *GetTableShare(PGLOBAL g, THD *thd, const char *db,
/* of the object table that will be retrieved by GetData commands. */
/************************************************************************/
PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
- const char *name, bool info)
+ const char *name, bool& info)
{
static int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT,
TYPE_INT, TYPE_SHORT, TYPE_SHORT, TYPE_SHORT,
@@ -143,7 +143,9 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
if (!(s = GetTableShare(g, thd, db, name, mysql))) {
return NULL;
} else if (s->is_view) {
- strcpy(g->Message, "Cannot retreive Proxy columns from a view");
+ strcpy(g->Message, "Use MYSQL type to see columns from a view");
+ info = true; // To tell caller name is a view
+ free_table_share(s);
return NULL;
} else
n = s->fieldnames.count;
@@ -615,6 +617,8 @@ TDBTBC::TDBTBC(PPRXDEF tdp) : TDBCAT(tdp)
/***********************************************************************/
PQRYRES TDBTBC::GetResult(PGLOBAL g)
{
- return TabColumns(g, current_thd, Db, Tab, false);
+ bool b = false;
+
+ return TabColumns(g, current_thd, Db, Tab, b);
} // end of GetResult
diff --git a/storage/connect/tabutil.h b/storage/connect/tabutil.h
index 1405ef211c7..ddf6c2eb601 100644
--- a/storage/connect/tabutil.h
+++ b/storage/connect/tabutil.h
@@ -18,7 +18,7 @@ typedef class TDBTBC *PTDBTBC;
TABLE_SHARE *GetTableShare(PGLOBAL g, THD *thd, const char *db,
const char *name, bool& mysql);
PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
- const char *name, bool info);
+ const char *name, bool& info);
void Remove_tshp(PCATLG cat);