| 1422 | } |
| 1423 | |
| 1424 | StringVal StringFunctions::ParseUrlKey(FunctionContext* ctx, const StringVal& url, |
| 1425 | const StringVal& part, const StringVal& key) { |
| 1426 | if (url.is_null || part.is_null || key.is_null) return StringVal::null(); |
| 1427 | void* state = ctx->GetFunctionState(FunctionContext::FRAGMENT_LOCAL); |
| 1428 | UrlParser::UrlPart url_part; |
| 1429 | if (state != NULL) { |
| 1430 | url_part = *reinterpret_cast<UrlParser::UrlPart*>(state); |
| 1431 | } else { |
| 1432 | DCHECK(!ctx->IsArgConstant(1)); |
| 1433 | url_part = UrlParser::GetUrlPart(StringValue::FromStringVal(part)); |
| 1434 | } |
| 1435 | |
| 1436 | StringValue result; |
| 1437 | if (!UrlParser::ParseUrlKey(StringValue::FromStringVal(url), url_part, |
| 1438 | StringValue::FromStringVal(key), &result)) { |
| 1439 | // url is malformed, or url_part is invalid. |
| 1440 | if (url_part == UrlParser::INVALID) { |
| 1441 | stringstream ss; |
| 1442 | ss << "Invalid URL part: " << AnyValUtil::ToString(part); |
| 1443 | ctx->AddWarning(ss.str().c_str()); |
| 1444 | } else { |
| 1445 | stringstream ss; |
| 1446 | ss << "Could not parse URL: " << AnyValUtil::ToString(url); |
| 1447 | ctx->AddWarning(ss.str().c_str()); |
| 1448 | } |
| 1449 | return StringVal::null(); |
| 1450 | } |
| 1451 | StringVal result_sv; |
| 1452 | result.ToStringVal(&result_sv); |
| 1453 | return result_sv; |
| 1454 | } |
| 1455 | |
| 1456 | StringVal StringFunctions::Chr(FunctionContext* ctx, const IntVal& val) { |
| 1457 | if (val.is_null) return StringVal::null(); |
nothing calls this directly
no test coverage detected