LEGAL_CHARACTERS = util.Set(string.ascii_lowercase + string.ascii_uppercase + string.digits + '_$')
ILLEGAL_INITIAL_CHARACTERS = util.Set(string.digits + '$')
+BIND_PARAMS = re.compile(r'(?<![:\w\x5c]):(\w+)(?!:)', re.UNICODE)
+BIND_PARAMS_ESC = re.compile(r'\x5c(:\w+)(?!:)', re.UNICODE)
+
class ANSIDialect(default.DefaultDialect):
def __init__(self, cache_identifiers=True, **kwargs):
super(ANSIDialect,self).__init__(**kwargs)
# this re will search for params like :param
# it has a negative lookbehind for an extra ':' so that it doesnt match
# postgres '::text' tokens
- match = re.compile(r'(?<!:):([\w_]+)', re.UNICODE)
+ text = self.strings[self.statement]
+ if ':' not in text:
+ return
+
if self.paramstyle=='pyformat':
- self.strings[self.statement] = match.sub(lambda m:'%(' + m.group(1) +')s', self.strings[self.statement])
+ text = BIND_PARAMS.sub(lambda m:'%(' + m.group(1) +')s', text)
elif self.positional:
- params = match.finditer(self.strings[self.statement])
+ params = BIND_PARAMS.finditer(text)
for p in params:
self.positiontup.append(p.group(1))
if self.paramstyle=='qmark':
- self.strings[self.statement] = match.sub('?', self.strings[self.statement])
+ text = BIND_PARAMS.sub('?', text)
elif self.paramstyle=='format':
- self.strings[self.statement] = match.sub('%s', self.strings[self.statement])
+ text = BIND_PARAMS.sub('%s', text)
elif self.paramstyle=='numeric':
i = [0]
def getnum(x):
i[0] += 1
return str(i[0])
- self.strings[self.statement] = match.sub(getnum, self.strings[self.statement])
+ text = BIND_PARAMS.sub(getnum, text)
+ # un-escape any \:params
+ text = BIND_PARAMS_ESC.sub(lambda m: m.group(1), text)
+ self.strings[self.statement] = text
def get_from_text(self, obj):
return self.froms.get(obj, None)
'_smallest': -1000,
'_largest': 1000
}
+BIND_PARAMS = re.compile(r'(?<![:\w\x5c]):(\w+)(?!:)', re.UNICODE)
def desc(column):
"""Return a descending ``ORDER BY`` clause element.
# scan the string and search for bind parameter names, add them
# to the list of bindparams
- self.text = re.compile(r'(?<!:):([\w_]+)', re.S).sub(repl, text)
+ self.text = BIND_PARAMS.sub(repl, text)
if bindparams is not None:
for b in bindparams:
self.bindparams[b.key] = b
checkparams={'bar':4, 'whee': 7},
params={'bar':4, 'whee': 7, 'hoho':10},
)
-
+
+ self.runtest(
+ text("select * from foo where clock='05:06:07'"),
+ "select * from foo where clock='05:06:07'",
+ checkparams={},
+ params={},
+ )
+
dialect = postgres.dialect()
self.runtest(
text("select * from foo where lala=:bar and hoho=:whee"),
params={'bar':4, 'whee': 7, 'hoho':10},
dialect=dialect
)
+ self.runtest(
+ text("select * from foo where clock='05:06:07' and mork='\:mindy'"),
+ "select * from foo where clock='05:06:07' and mork=':mindy'",
+ checkparams={},
+ params={},
+ dialect=dialect
+ )
dialect = sqlite.dialect()
self.runtest(