@@ -135,10 +135,12 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db,
135135 FLD_KEY, FLD_SCALE, FLD_RADIX, FLD_NULL,
136136 FLD_REM, FLD_NO, FLD_DEFAULT, FLD_EXTRA,
137137 FLD_CHARSET};
138- unsigned int length[] = {0 , 4 , 16 , 4 , 4 , 4 , 4 , 4 , 0 , 0 , 0 , 0 , 0 };
139- char *fld, *colname, *chset, *fmt, v, buf[128 ], uns[16 ], zero[16 ];
138+ // unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0};
139+ unsigned int length[] = {0 , 4 , 0 , 4 , 4 , 4 , 4 , 4 , 0 , 0 , 0 , 0 , 0 };
140+ char *fld, *colname, *chset, *fmt, v, buf[128 ], uns[16 ], zero[16 ];
140141 int i, n, nf, ncol = sizeof (buftyp) / sizeof (int );
141142 int len, type, prec, rc, k = 0 ;
143+ bool b;
142144 PQRYRES qrp;
143145 PCOLRES crp;
144146 MYSQLC myc;
@@ -157,7 +159,7 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db,
157159 /* Do an evaluation of the result size. */
158160 /* *******************************************************************/
159161 STRING cmd (g, 64 , " SHOW FULL COLUMNS FROM " );
160- bool b = cmd.Append ((PSZ)table);
162+ b = cmd.Append ((PSZ)table);
161163
162164 b |= cmd.Append (" FROM " );
163165 b |= cmd.Append ((PSZ)(db ? db : PlgGetUser (g)->DBName ));
@@ -232,11 +234,31 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db,
232234 fld = myc.GetCharField (1 );
233235 prec = 0 ;
234236 len = 0 ;
235- v = (chset && !strcmp (chset, " binary" )) ? ' B' : 0 ;
237+ // v = (chset && !strcmp(chset, "binary")) ? 'B' : 0;
238+ v = 0 ;
236239 *uns = 0 ;
237240 *zero = 0 ;
238-
239- switch ((nf = sscanf (fld, " %[^(](%d,%d" , buf, &len, &prec))) {
241+ b = false ;
242+
243+ if (!strnicmp (fld, " enum" , 4 )) {
244+ char *p2, *p1 = fld + 6 ; // to skip enum('
245+
246+ while (true ) {
247+ p2 = strchr (p1, ' \' ' );
248+ len = MY_MAX (len, p2 - p1);
249+ if (*++p2 != ' ,' ) break ;
250+ p1 = p2 + 2 ;
251+ } // endwhile
252+
253+ v = (len > 255 ) ? ' V' : 0 ;
254+ strcpy (buf, " enum" );
255+ b = true ;
256+ } else if (!strnicmp (fld, " set" , 3 )) {
257+ len = (int )strlen (fld) - 2 ;
258+ v = ' V' ;
259+ strcpy (buf, " set" );
260+ b = true ;
261+ } else switch ((nf = sscanf (fld, " %[^(](%d,%d" , buf, &len, &prec))) {
240262 case 3 :
241263 nf = sscanf (fld, " %[^(](%d,%d) %s %s" , buf, &len, &prec, uns, zero);
242264 break ;
@@ -271,7 +293,7 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db,
271293 colname, len);
272294 PushWarning (g, thd);
273295 v = ' V' ;
274- } else
296+ } else
275297 len = MY_MIN (len, 4096 );
276298
277299 } // endif type
@@ -286,6 +308,9 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db,
286308 default : crp->Nulls [i] = v; break ;
287309 } // endswitch nf
288310
311+ if (b) // enum or set
312+ nf = sscanf (fld, " %s " , buf); // get values
313+
289314 crp = crp->Next ; // Type_Name
290315 crp->Kdata ->SetValue (buf, i);
291316
0 commit comments