Vamos fazer isso! (embora eu não tenha ideia do porquê isso importaria de qualquer maneira...)
Então, não sou um cientista da computação, e estou apenas um terço através de "
The Annotated Turing
" (que parece ser um ótimo livro, aliás). Isso significa que o que segue é a abordagem de um leigo nisso.
Primeiramente, tive que entender o que é entendido por "totalmente turing" e como mostrar que uma linguagem possui essa característica.
Para isso, há algumas entradas na Wikipedia e discussões no SO disponíveis, e deixo que todos as leiam (por exemplo,
aqui
,
aqui
). Uma dessas discussões vinculou a uma apresentação que afirmava provar que o PostgreSQL-SQL com expressões comuns de tabela recursivas (CTS) é totalmente turing. Para provar isso, o autor da apresentação (
aqui
por sinal) disse que é suficiente demonstrar que uma linguagem pode emular outra linguagem que já foi demonstrada ser totalmente turing. Correto.
A escolha do autor foi um "
sistema de etiquetas cíclicas
" com um conjunto específico de regras (
Regra 110
) que aparentemente foi demonstrado ser totalmente turing.
Em seguida, o autor continua e implementa esse sistema de etiquetas cíclicas com uma expressão comum de tabela recursiva e assim prova a afirmação.
Hurra!
Então, o que isso significa para o SAP HANA SQL? O SAP HANA SQL/SQLScript não suporta expressões comuns de tabela recursivas (muita decepção para todos que tentam lidar com hierarquias e não conhecem as visualizações e funções de hierarquia especiais do SAP HANA (veja
aqui
) e também não suporta chamadas de procedimento recursivas.
Que pena, alguém poderia pensar.
Felizmente, cada recursão pode ser expressa como uma iteração (compare
aqui
), então pensei, vamos tentar esse sistema de etiquetas cíclicas em SQLScript. Este é o resultado (HANA 1, rev.122.15, no meu NUC):
do begin
declare prods VARCHAR(4) ARRAY;
declare currProd, initWord, currWord VARCHAR(300);
declare runs, maxruns bigint = 0;
declare currProdNo integer = 0;
initWord :='11001';
maxruns := 100;
runs := 0;
prods = ARRAY ('010', '000', '1111');
currWord := :initWord;
-- tabela falsa var para monitorar output
tmp = select :runs as RUNS, :currProd as CURRPROD, :currWord as CURRWORD
from dummy;
while (:runs < :maxruns) begin
foreach select :currProd as CURRPROD from dummy where :currProdNo = :runs, :currWord as CURRWORD from dummy;
:runs = :runs+1;
:currProdNo = :currProdNo+1;
end
end;