O PostgreSQL pode criar um banco de dados que diferencia maiúsculas de minúsculas?

10

Estou portando algum código de alguma versão do Sybase para o PostgreSQL. Este é um aplicativo C que usa a biblioteca do cliente Sybase. Minha abordagem é escrever uma camada de tradução que traduz chamadas dbsqlexec()para PQexec()(por exemplo). Essa parte está funcionando principalmente.

Parece que o banco de dados Sybase está configurado de uma maneira que diferencia maiúsculas de minúsculas (com relação aos nomes dos objetos do banco de dados). Por exemplo, há uma WIDGETtabela e uma widgettabela. Parece que a convenção neste aplicativo é que os nomes em maiúsculas indicam as tabelas de dados reais, enquanto os nomes em minúsculas são usados ​​como tabelas temporárias ao executar algum processamento.

De acordo com a 4.1 Estrutura Lexical , " Palavras-chave e identificadores não citados não diferenciam maiúsculas de minúsculas. " Eu sei que posso colocar aspas duplas nos identificadores para desativar a dobra automática em minúsculas, mas não quero fazer isso manualmente através de zilhões de linhas do código que usa esse banco de dados.

Existe uma maneira de configurar o PostgreSQL para desativar essa dobra automática de caso para identificadores de objeto de banco de dados?

Minha alternativa será escrever um código que examine cada instrução SQL e coloque aspas duplas em torno de cada identificador (que não é uma palavra-chave).

Greg Hewgill
fonte
As palavras-chave podem ser usadas como identificadores se forem citadas duas vezes - mesmo que você não deva fazer isso. De qualquer forma, você não pode ter certeza de que alguns identificadores da sua base de código Sybase não são palavras-chave no PostgreSQL. Mais uma razão para colocar aspas nos identificadores ou, de preferência, renomeá-los.
Erwin Brandstetter
identificadores não citados no postgres, na verdade, não fazem distinção entre maiúsculas e minúsculas, são tratados como minúsculas. portanto, o tAbLeNaMe corresponderá a uma única tabela chamada tablename, mas não à tableName. Eu renomear as tabelas porque senão as pessoas vão esquecer o "e acabam acessando a versão em minúsculas por engano.
JamesRyan
@ JamesRyan: isso está errado. select * from TaBlEnAmEirá referenciar a mesma tabela que select * from tablenameouselect * from TABLENAME
a_horse_with_no_name 12/01
@a_horse_with_no_name: se você create table "tableName" (id integer primary key);e, em seguida create table "tablename" (id integer primary key);, esta consulta select * from TaBlEnAmE;selecionará "tablename", não "tableName". "Nomes sem aspas são sempre dobrados para minúsculas" .
Mike Sherrill 'Cat Recall'

Respostas:

3

Acabei escrevendo um código que transforma o SQL gerado pelo aplicativo em SQL compatível com o PostgreSQL. É bem direto:

  • Divida a declaração em tokens sensíveis, ignorando literais de string com aspas simples
  • Coloque aspas duplas em qualquer coisa que não seja uma palavra-chave ou número

Eu também aproveitei essa camada para transformar chamadas isnullpara coalesce. Até agora, está funcionando muito bem.

Greg Hewgill
fonte
i usar aspas ( "blahblablah") para torná-lo maiúsculas e minúsculas .. ele funciona suave para mim ..
Anuj Patel
1

Existe uma maneira de configurar o PostgreSQL para desativar essa dobra automática de caso para identificadores de objeto de banco de dados?

Não diretamente. Você pode fazer uma alteração relativamente pequena no código fonte do PostgreSQL e recompilá-lo. (Comece em src / back-end / parser / parser.c?) Mas eu ficaria surpreso se fosse muito simples.

Mike Sherrill 'Rechamada de gato'
fonte
Prefiro não mexer com o código-fonte, pois isso exigiria uma alteração personalizada na instalação do PostgreSQL toda vez que qualquer coisa fosse alterada (host, versão, etc.) e as instalações binárias não estivessem disponíveis.
precisa saber é o seguinte