Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

Cypher on Oracle: randomUUID() gives SYS_GUID() values, not random version 4 UUIDs, and consecutive ones share most of their digits (port of drivine4j#401)

Đang mở Phù hợp với người mới
#252 1 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
78/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
python, sql
Lĩnh vực
databases

Hướng nghiên cứu

Bắt đầu tại drivine/cypher/sql/oracle_cypher_compiler.py, ở OracleCypherCompiler.uuid(), rồi so sánh biểu thức SYS_GUID() hiện tại với biểu thức Oracle UUID() trong issue. Kiểm tra cách trình biên dịch biểu diễn biểu thức SQL và liệu các phiên bản Oracle được hỗ trợ có cần fallback hay không. Công việc hoàn tất khi randomUUID() đã biên dịch tạo ra văn bản UUID phiên bản 4 ngẫu nhiên trên Oracle; issue không nêu tên tệp kiểm thử.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Port of liberation-data/drivine4j#401.

On Oracle, compiled Cypher's randomUUID() gives Oracle's SYS_GUID() written as UUID text. It's valid and unique, but it isn't version 4, and consecutive values share their first 11 or 12 characters. In 60 values from UNWIND range(1, 20) AS i RETURN randomUUID() compiled by this library on Oracle 23.26.3, 30 of the 32 hex digits were the same in every value:

5eeff3bf-6c75-0101-e063-090011ac4d78
5eeff3bf-6c76-0101-e063-090011ac4d78
5eeff3bf-6c77-0101-e063-090011ac4d78

Neo4j, Postgres (gen_random_uuid()) and SQLite all give random version 4 UUIDs.

Cause: OracleCypherCompiler.uuid() in drivine/cypher/sql/oracle_cypher_compiler.py compiles randomUUID() to LOWER(REGEXP_REPLACE(RAWTOHEX(SYS_GUID()), …)), the same expression as drivine4j.

Likely also affected, not tested: drivine/model/stamps.py makes its engine token from left(replace(randomUUID(), '-', ''), 16). On Oracle only about 16 bits of that change.

Fix: as in drivine4j#401. Use Oracle's UUID(), which returns a random version 4 UUID as RAW(16), and needs no grant beyond DB_DEVELOPER_ROLE:

LOWER(REGEXP_REPLACE(RAWTOHEX(UUID()), '(.{8})(.{4})(.{4})(.{4})(.{12})', '\1-\2-\3-\4-\5'))

Or use the DBMS_RANDOM fallback described there, if 23ai releases without UUID() must be supported. DBMS_CRYPTO needs EXECUTE granted by a DBA.

Ngôn ngữ chính
Python
Star
1
Fork
0
Merge trung bình
1 giờ 19 phút
Pull request đã merge (30 ngày)
122

Chuẩn bị môi trường

Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của liberation-data/drivine-python

Tất cả issue của liberation-data/drivine-python

Issue tương tự

Thêm issue về Python

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.