void FieldNormalizer::find_grn_normalizer(grn_obj *normalizer) { MRN_DBUG_ENTER_METHOD(); const CHARSET_INFO *charset_info = field_->charset(); const char *normalizer_name = NULL; const char *normalizer_spec = NULL; const char *default_normalizer_name = "NormalizerAuto"; if ((strcmp(charset_info->name, "utf8_general_ci") == 0) || (strcmp(charset_info->name, "utf8mb4_general_ci") == 0)) { normalizer_name = normalizer_spec = "NormalizerMySQLGeneralCI"; } else if ((strcmp(charset_info->name, "utf8_unicode_ci") == 0) || (strcmp(charset_info->name, "utf8mb4_unicode_ci") == 0)) { normalizer_name = normalizer_spec = "NormalizerMySQLUnicodeCI"; } else if ((strcmp(charset_info->name, "utf8_unicode_520_ci") == 0) || (strcmp(charset_info->name, "utf8mb4_unicode_520_ci") == 0)) { normalizer_name = normalizer_spec = "NormalizerMySQLUnicode520CI"; } else if ((strcmp(charset_info->name, "utf8mb4_0900_ai_ci") == 0)) { normalizer_name = "NormalizerMySQLUnicode900"; normalizer_spec = "NormalizerMySQLUnicode900('weight_level', 1)"; } else if ((strcmp(charset_info->name, "utf8mb4_0900_as_ci") == 0)) { normalizer_name = "NormalizerMySQLUnicode900"; normalizer_spec = "NormalizerMySQLUnicode900('weight_level', 2)"; } else if ((strcmp(charset_info->name, "utf8mb4_0900_as_cs") == 0)) { normalizer_name = "NormalizerMySQLUnicode900"; normalizer_spec = "NormalizerMySQLUnicode900('weight_level', 3)"; } else if ((strcmp(charset_info->name, "utf8mb4_ja_0900_as_cs") == 0)) { normalizer_name = "NormalizerMySQLUnicode900"; normalizer_spec = "NormalizerMySQLUnicode900('locale', 'ja', 'weight_level', 3)"; } else if ((strcmp(charset_info->name, "utf8mb4_ja_0900_as_cs_ks") == 0)) { normalizer_name = "NormalizerMySQLUnicode900"; normalizer_spec = "NormalizerMySQLUnicode900('locale', 'ja', 'weight_level', 4)"; } if (normalizer_name) { if (!grn_ctx_get(ctx_, normalizer_name, -1)) { char error_message[MRN_MESSAGE_BUFFER_SIZE]; snprintf(error_message, MRN_MESSAGE_BUFFER_SIZE, "%s normalizer isn't found for %s. " "Install groonga-normalizer-mysql normalizer. " "%s is used as fallback.", normalizer_name, charset_info->name, default_normalizer_name); push_warning(thread_, MRN_SEVERITY_WARNING, HA_ERR_UNSUPPORTED, error_message); normalizer_name = NULL; } } if (!normalizer_name) { normalizer_name = normalizer_spec = default_normalizer_name; } GRN_TEXT_PUTS(ctx_, normalizer, normalizer_spec); DBUG_VOID_RETURN; }
char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { char *str; int n; PJVAL jvp; PJAR arp; PGLOBAL g = (PGLOBAL)initid->ptr; PlugSubSet(g, g->Sarea, g->Sarea_Size); jvp = MakeValue(g, args, 0); if (jvp->GetValType() != TYPE_JAR) { push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, "First argument is not an array"); str = args->args[0]; } else if (args->arg_type[1] != INT_RESULT) { push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, "Second argument is not an integer"); str = args->args[0]; } else { n = *(int*)args->args[1]; arp = jvp->GetArray(); arp->DeleteValue(n - 1); arp->InitArray(g); if (!(str = Serialize(g, arp, NULL, 0))) { str = strcpy(result, g->Message); push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, str); } // endif str } // endif's *res_length = strlen(str); return str; } // end of Json_Array_Delete
char *Json_Object_Grp(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { char *str; PGLOBAL g = (PGLOBAL)initid->ptr; PJOB objp = (PJOB)g->Activityp; if (g->N < 0) push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, "Result truncated to json_grp_size values"); if (!(str = Serialize(g, objp, NULL, 0))) str = strcpy(result, g->Message); *res_length = strlen(str); return str; } // end of Json_Object_Grp
static PJVAL MakeValue(PGLOBAL g, UDF_ARGS *args, int i) { char *sap = (args->arg_count > (unsigned)i) ? args->args[i] : NULL; PJSON jsp; PJVAL jvp = new(g) JVALUE; if (sap) switch (args->arg_type[i]) { case STRING_RESULT: if (args->lengths[i]) { if (IsJson(args, i)) { if (!(jsp = ParseJson(g, sap, args->lengths[i], 0))) push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); if (jsp && jsp->GetType() == TYPE_JVAL) jvp = (PJVAL)jsp; else jvp->SetValue(jsp); } else jvp->SetString(g, MakePSZ(g, args, i)); } // endif str break; case INT_RESULT: jvp->SetInteger(g, *(int*)sap); break; case REAL_RESULT: jvp->SetFloat(g, *(double*)sap); break; case DECIMAL_RESULT: jvp->SetFloat(g, atof(MakePSZ(g, args, i))); break; case TIME_RESULT: case ROW_RESULT: case IMPOSSIBLE_RESULT: default: break; } // endswitch arg_type return jvp; } // end of MakeValue
grn_obj *FieldNormalizer::find_grn_normalizer() { MRN_DBUG_ENTER_METHOD(); const CHARSET_INFO *charset_info = field_->charset(); const char *normalizer_name = NULL; const char *default_normalizer_name = "NormalizerAuto"; if ((strcmp(charset_info->name, "utf8_general_ci") == 0) || (strcmp(charset_info->name, "utf8mb4_general_ci") == 0)) { normalizer_name = "NormalizerMySQLGeneralCI"; } else if ((strcmp(charset_info->name, "utf8_unicode_ci") == 0) || (strcmp(charset_info->name, "utf8mb4_unicode_ci") == 0)) { normalizer_name = "NormalizerMySQLUnicodeCI"; } grn_obj *normalizer = NULL; if (normalizer_name) { normalizer = grn_ctx_get(ctx_, normalizer_name, -1); if (!normalizer) { char error_message[MRN_MESSAGE_BUFFER_SIZE]; snprintf(error_message, MRN_MESSAGE_BUFFER_SIZE, "%s normalizer isn't found for %s. " "Install groonga-normalizer-mysql normalizer. " "%s is used as fallback.", normalizer_name, charset_info->name, default_normalizer_name); push_warning(thread_, Sql_condition::WARN_LEVEL_WARN, HA_ERR_UNSUPPORTED, error_message); } } if (!normalizer) { normalizer = grn_ctx_get(ctx_, default_normalizer_name, -1); } DBUG_RETURN(normalizer); }
PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db, const char *name, bool& info) { int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT, TYPE_INT, TYPE_SHORT, TYPE_SHORT, TYPE_SHORT, TYPE_STRING, TYPE_STRING, TYPE_STRING}; XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC, FLD_LENGTH, FLD_SCALE, FLD_RADIX, FLD_NULL, FLD_REM, FLD_NO, FLD_CHARSET}; unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 0, 32, 32}; char *fld, *colname, *chset, *fmt, v; int i, n, ncol = sizeof(buftyp) / sizeof(int); int prec, len, type, scale; int zconv = GetConvSize(); bool mysql; TABLE_SHARE *s = NULL; Field* *field; Field *fp; PQRYRES qrp; PCOLRES crp; if (!info) { if (!(s = GetTableShare(g, thd, db, name, mysql))) { return NULL; } else if (s->is_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; } else { n = 0; length[0] = 128; } // endif info /**********************************************************************/ /* Allocate the structures used to refer to the result set. */ /**********************************************************************/ if (!(qrp = PlgAllocResult(g, ncol, n, IDS_COLUMNS + 3, buftyp, fldtyp, length, false, true))) return NULL; // 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 if (info) return qrp; /**********************************************************************/ /* Now get the results into blocks. */ /**********************************************************************/ for (i = 0, field= s->field; *field; field++) { fp= *field; // Get column name crp = qrp->Colresp; // Column_Name colname = (char *)fp->field_name; crp->Kdata->SetValue(colname, i); chset = (char *)fp->charset()->name; v = (!strcmp(chset, "binary")) ? 'B' : 0; if ((type = MYSQLtoPLG(fp->type(), &v)) == TYPE_ERROR) { if (v == 'K') { // Skip this column sprintf(g->Message, "Column %s skipped (unsupported type)", colname); push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); continue; } // endif v sprintf(g->Message, "Column %s unsupported type", colname); qrp = NULL; break; } // endif type if (v == 'X') { len = zconv; sprintf(g->Message, "Column %s converted to varchar(%d)", colname, len); push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); } // endif v 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 // X means TEXT field crp->Nulls[i] = (v == 'X') ? 'V' : v; crp = crp->Next; // Type_Name crp->Kdata->SetValue(GetTypeName(type), i); fmt = NULL; if (type == TYPE_DATE) { // When creating tables we do need info about date columns if (mysql) { fmt = MyDateFmt(fp->type()); prec = len = strlen(fmt); } else { fmt = (char*)fp->option_struct->dateformat; prec = len = fp->field_length; } // endif mysql } else if (v != 'X') { if (type == TYPE_DECIM) prec = ((Field_new_decimal*)fp)->precision; else prec = fp->field_length; // prec = (prec(???) == NOT_FIXED_DEC) ? 0 : fp->field_length; len = fp->char_length(); } else prec = len = zconv; crp = crp->Next; // Precision crp->Kdata->SetValue(prec, i); crp = crp->Next; // Length crp->Kdata->SetValue(len, i); crp = crp->Next; // Scale scale = (type == TYPE_DOUBLE || type == TYPE_DECIM) ? fp->decimals() : 0; crp->Kdata->SetValue(scale, i); crp = crp->Next; // Radix crp->Kdata->SetValue(0, i); crp = crp->Next; // Nullable crp->Kdata->SetValue((fp->null_ptr != 0) ? 1 : 0, i); crp = crp->Next; // Remark // For Valgrind if (fp->comment.length > 0 && (fld = fp->comment.str)) crp->Kdata->SetValue(fld, fp->comment.length, i); else crp->Kdata->Reset(i); crp = crp->Next; // New (date format) crp->Kdata->SetValue((fmt) ? fmt : (char*) "", i); crp = crp->Next; // New (charset) fld = (char *)fp->charset()->name; crp->Kdata->SetValue(fld, i); // Add this item qrp->Nblin++; i++; // Can be skipped } // endfor field /**********************************************************************/ /* Return the result pointer for use by GetData routines. */ /**********************************************************************/ if (s) free_table_share(s); return qrp; } // end of TabColumns