Eu tenho uma versão antiga do site php, que usa o número da coluna 'row_number' sem escape em suas consultas sql. Parece que na nova versão do mariadb foi adicionada uma nova função chamada "row_number ()" e, portanto, as consultas falham. Refatorar todo o projeto está fora de questão. Além disso, não quero encaixar tudo com uma versão mais antiga do mariadb. Existe uma maneira de usar o novo mariadb, mas também usar o conjunto de sintaxe/função mais antigo para que não haja colisão?
Obrigado.
Responder1
No Linux (ou similar), um único comando pode adicionar backtics em todos os seus arquivos.
Cuidado: Não use isso sem primeiro testar minuciosamente:
sed -i 's/row_number/\`row_number\`/ig *
Notas:
-i -- update file in-place
\ -- need to avoid the backtics being acted on by the shell
i -- ignore case
g -- handle multiple occurrences in a line
* -- change to specify the files that might need editing
Responder2
Uma maneira de contornar esse tipo de problema é usaro filtro de expressão regularem MariaDB MaxScale. Se você sabe que o aplicativo usa o ROW_NUMBER
nome de alguma forma específica, você pode definir uma expressão regular que corresponda a ele e substituí-la pela versão citada.
A desvantagem óbvia dessa abordagem é que as expressões regulares são um tanto complicadas de acertar e não são fáceis de manter se o padrão a ser correspondido se tornar complexo. No entanto, isso pode permitir que seu aplicativo funcione enquanto você atualiza seu aplicativo para uma versão mais recente.
Aqui está um exemplo de como o filtro seria configurado:
[RegexFilter]
type=filter
module=regexfilter
match=/ROW_NUMBER/
replace=/`ROW_NUMBER`/
Responder3
Além disso, não quero encaixar tudo com uma versão mais antiga do mariadb.
Bom. Usar versões antigas indefinidamente é mais trabalhoso do que a maioria das pessoas imagina. As atualizações de segurança terminarão, você precisará encontrar uma alternativa, como comprar suporte de alguém que possa fazer backport de correções. O que é uma habilidade difícil de encontrar. E então você fica preso na versão antiga e não obtém novos recursos.
Existe uma maneira de usar o novo mariadb, mas também usar o conjunto de sintaxe/função mais antigo para que não haja colisão?
Não, row_number é uma função de janela queexiste em todas as versões suportadas do MariaDB. É uma pena que você tenha escolhido o nome primeiro, mas row_number é uma convenção entre implementações SQL.
A citação é uma sintaxe para resolver a ambiguidade, como você disse. Este seria um projeto de refatoração relativamente menor, sem mudança de comportamento e sem necessidade de mexer em dados ou esquema. Se os desenvolvedores do seu site não fizerem isso, que outras manutenções mais complexas o código não está conseguindo?