diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 3db86b8e607..5adf8747841 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -158,7 +158,7 @@ extern "C" char nmfile[]; extern "C" char pdebug[]; extern "C" { - char version[]= "Version 1.01.0005 April 27, 2013"; + char version[]= "Version 1.01.0006 Mai 21, 2013"; #if defined(XMSG) char msglang[]; // Default message language diff --git a/storage/connect/mysql-test/connect/r/xml.result b/storage/connect/mysql-test/connect/r/xml.result index 44fab646dcf..67fcc5f121e 100644 --- a/storage/connect/mysql-test/connect/r/xml.result +++ b/storage/connect/mysql-test/connect/r/xml.result @@ -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) - + ÀÁÂÃ diff --git a/storage/connect/tabmysql.cpp b/storage/connect/tabmysql.cpp index 8b97a592d93..f06e8e9bd57 100644 --- a/storage/connect/tabmysql.cpp +++ b/storage/connect/tabmysql.cpp @@ -900,6 +900,29 @@ PCOL TDBMYSQL::MakeFieldColumn(PGLOBAL g, char *name) return colp; } // end of MakeFieldColumn +/***********************************************************************/ +/* Called by Pivot tables to find default column names in a View */ +/* as the name of last field not equal to the passed name. */ +/***********************************************************************/ +char *TDBMYSQL::FindFieldColumn(char *name) + { + int n; + MYSQL_FIELD *fld; + char *cp = NULL; + + for (n = Myc.m_Fields - 1; n >= 0; n--) { + fld = &Myc.m_Res->fields[n]; + + if (!name || stricmp(name, fld->name)) { + cp = fld->name; + break; + } // endif name + + } // endfor n + + return cp; + } // end of FindFieldColumn + /***********************************************************************/ /* Data Base read routine for MYSQL access method. */ /***********************************************************************/ diff --git a/storage/connect/tabmysql.h b/storage/connect/tabmysql.h index 5d8f32e9f21..24f8c4cdef2 100644 --- a/storage/connect/tabmysql.h +++ b/storage/connect/tabmysql.h @@ -90,6 +90,7 @@ class TDBMYSQL : public TDBASE { // Specific routines bool SetColumnRanks(PGLOBAL g); PCOL MakeFieldColumn(PGLOBAL g, char *name); + PSZ FindFieldColumn(char *name); protected: // Internal functions diff --git a/storage/connect/tabpivot.cpp b/storage/connect/tabpivot.cpp index 867689626f9..916a3c2584e 100644 --- a/storage/connect/tabpivot.cpp +++ b/storage/connect/tabpivot.cpp @@ -161,6 +161,42 @@ PCOL TDBPIVOT::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) return colp; } // end of MakeCol +/***********************************************************************/ +/* Find default fonction and pivot columns. */ +/***********************************************************************/ +bool TDBPIVOT::FindDefaultColumns(PGLOBAL g) + { + PCOLDEF cdp; + PTABDEF defp = Tdbp->GetDef(); + + if (!Fncol) { + for (cdp = defp->GetCols(); cdp; cdp = cdp->GetNext()) + if (!Picol || stricmp(Picol, cdp->GetName())) + Fncol = cdp->GetName(); + + if (!Fncol) { + strcpy(g->Message, MSG(NO_DEF_FNCCOL)); + return true; + } // endif Fncol + + } // endif Fncol + + if (!Picol) { + // Find default Picol as the last one not equal to Fncol + for (cdp = defp->GetCols(); cdp; cdp = cdp->GetNext()) + if (stricmp(Fncol, cdp->GetName())) + Picol = cdp->GetName(); + + if (!Picol) { + strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); + return true; + } // endif Picol + + } // endif Picol + + return false; + } // end of FindDefaultColumns + /***********************************************************************/ /* Prepare the source table Query. */ /***********************************************************************/ @@ -174,69 +210,45 @@ bool TDBPIVOT::GetSourceTable(PGLOBAL g) if (!(Tdbp = GetSubTable(g, ((PPIVOTDEF)To_Def)->Tablep, true))) return true; - if (!Tdbp->IsView()) { + if (!GBdone) { + char *colist; PCOLDEF cdp; - PTABDEF defp = Tdbp->GetDef(); - if (!Fncol) { - for (cdp = defp->GetCols(); cdp; cdp = cdp->GetNext()) - if (!Picol || stricmp(Picol, cdp->GetName())) - Fncol = cdp->GetName(); + if (FindDefaultColumns(g)) + return true; - if (!Fncol) { - strcpy(g->Message, MSG(NO_DEF_FNCCOL)); - return true; - } // endif Fncol + // Locate the suballocated colist (size is not known yet) + *(colist = (char*)PlugSubAlloc(g, NULL, 0)) = 0; - } // endif Fncol + // Make the column list + for (cdp = To_Def->GetCols(); cdp; cdp = cdp->GetNext()) + if (!cdp->GetOffset()) + strcat(strcat(colist, cdp->GetName()), ", "); - if (!Picol) { - // Find default Picol as the last one not equal to Fncol - for (cdp = defp->GetCols(); cdp; cdp = cdp->GetNext()) - if (!Fncol || stricmp(Fncol, cdp->GetName())) - Picol = cdp->GetName(); + // Add the Pivot column at the end of the list + strcat(colist, Picol); - if (!Picol) { - strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); - return true; - } // endif Picol + // Now we know how much was suballocated + PlugSubAlloc(g, NULL, strlen(colist)); - } // endif Picol + // Locate the source string (size is not known yet) + Tabsrc = (char*)PlugSubAlloc(g, NULL, 0); - if (!GBdone) { - char *colist; + // Start making the definition + strcat(strcat(strcpy(Tabsrc, "SELECT "), colist), ", "); - // Locate the suballocated colist (size is not known yet) - *(colist = (char*)PlugSubAlloc(g, NULL, 0)) = 0; + // Make it suitable for Pivot by doing the group by + strcat(strcat(Tabsrc, Function), "("); + strcat(strcat(strcat(Tabsrc, Fncol), ") "), Fncol); + strcat(strcat(Tabsrc, " FROM "), Tabname); + strcat(strcat(Tabsrc, " GROUP BY "), colist); - // Make the column list - for (cdp = To_Def->GetCols(); cdp; cdp = cdp->GetNext()) - if (!cdp->GetOffset()) - strcat(strcat(colist, cdp->GetName()), ", "); - - // Add the Pivot column at the end of the list - strcat(colist, Picol); - - // Now we know how much was suballocated - PlugSubAlloc(g, NULL, strlen(colist)); - - // Locate the source string (size is not known yet) - Tabsrc = (char*)PlugSubAlloc(g, NULL, 0); - - // Start making the definition - strcat(strcat(strcpy(Tabsrc, "SELECT "), colist), ", "); - - // Make it suitable for Pivot by doing the group by - strcat(strcat(Tabsrc, Function), "("); - strcat(strcat(strcat(Tabsrc, Fncol), ") "), Fncol); - strcat(strcat(Tabsrc, " FROM "), Tabname); - strcat(strcat(Tabsrc, " GROUP BY "), colist); - - // Now we know how much was suballocated - PlugSubAlloc(g, NULL, strlen(Tabsrc)); - } // endif !GBdone + if (Tdbp->IsView()) // Until MariaDB bug is fixed + strcat(strcat(Tabsrc, " ORDER BY "), colist); - } // endif IsView + // Now we know how much was suballocated + PlugSubAlloc(g, NULL, strlen(Tabsrc)); + } // endif !GBdone } else if (!Tabsrc) { strcpy(g->Message, MSG(SRC_TABLE_UNDEF)); @@ -263,6 +275,10 @@ bool TDBPIVOT::GetSourceTable(PGLOBAL g) bool TDBPIVOT::MakePivotColumns(PGLOBAL g) { if (!Tdbp->IsView()) { + // This was not done yet if GBdone is true + if (FindDefaultColumns(g)) + return true; + // Now it is time to allocate the pivot and function columns if (!(Fcolp = Tdbp->ColDB(g, Fncol, 0))) { // Function column not found in table @@ -309,36 +325,15 @@ bool TDBPIVOT::MakeViewColumns(PGLOBAL g) } else tdbp = (PTDBMY)Tdbp; - if (!Fncol || !Picol) { - strcpy(g->Message, "Missing Function or Pivot column"); + if (!Fncol && !(Fncol = tdbp->FindFieldColumn(Picol))) { + strcpy(g->Message, MSG(NO_DEF_FNCCOL)); return true; - } // endif -#if 0 - if (!Fncol) { - for (crp = qryp->Colresp; crp; crp = crp->Next) - if (!Picol || stricmp(Picol, crp->Name)) - Fncol = crp->Name; - - if (!Fncol) { - strcpy(g->Message, MSG(NO_DEF_FNCCOL)); - return true; - } // endif Fncol - } // endif Fncol - if (!Picol) { - // Find default Picol as the last one not equal to Fncol - for (crp = qryp->Colresp; crp; crp = crp->Next) - if (!Fncol || stricmp(Fncol, crp->Name)) - Picol = crp->Name; - - if (!Picol) { - strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); - return true; - } // endif Picol - + if (!Picol && !(Picol = tdbp->FindFieldColumn(Fncol))) { + strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); + return true; } // endif Picol -#endif // 0 // Now it is time to allocate the pivot and function columns if (!(Fcolp = tdbp->MakeFieldColumn(g, Fncol))) diff --git a/storage/connect/tabpivot.h b/storage/connect/tabpivot.h index e869d1cae6c..1617801298b 100644 --- a/storage/connect/tabpivot.h +++ b/storage/connect/tabpivot.h @@ -78,6 +78,7 @@ class TDBPIVOT : public TDBPRX { protected: // Internal routines + bool FindDefaultColumns(PGLOBAL g); bool GetSourceTable(PGLOBAL g); bool MakePivotColumns(PGLOBAL g); bool MakeViewColumns(PGLOBAL g);