Um artigo explicando as ferramentas de geração de SQL

A ferramenta de geração de SQL pode ser usada para testar  a compatibilidade do Parser  com outros produtos de banco de dados. Ao analisar  as produções no arquivo de gramática YACC  , a instrução SQL  correspondente  é gerada e, em seguida, o banco de dados é usado para executar o  SQL . , é avaliado se a instrução é compatível com outra sintaxe do banco de dados.

0 1 Uso de ferramentas

Pré-processamento de arquivo gramatical

O objetivo do pré-processamento é remover o conteúdo irrelevante do arquivo de gramática e reter apenas as produções de cada instrução. Você pode obter as regras gramaticais no arquivo de gramática (sem ação) através do comando bison -v sql.y, e então remover o. o conteúdo gerado no arquivo gerado, como lista de símbolos de terminal, lista de símbolos não terminais, tabela de transição de estado, etc., é o seguinte:

O conteúdo do arquivo sql.output gerado é o seguinte, mantemos apenas sua seção " Sintaxe ":

Nota: Para a seção reservada " Sintaxe ", seu número de série também precisa ser removido.

 

Para o processo acima, nós o encapsulamos por meio do script de pré-processamento preprocess.sh para que os arquivos processados ​​atendam aos requisitos da ferramenta. O formato do arquivo gerado é o seguinte e o arquivo .output de saída é o arquivo de gramática pré-processado.

 

Geração de instrução SQL

Depois de gerar um arquivo de sintaxe que atenda às condições, você pode usar a ferramenta para gerar SQL. A ferramenta suporta os seguintes parâmetros:

•-b: especifica o arquivo de sintaxe, obrigatório. O arquivo de sintaxe é o arquivo gerado após o processamento pelo script preprocess.sh.

•-n: Especifique o nome da produção a ser gerada, obrigatório

•-R: modo gerado aleatoriamente, opcional, o padrão é modo de enumeração

•-o: Especifique o arquivo salvo para gerar instruções SQL, opcional, o padrão é report.csv

•-N: Limite o número de instruções SQL geradas, opcional, sem limite por padrão

 

0 2 implementação de ferramenta

Esta ferramenta contém dois pacotes: yacc_parser e sql_generator, que são responsáveis ​​por completar a análise de Token e geração de SQL respectivamente.

Método de produção de expressão

type SeqInfo struct {
    Items []string
}
type Production struct {
    Head  string    // 产生式头部
    Alter []SeqInfo     // 产生式 body
}

​​​​​​​

Análise de token

A função Tokenize é usada para tokenizar os caracteres no arquivo de gramática de leitura, e cada chamada retornará um Token. Esta função lida apenas com delimitadores simples e aspas e não implementa a correspondência regular do analisador léxico padrão.

A função Parse chama a função Tokenize, retornando um Token de cada vez. Após retornar, a função Parse monta uma série de Tokens em Produção com base no status atual e no tipo de Token.

 

Geração SQL

Existem dois modos para geração de SQL:

1. Percorra a lista de corpos da produção especificada em Produção e enumere para gerar instruções SQL;

2. Selecione aleatoriamente a lista de corpos da produção especificada em Produção e gere instruções SQL aleatoriamente.

 

1. Enumeração

A implementação da enumeração consiste em usar uma lista vinculada para salvar o Token a ser resolvido. Cada vez que um Token é retirado do topo da lista vinculada, o número de ocorrências do Token é incrementado e, em seguida, com base no número. de ocorrências do Token no registro em cada subexpressão for maior que os tempos especificados, filtre as subexpressões que podem continuar a ser deduzidas.

Por outro lado, duas matrizes são usadas para registrar o subscrito (escolha) da subexpressão atualmente tomada e o subscrito (máximo) da subexpressão máxima atual a ser registrada, para que a próxima expressão possa ser incrementada por escolha.

Após a filtragem, selecione a subexpressão correta da produção na posição de escolha e insira todos os seus Tokens no cabeçalho da lista vinculada e, em seguida, determine se o cabeçalho é literal ou palavra-chave. Em caso afirmativo, retire o cabeçalho e coloque-o no. Matriz SQL. Caso contrário, continue o loop pela lista vinculada.

Quando o processamento atingir o final da produção atual (o método de julgamento é escolha>máx), um "transporte" será tentado neste momento, ou seja, o último dígito da matriz de posição atualmente registrada será incrementado.

Por exemplo: a matriz máxima é 1 2 1 3, a matriz de escolha é 0 0 0 3, então a matriz de escolha após o transporte é 0 0 1 0, o que significa que a última posição foi percorrida e agora a penúltima posição precisa ser incrementado, e a última posição Zero, continue lendo a próxima permutação e combinação.

O processo de geração é implementado por meio de recursão. Por exemplo, para a produção a seguir, a lógica de processamento é mostrada na figura:

show_tables_stmt: MOSTRA TABELAS DO nome '.' nome com_comentário
                | MOSTRAR TABELAS DO nome with_comment
                | MOSTRAR TABELAS with_comment

with_comment: COM COMENTÁRIO
            | %

nome vazio: ID ENT

 

De acordo com o valor de escolha registrado, selecione a subexpressão de escolha da produção até que um SQL seja gerado. Em seguida, carregue a matriz de escolha e continue com a próxima rodada de seleção.

2. Aleatório

O modo de geração aleatória é semelhante ao modo de geração de enumeração, exceto que ele não percorre sequencialmente cada Token na lista do corpo de produção, mas seleciona aleatoriamente um Token como parte do SQL.

 

Decidi desistir do software industrial de código aberto . Grandes eventos - OGG 1.0 foi lançado, a Huawei contribuiu com todo o código-fonte do Ubuntu 24.04 LTS foi oficialmente demitido . ". O Fedora Linux 40 foi lançado oficialmente. Uma conhecida empresa de jogos lançou novos regulamentos: os presentes de casamento dos funcionários não devem exceder 100.000 yuans. A China Unicom lança a primeira versão chinesa Llama3 8B do mundo do modelo de código aberto. Pinduoduo é condenado a compensar 5 milhões de yuans por concorrência desleal Método de entrada na nuvem doméstica - apenas a Huawei não tem problemas de segurança de upload de dados na nuvem.
{{o.nome}}
{{m.nome}}

Acho que você gosta

Origin my.oschina.net/u/5148943/blog/11054997
Recomendado
Clasificación