mirror of
https://github.com/dimitri/pgloader.git
synced 2025-08-08 23:37:00 +02:00
Make quoting identifiers more robust: do not quote already quoted string, and double quotes when quoting. Fix #180.
This commit is contained in:
parent
5b19776d5b
commit
c38ef4c235
@ -6,6 +6,12 @@
|
|||||||
(defvar *pgsql-reserved-keywords* nil
|
(defvar *pgsql-reserved-keywords* nil
|
||||||
"We need to always quote PostgreSQL reserved keywords")
|
"We need to always quote PostgreSQL reserved keywords")
|
||||||
|
|
||||||
|
(defun quoted-p (s)
|
||||||
|
"Return true if s is a double-quoted string"
|
||||||
|
(and
|
||||||
|
(eq (char s 0) #\")
|
||||||
|
(eq (char s (- (length s) 1)) #\")))
|
||||||
|
|
||||||
(defun apply-identifier-case (identifier)
|
(defun apply-identifier-case (identifier)
|
||||||
"Return given IDENTIFIER with CASE handled to be PostgreSQL compatible."
|
"Return given IDENTIFIER with CASE handled to be PostgreSQL compatible."
|
||||||
(let* ((lowercase-identifier (cl-ppcre:regex-replace-all
|
(let* ((lowercase-identifier (cl-ppcre:regex-replace-all
|
||||||
@ -18,7 +24,11 @@
|
|||||||
;; SQL identifiers and key words must begin with a letter (a-z, but
|
;; SQL identifiers and key words must begin with a letter (a-z, but
|
||||||
;; also letters with diacritical marks and non-Latin letters) or an
|
;; also letters with diacritical marks and non-Latin letters) or an
|
||||||
;; underscore (_).
|
;; underscore (_).
|
||||||
(cond ((cl-ppcre:scan "^[^A-Za-z_]" identifier)
|
(cond
|
||||||
|
((quoted-p identifier)
|
||||||
|
:none)
|
||||||
|
|
||||||
|
((cl-ppcre:scan "^[^A-Za-z_]" identifier)
|
||||||
:quote)
|
:quote)
|
||||||
|
|
||||||
((member lowercase-identifier *pgsql-reserved-keywords*
|
((member lowercase-identifier *pgsql-reserved-keywords*
|
||||||
@ -34,7 +44,8 @@
|
|||||||
|
|
||||||
(ecase *identifier-case*
|
(ecase *identifier-case*
|
||||||
(:downcase lowercase-identifier)
|
(:downcase lowercase-identifier)
|
||||||
(:quote (format nil "\"~a\"" identifier))
|
(:quote (format nil "\"~a\""
|
||||||
|
(cl-ppcre:regex-replace-all "\"" identifier "\"\"")))
|
||||||
(:none identifier))))
|
(:none identifier))))
|
||||||
|
|
||||||
;;;
|
;;;
|
||||||
|
Loading…
Reference in New Issue
Block a user