[Qt-interest] "%" characters in QStrings create havoc
Clinton Stimpson
clinton at elemtech.com
Fri Feb 26 18:39:37 CET 2010
If you can't guarantee the contents of exp1 won't mess up the second
substitution, then maybe you should do the substitution with two different
strings then concatenate them together into the clause variable.
Clint
On Friday 26 February 2010 10:27:08 am KC Jones wrote:
> Thanks for the tip. It helps, but not enough. If anyone can dig up a doc
> reference it might help me figure this out. The HTML 4.6 docs for QString
> do not appear to cover this nuance. It does explain some of the internal
> handling of parameter substitution operations which is good to know. But
> nothing about how to restrain it in this case.
>
> Using "%%" does indeed appear to solve the parameter substitution problem.
> In my test app the substitutions are predictable and correct. But it
> leaves me with double %% where I just want %. I suppose there is no
> effective difference in terms of SQL results between a (b LIKE '%%x%%')
> and (b LIKE '%x%') operation, but I'm not entirely sure about that, and
> besides, it just seems wrong to live with this mess.
>
> It also does not cure my crash in my main application -- which does not
> involve my logging classes as I previously claimed. In my app, this line
> causes a crash all by itself:
>
> QString clause = QString(" WHERE (name LIKE '%1') OR (email LIKE '%2') ")
> .arg(exp1).arg(exp2);
>
> My stack (Mac) looks like:
>
> 0 QString::operator= 0 0x005136da
> 1 Cargo::Database::AddressCompletionModel::onFilterChanged
> addresscompletionmodel.cpp 32 0x000d3eb6
> 2 Cargo::AddressListEditor::onTextChanged addresslisteditor.cpp
> 121 0x00069475
> 3 Cargo::AddressListEditor::qt_metacall moc_addresslisteditor.cpp
> 82 0x0006fa2f
> 4 QMetaObject::activate 0 0x005cd18c
> 5 QTextEdit::textChanged 0 0x00f5c682
> 6 QTextEdit::qt_metacall 0 0x00f60d7f
> 7 Cargo::AddressListEditor::qt_metacall moc_addresslisteditor.cpp
> 75 0x0006f990
> 8 QMetaObject::activate 0 0x005cd18c
> 9 QTextControl::textChanged 0 0x00ce1042
> 10 QTextControl::qt_metacall 0 0x00ceaf3a
> 11 QMetaObject::activate 0 0x005cd18c
> 12 QTextDocument::contentsChanged 0 0x011350a2
> 13 QTextDocumentPrivate::endEditBlock 0 0x00d21f29
> 14 QTextCursor::insertText 0 0x00d4c63f
> 15 QTextCursor::insertText 0 0x00d4d0e4
> 16 QTextControlPrivate::keyPressEvent 0 0x00cec44a
> 17 QTextControl::processEvent 0 0x00ceec84
> 18 QTextControl::processEvent 0 0x00ce1967
> 19 QTextEdit::keyPressEvent 0 0x00f6252f
> 20 QWidget::event 0 0x00b5d63b
> ... <More>
>
>
> On Thu, Feb 25, 2010 at 6:01 PM, Scott Aron Bloom
>
> <Scott.Bloom at sabgroup.com>wrote:
> > I know its in the docs somewhere...
> >
> > But %% is what you are looking for.
> > Scott
> >
> >
> > -----Original Message-----
> > From: qt-interest-bounces at trolltech.com
> > [mailto:qt-interest-bounces at trolltech.com] On Behalf Of KC Jones
> > Sent: Thursday, February 25, 2010 17:54
> > To: Qt-interest
> > Subject: [Qt-interest] "%" characters in QStrings create havoc
> >
> > What is the correct way to place percent characters in QStrings?
> >
> > I find that QStrings containing '%' characters act erratically and
> > cause crashes. I am able to reproduce some erratic behaviours, but so
> > far I cannot isolate the crashes that I suffer in my application's
> > logging classes. What I think is the root of the problem comes from
> > unwanted, unexpected parameter substitution.
> >
> > The following code is taken from a test app I put together. I can
> > share that as needed. I've fiddled around with escaping the percent
> > characters, replacing "%" with "\%" and "\\\%" without much success.
> >
> > When the input string contains '1' or '2', the results in 'clause' are
> > unpredictable and wrong. But other characters in the 'str' are also
> > problematic.
> >
> > In my application I am constructing SQL WHERE clauses that perform
> > LIKE searches in which the '%' characters are essential. The search
> > can be based on arbitrary user input, so I need to find a bulletproof
> > way to construct these SQL queries for all possible text input.
> >
> > void percent::showFilter(const QString &str)
> > {
> > QString exp1 = "%";
> > for (int i = 0, im = str.size(); i < im; i++) {
> > exp1.append(str[i]).append("%");
> > }
> > QString exp2 = exp1 + "@%";
> > QString clause = QString(" WHERE (name LIKE '%1') OR (email LIKE
> > '%2') ")
> > .arg(exp1).arg(exp2);
> >
> > ui->exp1->setText(exp1);
> > ui->exp2->setText(exp2);
> > ui->result->setText(clause);
> > }
> > _______________________________________________
> > Qt-interest mailing list
> > Qt-interest at trolltech.com
> > http://lists.trolltech.com/mailman/listinfo/qt-interest
>
More information about the Qt-interest-old
mailing list