1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-30 19:23:07 +03:00

First working attempt for json_arrayagg

This commit is contained in:
mariadb-AndreyPiskunov
2022-10-19 22:43:47 +03:00
parent 1714b75434
commit 315e4be2d8
5 changed files with 552 additions and 16 deletions

View File

@ -96,7 +96,7 @@ void JsonArrayAggColumn::serialize(messageqcpp::ByteStream& b) const
for (rcit = fOrderCols.begin(); rcit != fOrderCols.end(); ++rcit)
(*rcit)->serialize(b);
b << ',';
b << fSeparator;
}
void JsonArrayAggColumn::unserialize(messageqcpp::ByteStream& b)
@ -116,6 +116,7 @@ void JsonArrayAggColumn::unserialize(messageqcpp::ByteStream& b)
fOrderCols.push_back(srcp);
}
b >> fSeparator;
}
bool JsonArrayAggColumn::operator==(const JsonArrayAggColumn& t) const

View File

@ -57,6 +57,10 @@ using namespace ordering;
#include "limitedorderby.h"
#include "mcs_decimal.h"
#include "utils/json/json.hpp"
using namespace nlohmann;
namespace joblist
{
@ -478,8 +482,18 @@ void JsonArrayAggregator::outputRow(std::ostringstream& oss, const rowgroup::Row
case CalpontSystemCatalog::VARCHAR:
case CalpontSystemCatalog::TEXT:
{
oss << "\"" << row.getStringField(*i).c_str() << "\"";
break;
std::string maybeJson = row.getStringField(*i);
try
{
[[maybe_unused]] json j = json::parse(maybeJson);
oss << maybeJson.c_str();
break;
}
catch (const json::parse_error& e)
{
oss << std::quoted(maybeJson.c_str());
break;
}
}
case CalpontSystemCatalog::DOUBLE:
@ -504,25 +518,25 @@ void JsonArrayAggregator::outputRow(std::ostringstream& oss, const rowgroup::Row
case CalpontSystemCatalog::DATE:
{
oss << "\"" << DataConvert::dateToString(row.getUintField(*i)) << "\"";
oss << std::quoted(DataConvert::dateToString(row.getUintField(*i)));
break;
}
case CalpontSystemCatalog::DATETIME:
{
oss << "\"" << DataConvert::datetimeToString(row.getUintField(*i)) << "\"";
oss << std::quoted(DataConvert::datetimeToString(row.getUintField(*i)));
break;
}
case CalpontSystemCatalog::TIMESTAMP:
{
oss << "\"" << DataConvert::timestampToString(row.getUintField(*i), fTimeZone) << "\"";
oss << std::quoted(DataConvert::timestampToString(row.getUintField(*i), fTimeZone));
break;
}
case CalpontSystemCatalog::TIME:
{
oss << "\"" << DataConvert::timeToString(row.getUintField(*i)) << "\"";
oss << std::quoted(DataConvert::timeToString(row.getUintField(*i)));
break;
}
@ -873,15 +887,15 @@ void JsonArrayAggOrderBy::getResult(uint8_t* buff, const string&)
// need to reverse the order
stack<OrderByRow> rowStack;
if (fOrderByQueue.size() > 0)
while (fOrderByQueue.size() > 0)
{
rowStack.push(fOrderByQueue.top());
fOrderByQueue.pop();
}
if (rowStack.size() > 0)
{
oss << '[';
while (fOrderByQueue.size() > 0)
{
rowStack.push(fOrderByQueue.top());
fOrderByQueue.pop();
}
while (rowStack.size() > 0)
{
if (addSep)
@ -1023,7 +1037,7 @@ void JsonArrayAggNoOrder::getResult(uint8_t* buff, const string&)
{
ostringstream oss;
bool addSep = false;
if (fDataQueue.size() > 0)
if (fRowGroup.getRowCount() > 0)
{
oss << '[';
fDataQueue.push(fData);

View File

@ -4918,7 +4918,8 @@ ReturnedColumn* buildAggregateColumn(Item* item, gp_walk_info& gwi)
// Argument_count() is the # of formal parms to the agg fcn. Columnstore
// only supports 1 argument except UDAnF, COUNT(DISTINC) and GROUP_CONCAT
if (isp->argument_count() != 1 && isp->sum_func() != Item_sum::COUNT_DISTINCT_FUNC &&
isp->sum_func() != Item_sum::GROUP_CONCAT_FUNC && isp->sum_func() != Item_sum::UDF_SUM_FUNC)
isp->sum_func() != Item_sum::GROUP_CONCAT_FUNC && isp->sum_func() != Item_sum::UDF_SUM_FUNC &&
isp->sum_func() != Item_sum::JSON_ARRAYAGG_FUNC)
{
gwi.fatalParseError = true;
gwi.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_MUL_ARG_AGG);