You've already forked mariadb-columnstore-engine
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:
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user