NOTE: If you are a developer, please use a private wiki based on foswiki/trunk on a daily base ...or use trunk.foswiki.org to view this page for some minimal testing.
Use Item9693 for docu changes for 1.2 and 2.0.

Item2508: No way to escape macros in a query search

Priority: CurrentState: AppliesTo: Component: WaitingFor:
Urgent Closed Engine    
As observed in Support.Question354 there is no way to escape a character that participates in a macro for a query search.

There is a trivial fix - use \ as an escape character - but I'm concerned about the knock-on effects. Should I be?

Index: core/lib/Foswiki/Infix/Parser.pm
===================================================================
--- core/lib/Foswiki/Infix/Parser.pm   (revision 5795)
+++ core/lib/Foswiki/Infix/Parser.pm   (working copy)
@@ -217,6 +217,7 @@
             elsif ( $$input =~ s/^\s*(['"])(|.*?[^\\])\1// ) {
                 print STDERR "Tok: qs '$1'\n" if MONITOR_PARSER;
                 my $val = $2;
+                $val =~ s/(?<!\\)\\(.)/$1/g;
                 push( @opands,
                     $this->{client_class}
                       ->newLeaf( $val, $Foswiki::Infix::Node::STRING ) );
Index: UnitTestContrib/test/unit/QueryTests.pm
===================================================================
--- UnitTestContrib/test/unit/QueryTests.pm   (revision 5795)
+++ UnitTestContrib/test/unit/QueryTests.pm   (working copy)
@@ -74,6 +74,8 @@
         { name => "string", title => "String", value => "String" } );
     $meta->putKeyed( 'FIELD',
         { name => "boolean", title => "Boolean", value => "1" } );
+    $meta->putKeyed( 'FIELD',
+        { name => "macro", value => "%RED%" } );
 
     $meta->{_text} = "Green ideas sleep furiously";
 
@@ -113,6 +115,7 @@
     $this->check( "text",          "Green ideas sleep furiously" );
     $this->check( "string",        'String' );
     $this->check( "boolean",       1 );
+    $this->check( "macro",         '%RED%' );
 }
 
 sub test_meta_dot {
@@ -188,6 +191,9 @@
     $this->check( "string!='string'",             1 );
     $this->check( "string='string'",              0 );
     $this->check( "string~'string'",              0 );
+    $this->check( "macro='\%RED\%'",              1 );
+    $this->check( "macro~'\%RED?'",               1 );
+    $this->check( "macro~'?RED\%'",               1 );
 }
 
 sub test_num_uops {
-- CrawfordCurrie - 16 Dec 2009

FWIW, I've applied this patch to my server and, in addition to fixing the problem, I haven't (yet) noticed any adverse effects. Thanks!

-- BigBaaadBob - 17 Dec 2009

Committed to trunk.

-- CrawfordCurrie - 17 Dec 2009

ItemTemplate edit

Summary No way to escape macros in a query search
ReportedBy CrawfordCurrie
Codebase
SVN Range
AppliesTo Engine
Component
Priority Urgent
CurrentState Closed
WaitingFor
Checkins Foswikirev:5809
TargetRelease minor
ReleasedIn 1.1.0
Topic revision: r7 - 04 Oct 2010, KennethLavrsen
 
The copyright of the content on this website is held by the contributing authors, except where stated elsewhere. see CopyrightStatement. Creative Commons LicenseGet Foswiki at sourceforge.net. Fast, secure and Free Open Source software downloads