@@ -1815,6 +1815,67 @@ t_stree::update_agg_table(
18151815 );
18161816 dst->set_scalar (dst_ridx, new_value);
18171817 } break ;
1818+ case AGGTYPE_GMV: {
1819+ // Leaf nodes: plain `sum` of the underlying rows.
1820+ // Non-leaf nodes: sum over immediate children of
1821+ // `abs(sum(child_subtree))`. The child sums are recomputed
1822+ // from the gstate rather than read from already-populated
1823+ // child rows, so the parent does not see the abs-rolled-up
1824+ // child value — it sees the child's raw signed sum.
1825+ old_value.set (dst->get_scalar (dst_ridx));
1826+ const auto & col_name = spec.get_dependencies ()[0 ].name ();
1827+ auto dst_dtype = dst->get_dtype ();
1828+ auto sum_reducer = [dst_dtype](std::vector<t_tscalar>& values
1829+ ) -> t_tscalar {
1830+ if (values.empty ()) {
1831+ return mknone ();
1832+ }
1833+ t_tscalar v;
1834+ v.set (std::uint64_t (0 ));
1835+ v.m_type = dst_dtype;
1836+ for (const auto & x : values) {
1837+ if (x.is_nan ()) {
1838+ continue ;
1839+ }
1840+ v = v.add (x.coerce_numeric_dtype (dst_dtype));
1841+ }
1842+ return v;
1843+ };
1844+
1845+ if (is_leaf (nidx)) {
1846+ auto pkeys = get_pkeys (nidx);
1847+ new_value.set (
1848+ reduce_from_gstate<std::function<
1849+ t_tscalar (std::vector<t_tscalar>&)>>(
1850+ gstate,
1851+ expression_master_table,
1852+ col_name,
1853+ pkeys,
1854+ sum_reducer
1855+ )
1856+ );
1857+ } else {
1858+ t_tscalar rval;
1859+ rval.set (std::uint64_t (0 ));
1860+ rval.m_type = dst_dtype;
1861+ for (auto cidx : get_child_idx (nidx)) {
1862+ auto cpkeys = get_pkeys (cidx);
1863+ t_tscalar csum = reduce_from_gstate<std::function<
1864+ t_tscalar (std::vector<t_tscalar>&)>>(
1865+ gstate,
1866+ expression_master_table,
1867+ col_name,
1868+ cpkeys,
1869+ sum_reducer
1870+ );
1871+ if (csum.is_valid () && !csum.is_nan ()) {
1872+ rval = rval.add (csum.abs ());
1873+ }
1874+ }
1875+ new_value.set (rval);
1876+ }
1877+ dst->set_scalar (dst_ridx, new_value);
1878+ } break ;
18181879 case AGGTYPE_MUL: {
18191880 old_value.set (dst->get_scalar (dst_ridx));
18201881 auto pkeys = get_pkeys (nidx);
0 commit comments