Причина, по которой это не работает, состоит в том, что buildSelect
ожидает только того, что будет передаваться в таблицах по значению в дереве синтаксического анализа, то есть элемент в индексе 1, как ожидается, будет атомарным символом, а не спискомсимвол, который используется для анализа обновлений по имени.
q)parse "update col1:val from tab"
!
`tab
()
0b
(,`col1)!,`val
q)parse "update col1:val from `tab"
!
,`tab
()
0b
(,`col1)!,`val
Это вызывает проблемы в следующей строке в inner
x[1]:$[-11=type x 1;x 1;[idxs,:1;.z.s x 1]];
Более надежный buildSelect можно выполнить с помощью следующей настройки
inner:{[x]
idxs:2 3 4 5 6 inter ainds:til count x;
x:@[x;idxs;'[ab;eval]];
if[6 in idxs;x[6]:ssr/[;("hopen";"hclose");("iasc";"idesc")] x[6]];
//for select statements within select statements
x[1]:$[-11=type x 1;x 1;$[11h=type x 1;[idxs,:1;"`",string first x 1];[idxs,:1;.z.s x 1]]];
x:@[x;ainds except idxs;string];
x[0],strBrk[1_x;"[";"]"]
};
, котораязатем разрешит следующее
q)buildSelect "update col1:val from `tab"
"![`tab;();0b;(enlist`col1)!enlist`val]"
q)buildSelect "update col1:val from tab"
"![tab;();0b;(enlist`col1)!enlist`val]"