From 709930d2eb89701a1467a5d0dc08d8a32cf676f9 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov <ivadmi5@gmail.com> Date: Wed, 29 Jan 2025 22:56:39 +0300 Subject: [PATCH] wip: extend OP_ResultRow to return a single row from subprograms NO_DOC=internal NO_TEST=internal NO_CHANGELOG=internal --- src/box/sql/vdbe.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c index ee849c3b82..ae0b8211b5 100644 --- a/src/box/sql/vdbe.c +++ b/src/box/sql/vdbe.c @@ -981,11 +981,24 @@ case OP_SCopy: { /* out2 */ * the result row. */ case OP_ResultRow: { - assert(p->nResColumn==pOp->p2); + assert(p->pFrame != NULL || p->nResColumn == pOp->p2); assert(pOp->p1>0); assert(pOp->p1+pOp->p2<=(p->nMem+1 - p->nCursor)+1); assert(p->iStatement == 0 && p->anonymous_savepoint == NULL); + /* Copy the result into the parent VDBE program. */ + if (p->pFrame != NULL) { + VdbeFrame *pFrame = p->pFrame; + /* TODO: maybe pFrameOffset isn't that convenient in practice. */ + int pFrameOffset = pFrame->aOp[pFrame->pc].p1; + for (int i = 0; i < pOp->p2; i++) { + Mem *pIn = &p->aMem[pOp->p1 + i]; + pOut = &pFrame->aMem[pOp->p3 + pFrameOffset + i]; + mem_copy(pOut, pIn); + } + break; + } + /* Invalidate all ephemeral cursor row caches */ p->cacheCtr = (p->cacheCtr + 2)|1; -- GitLab