Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
QString QSqlResultPrivate::positionalToNamedBinding()
{
int n = sql.size();
QString result;
result.reserve(n * 5 / 4);
bool inQuote = false;
int count = 0;
for (int i = 0; i < n; ++i) {
QChar ch = sql.at(i);
if (ch == QLatin1Char('?') && !inQuote) {
result += qFieldSerial(count++);
} else {
if (ch == QLatin1Char('\''))
inQuote = !inQuote;
result += ch;
}
}
result.squeeze();
return result;
}
// Пример запроса:
// select * from some where d_t = "2012-11-08 12:00:00"
Словили сегодня вот такой глюк в кутишечке.
База данных отлично понимает строки и даты в двойных кавычках, все это даже работало какое-то время. Но когда попытались исполнить запрос с таймштампом в двойных кавычках (как в строке 25), начала возникать ошибка в духе "непонятные символы в дате". В одинарных же кавычках все работало. После копания в исходниках и гуглёжки выяснилась и причина - QtSql в упор не видит двойных кавычек, и пытается проставить в них именованные параметры (в нашем случае :00, :00)...
Ночью он опять видел тот странный сон: погружённый в беспросветный мрак лес и преследующие его из теней сверкающие глаза. Страх уже скрутил его цепкими лапами, Вит хотел закричать, но с губ срывался лишь еле слышный шёпот. Неожиданно как будто пара сильных рук вырвала его из гибельного оцепенения и потащила за собой, в тепло и безопасность.
select * from some where foo = "Hello d'Artagnan!" and bar = 'trololo'
Так там же:
Т.е. кавычки внутри других кавычек он нормально распарсит. А вот заэкранированные слешами... но это уже другая история.
форматирование в одну строку вскружило мне голову
а разве в sql они слешами экранируются?
давно не работал с ним, но помнится, что повторением - типа "" или ''
'это два '' апострофа'
'а это двойная " кавычка'