SQLite: bitwise XOR is generated as a ^ b, which SQLite can't parse

Aperta Adatta ai principianti
#9,114 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
70/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
python, sqlite
Ambito
databases

Direzione di ricerca

Inizia in sqlglot/dialects/sqlite.py: la classe Generator eredita il bitwisexor_sql predefinito, che emette ^. Aggiungi un gestore BitwiseXor che si espande in (a | b) & ~(a & b), oppure chiama unsupported se i manutentori preferiscono segnalarlo. Aggiungi casi a tests/dialects/test_sqlite.py che coprano i quattro dialetti di lettura oltre a operandi negativi e NULL, ed esegui quel file di test — finito quando l'SQL generato viene eseguito su sqlite3.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Fully reproducible code snippet

SQLite has no bitwise XOR operator, but the sqlite generator writes BitwiseXor as a ^ b, which SQLite can't parse. No unsupported warning is raised either, so unsupported_level=RAISE lets it through:

import sqlite3, sqlglot
from sqlglot import ErrorLevel

for sql, read in [
    ("SELECT 5 # 3", "postgres"),
    ("SELECT XOR(5, 3)", "duckdb"),
    ("SELECT BITXOR(5, 3)", "snowflake"),
    ("SELECT 5 ^ 3", "mysql"),
]:
    out = sqlglot.transpile(sql, read=read, write="sqlite", unsupported_level=ErrorLevel.RAISE)[0]
    print(out)  # SELECT 5 ^ 3
    sqlite3.connect(":memory:").execute(out)
    # sqlite3.OperationalError: unrecognized token: "^"

Expected: SQLite has |, & and ~ on 64-bit integers, so (a | b) & ~(a & b) gives the same result (including negatives and NULL propagation): (5 | 3) & ~(5 & 3) = 6, (-5 | 3) & ~(-5 & 3) = -8. If that's not wanted, an unsupported call would at least flag it, like the BITWISE_XOR aggregate already does.

Official Documentation

SQLite operators (no ^ / XOR; &, |, ~ exist): https://www.sqlite.org/lang_expr.html#operators_and_parse_affecting_attributes

Tested on main at b294f7f, SQLite 3.54.1.

Lingua principale
Python
Stelle
9.8k
Fork
1.4k
Merge medio
13h 19m
PR unite (30g)
243

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di tobymao/sqlglot

Tutte le issue di tobymao/sqlglot

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.