PostgreSQL: support FOR NO KEY UPDATE and FOR KEY SHARE row-locking clauses

Abierto Apto para principiantes
#2,778 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

  • #2788 de @abhinav-phi — cerrado sin fusionar

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
76/100
Tipo de issue
Nueva funcionalidad
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
postgresql, rust
Área
databases

Línea de trabajo

Empieza por localizar LockType, parse_lock y las pruebas de ida y vuelta existentes para FOR UPDATE y FOR SHARE. Añade cobertura para los dos niveles que faltan, incluidas las variantes con OF y con políticas de espera; el trabajo estará hecho cuando pasen tanto las pruebas de análisis como las de ida y vuelta en los dialectos PostgreSQL y genérico.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

PostgreSQL
Summary

PostgreSQL's row-locking clause has four lock strengths: FOR UPDATE, FOR NO KEY UPDATE, FOR SHARE and FOR KEY SHARE. sqlparser reads only FOR UPDATE and FOR SHARE. FOR NO KEY UPDATE and FOR KEY SHARE, which PostgreSQL's own referential-integrity triggers use (SELECT 1 FROM ONLY t x WHERE … FOR KEY SHARE OF x), are rejected.

Reproduction (current main, c6cec56b)
use sqlparser::{dialect::PostgreSqlDialect, parser::Parser};

Parser::parse_sql(&PostgreSqlDialect {}, "SELECT id FROM t WHERE id = 1 FOR NO KEY UPDATE").unwrap();
Parser::parse_sql(&PostgreSqlDialect {}, "SELECT id FROM t WHERE id = 1 FOR KEY SHARE OF t").unwrap();
sql parser error: Expected: one of UPDATE or SHARE, found: NO at Line: 1, Column: 35
sql parser error: Expected: one of UPDATE or SHARE, found: KEY at Line: 1, Column: 35

SELECT id FROM t WHERE id = 1 FOR SHARE OF t SKIP LOCKED parses. All of these run on PostgreSQL (checked on 17.11):

CREATE TABLE t (id int PRIMARY KEY);
SELECT id FROM t WHERE id = 1 FOR NO KEY UPDATE;
SELECT id FROM t WHERE id = 1 FOR KEY SHARE OF t;
SELECT id FROM t FOR KEY SHARE NOWAIT;
SELECT id FROM t FOR NO KEY UPDATE SKIP LOCKED;
Grammar

From https://www.postgresql.org/docs/current/sql-select.html#SQL-FOR-UPDATE-SHARE:

FOR lock_strength [ OF from_reference [, ...] ] [ NOWAIT | SKIP LOCKED ]

where lock_strength can be one of
    UPDATE
    NO KEY UPDATE
    SHARE
    KEY SHARE
Proposed change

Add two variants to LockType, for example NoKeyUpdate and KeyShare, displayed as NO KEY UPDATE and KEY SHARE. Parse them in parse_lock, where FOR is followed by NO KEY UPDATE or KEY SHARE, in the PostgreSQL and generic dialects. OF …, NOWAIT and SKIP LOCKED then follow as they do for the other two strengths. Round-trip tests for each strength, with and without OF and the wait policy, would cover it.

This is independent of FROM ONLY t, which the same trigger queries use and #2770 addresses.

Lenguaje dominante
Rust
Estrellas
3.5k
Forks
801
Merge medio
2 d 21 h
PR fusionados (30 d)
104

Preparar el entorno

  • Sin Dockerfile ni archivo de Docker Compose
  • Tiene una plantilla de pull request
  • Sin guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de apache/datafusion-sqlparser-rs

Todos los issues de apache/datafusion-sqlparser-rs

Issues similares

Más issues de Rust

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.