Changeset c929863ac8839608b81f31d8c7877cb11792961e

Show
Ignore:
Timestamp:
04/22/08 09:23:15 (9 months ago)
Author:
dave <dave@…>
Parents:
cafd8d281bdf982e2ac0b84d57dfbf9fed46603c
Children:
4ba05fcbd5ad0573c31ed6af7ac50f72f3d4b3e9, f6c33fd97eacd763370278addca885780e29e471
git-committer:
dave <dave@06fd6eb0-0002-0410-a719-e5602cce40bc> / 2008-04-21T23:23:15Z+0000
Message:

Fixed field specifier bug in QueryParser

The QueryParser now uses a stack to keep track of assigned fields in queries.
This means that the query;

f1:(aaa f2:bbb ccc)

will parse correctly as;

f1:aaa f2:bbb f1:ccc

Previously the ccc was either restricted to the default fields or got dropped
from the query all together.

PS: I've already checked this in and tried to dcommit it again and all of a
sudden the commit seems to have disappeared. I'm getting pretty tired of
git-svn.

git-svn-id: svn+ssh://davebalmain.com/home/dave/repos/ferret/trunk@1032 06fd6eb0-0002-0410-a719-e5602cce40bc

Location:
c
Files:
7 modified

Legend:

Unmodified
Added
Removed
  • c/include/internal.h

    r553474 rc92986  
    217217#define FieldInfos              FrtFieldInfos 
    218218#define FieldInverter           FrtFieldInverter 
     219#define FieldStack              FrtFieldStack 
    219220#define FieldsReader            FrtFieldsReader 
    220221#define FieldsWriter            FrtFieldsWriter 
  • c/include/search.h

    r553474 rc92986  
    893893#define FRT_QP_CONC_WORDS 2 
    894894#define FRT_QP_MAX_CLAUSES 512 
     895typedef struct FrtFieldStack { 
     896    FrtHashSet *fields; 
     897    struct FrtFieldStack *next; 
     898    bool destroy : 1; 
     899} FrtFieldStack; 
    895900 
    896901typedef struct FrtQParser 
     
    906911    int  buf_index; 
    907912    FrtHash *field_cache; 
    908     FrtHashSet *fields; 
    909     FrtHashSet *fields_buf; 
    910913    FrtHashSet *def_fields; 
    911914    FrtHashSet *all_fields; 
    912915    FrtHashSet *tokenized_fields; 
     916    FrtHashSet *fields; 
     917    FrtFieldStack *fields_top; 
    913918    FrtAnalyzer *analyzer; 
    914919    FrtHash *ts_cache; 
     
    920925    bool handle_parse_errors : 1; 
    921926    bool allow_any_fields : 1; 
    922     bool close_def_fields : 1; 
    923927    bool destruct : 1; 
    924928    bool recovering : 1; 
  • c/src/q_parser.c

    rcafd8d rc92986  
    9999 
    100100/* Copy the first part of user declarations.  */ 
    101 #line 3 "src/q_parser.y" 
     101#line 55 "src/q_parser.y" 
    102102 
    103103#include <string.h> 
    104104#include <ctype.h> 
    105105#include <wctype.h> 
     106#include <assert.h> 
    106107#include "except.h" 
    107108#include "search.h" 
     
    149150#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED 
    150151typedef union YYSTYPE 
    151 #line 31 "src/q_parser.y" 
     152#line 84 "src/q_parser.y" 
    152153{ 
    153154    Query *query; 
     
    159160} 
    160161/* Line 187 of yacc.c.  */ 
    161 #line 162 "src/q_parser.c" 
     162#line 163 "src/q_parser.c" 
    162163        YYSTYPE; 
    163164# define yystype YYSTYPE /* obsolescent; will be withdrawn */ 
     
    169170 
    170171/* Copy the second part of user declarations.  */ 
    171 #line 39 "src/q_parser.y" 
     172#line 92 "src/q_parser.y" 
    172173 
    173174static int yylex(YYSTYPE *lvalp, QParser *qp); 
     
    202203static Query *get_r_q(QParser *qp, char *field, char *from, char *to, 
    203204                      bool inc_lower, bool inc_upper); 
     205 
     206static void qp_push_fields(QParser *self, HashSet *fields, bool destroy); 
     207static void qp_pop_fields(QParser *self); 
    204208 
    205209#define FLDS(q, func) do {\ 
     
    246250 
    247251/* Line 216 of yacc.c.  */ 
    248 #line 249 "src/q_parser.c" 
     252#line 253 "src/q_parser.c" 
    249253 
    250254#ifdef short 
     
    549553static const yytype_uint8 yyrline[] = 
    550554{ 
    551        0,   133,   133,   134,   136,   137,   138,   139,   141,   142, 
    552      143,   145,   146,   148,   149,   150,   151,   152,   153,   154, 
    553      156,   157,   158,   160,   162,   162,   164,   164,   164,   167, 
    554      168,   170,   171,   172,   173,   175,   176,   177,   178,   179, 
    555      181,   182,   183,   184,   185,   186,   187,   188,   189,   190, 
    556      191,   192 
     555       0,   189,   189,   190,   192,   193,   194,   195,   197,   198, 
     556     199,   201,   202,   204,   205,   206,   207,   208,   209,   210, 
     557     212,   213,   214,   216,   218,   218,   220,   220,   220,   223, 
     558     224,   226,   227,   228,   229,   231,   232,   233,   234,   235, 
     559     237,   238,   239,   240,   241,   242,   243,   244,   245,   246, 
     560     247,   248 
    557561}; 
    558562#endif 
     
    12131217    { 
    12141218      case 27: /* "bool_q" */ 
    1215 #line 128 "src/q_parser.y" 
     1219#line 184 "src/q_parser.y" 
    12161220        { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 
    1217 #line 1218 "src/q_parser.c" 
     1221#line 1222 "src/q_parser.c" 
    12181222        break; 
    12191223      case 28: /* "bool_clss" */ 
    1220 #line 130 "src/q_parser.y" 
     1224#line 186 "src/q_parser.y" 
    12211225        { if ((yyvaluep->bclss) && qp->destruct) bca_destroy((yyvaluep->bclss)); }; 
    1222 #line 1223 "src/q_parser.c" 
     1226#line 1227 "src/q_parser.c" 
    12231227        break; 
    12241228      case 29: /* "bool_cls" */ 
    1225 #line 129 "src/q_parser.y" 
     1229#line 185 "src/q_parser.y" 
    12261230        { if ((yyvaluep->bcls) && qp->destruct) bc_deref((yyvaluep->bcls)); }; 
    1227 #line 1228 "src/q_parser.c" 
     1231#line 1232 "src/q_parser.c" 
    12281232        break; 
    12291233      case 30: /* "boosted_q" */ 
    1230 #line 128 "src/q_parser.y" 
     1234#line 184 "src/q_parser.y" 
    12311235        { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 
    1232 #line 1233 "src/q_parser.c" 
     1236#line 1237 "src/q_parser.c" 
    12331237        break; 
    12341238      case 31: /* "q" */ 
    1235 #line 128 "src/q_parser.y" 
     1239#line 184 "src/q_parser.y" 
    12361240        { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 
    1237 #line 1238 "src/q_parser.c" 
     1241#line 1242 "src/q_parser.c" 
    12381242        break; 
    12391243      case 32: /* "term_q" */ 
    1240 #line 128 "src/q_parser.y" 
     1244#line 184 "src/q_parser.y" 
    12411245        { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 
    1242 #line 1243 "src/q_parser.c" 
     1246#line 1247 "src/q_parser.c" 
    12431247        break; 
    12441248      case 33: /* "wild_q" */ 
    1245 #line 128 "src/q_parser.y" 
     1249#line 184 "src/q_parser.y" 
    12461250        { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 
    1247 #line 1248 "src/q_parser.c" 
     1251#line 1252 "src/q_parser.c" 
    12481252        break; 
    12491253      case 34: /* "field_q" */ 
    1250 #line 128 "src/q_parser.y" 
     1254#line 184 "src/q_parser.y" 
    12511255        { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 
    1252 #line 1253 "src/q_parser.c" 
     1256#line 1257 "src/q_parser.c" 
    12531257        break; 
    12541258      case 39: /* "phrase_q" */ 
    1255 #line 128 "src/q_parser.y" 
     1259#line 184 "src/q_parser.y" 
    12561260        { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 
    1257 #line 1258 "src/q_parser.c" 
     1261#line 1262 "src/q_parser.c" 
    12581262        break; 
    12591263      case 40: /* "ph_words" */ 
    1260 #line 131 "src/q_parser.y" 
     1264#line 187 "src/q_parser.y" 
    12611265        { if ((yyvaluep->phrase) && qp->destruct) ph_destroy((yyvaluep->phrase)); }; 
    1262 #line 1263 "src/q_parser.c" 
     1266#line 1267 "src/q_parser.c" 
    12631267        break; 
    12641268      case 41: /* "range_q" */ 
    1265 #line 128 "src/q_parser.y" 
     1269#line 184 "src/q_parser.y" 
    12661270        { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 
    1267 #line 1268 "src/q_parser.c" 
     1271#line 1272 "src/q_parser.c" 
    12681272        break; 
    12691273 
     
    15741578    { 
    15751579        case 2: 
    1576 #line 133 "src/q_parser.y" 
     1580#line 189 "src/q_parser.y" 
    15771581    {   qp->result = (yyval.query) = NULL; } 
    15781582    break; 
    15791583 
    15801584  case 3: 
    1581 #line 134 "src/q_parser.y" 
     1585#line 190 "src/q_parser.y" 
    15821586    { T qp->result = (yyval.query) = get_bool_q((yyvsp[(1) - (1)].bclss)); E } 
    15831587    break; 
    15841588 
    15851589  case 4: 
    1586 #line 136 "src/q_parser.y" 
     1590#line 192 "src/q_parser.y" 
    15871591    { T (yyval.bclss) = first_cls((yyvsp[(1) - (1)].bcls)); E } 
    15881592    break; 
    15891593 
    15901594  case 5: 
    1591 #line 137 "src/q_parser.y" 
     1595#line 193 "src/q_parser.y" 
    15921596    { T (yyval.bclss) = add_and_cls((yyvsp[(1) - (3)].bclss), (yyvsp[(3) - (3)].bcls)); E } 
    15931597    break; 
    15941598 
    15951599  case 6: 
    1596 #line 138 "src/q_parser.y" 
     1600#line 194 "src/q_parser.y" 
    15971601    { T (yyval.bclss) = add_or_cls((yyvsp[(1) - (3)].bclss), (yyvsp[(3) - (3)].bcls)); E } 
    15981602    break; 
    15991603 
    16001604  case 7: 
    1601 #line 139 "src/q_parser.y" 
     1605#line 195 "src/q_parser.y" 
    16021606    { T (yyval.bclss) = add_default_cls(qp, (yyvsp[(1) - (2)].bclss), (yyvsp[(2) - (2)].bcls)); E } 
    16031607    break; 
    16041608 
    16051609  case 8: 
    1606 #line 141 "src/q_parser.y" 
     1610#line 197 "src/q_parser.y" 
    16071611    { T (yyval.bcls) = get_bool_cls((yyvsp[(2) - (2)].query), BC_MUST); E } 
    16081612    break; 
    16091613 
    16101614  case 9: 
    1611 #line 142 "src/q_parser.y" 
     1615#line 198 "src/q_parser.y" 
    16121616    { T (yyval.bcls) = get_bool_cls((yyvsp[(2) - (2)].query), BC_MUST_NOT); E } 
    16131617    break; 
    16141618 
    16151619  case 10: 
    1616 #line 143 "src/q_parser.y" 
     1620#line 199 "src/q_parser.y" 
    16171621    { T (yyval.bcls) = get_bool_cls((yyvsp[(1) - (1)].query), BC_SHOULD); E } 
    16181622    break; 
    16191623 
    16201624  case 12: 
    1621 #line 146 "src/q_parser.y" 
     1625#line 202 "src/q_parser.y" 
    16221626    { T if ((yyvsp[(1) - (3)].query)) sscanf((yyvsp[(3) - (3)].str),"%f",&((yyvsp[(1) - (3)].query)->boost));  (yyval.query)=(yyvsp[(1) - (3)].query); E } 
    16231627    break; 
    16241628 
    16251629  case 14: 
    1626 #line 149 "src/q_parser.y" 
     1630#line 205 "src/q_parser.y" 
    16271631    { T (yyval.query) = bq_new_max(true, qp->max_clauses); E } 
    16281632    break; 
    16291633 
    16301634  case 15: 
    1631 #line 150 "src/q_parser.y" 
     1635#line 206 "src/q_parser.y" 
    16321636    { T (yyval.query) = get_bool_q((yyvsp[(2) - (3)].bclss)); E } 
    16331637    break; 
    16341638 
    16351639  case 20: 
    1636 #line 156 "src/q_parser.y" 
     1640#line 212 "src/q_parser.y" 
    16371641    { FLDS((yyval.query), get_term_q(qp, field, (yyvsp[(1) - (1)].str))); Y} 
    16381642    break; 
    16391643 
    16401644  case 21: 
    1641 #line 157 "src/q_parser.y" 
     1645#line 213 "src/q_parser.y" 
    16421646    { FLDS((yyval.query), get_fuzzy_q(qp, field, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str))); Y} 
    16431647    break; 
    16441648 
    16451649  case 22: 
    1646 #line 158 "src/q_parser.y" 
     1650#line 214 "src/q_parser.y" 
    16471651    { FLDS((yyval.query), get_fuzzy_q(qp, field, (yyvsp[(1) - (2)].str), NULL)); Y} 
    16481652    break; 
    16491653 
    16501654  case 23: 
    1651 #line 160 "src/q_parser.y" 
     1655#line 216 "src/q_parser.y" 
    16521656    { FLDS((yyval.query), get_wild_q(qp, field, (yyvsp[(1) - (1)].str))); Y} 
    16531657    break; 
    16541658 
    16551659  case 24: 
    1656 #line 162 "src/q_parser.y" 
    1657     { qp->fields = qp->def_fields; } 
     1660#line 218 "src/q_parser.y" 
     1661    { qp_pop_fields(qp); } 
    16581662    break; 
    16591663 
    16601664  case 25: 
    1661 #line 163 "src/q_parser.y" 
     1665#line 219 "src/q_parser.y" 
    16621666    { (yyval.query) = (yyvsp[(3) - (4)].query); } 
    16631667    break; 
    16641668 
    16651669  case 26: 
    1666 #line 164 "src/q_parser.y" 
    1667     { qp->fields = qp->all_fields; } 
     1670#line 220 "src/q_parser.y" 
     1671    { qp_push_fields(qp, qp->all_fields, false); } 
    16681672    break; 
    16691673 
    16701674  case 27: 
    1671 #line 164 "src/q_parser.y" 
    1672     {qp->fields = qp->def_fields;} 
     1675#line 220 "src/q_parser.y" 
     1676    { qp_pop_fields(qp); } 
    16731677    break; 
    16741678 
    16751679  case 28: 
    1676 #line 165 "src/q_parser.y" 
     1680#line 221 "src/q_parser.y" 
    16771681    { (yyval.query) = (yyvsp[(4) - (5)].query); } 
    16781682    break; 
    16791683 
    16801684  case 29: 
    1681 #line 167 "src/q_parser.y" 
     1685#line 223 "src/q_parser.y" 
    16821686    { (yyval.hashset) = first_field(qp, (yyvsp[(1) - (1)].str)); } 
    16831687    break; 
    16841688 
    16851689  case 30: 
    1686 #line 168 "src/q_parser.y" 
     1690#line 224 "src/q_parser.y" 
    16871691    { (yyval.hashset) = add_field(qp, (yyvsp[(3) - (3)].str));} 
    16881692    break; 
    16891693 
    16901694  case 31: 
    1691 #line 170 "src/q_parser.y" 
     1695#line 226 "src/q_parser.y" 
    16921696    { (yyval.query) = get_phrase_q(qp, (yyvsp[(2) - (3)].phrase), NULL); } 
    16931697    break; 
    16941698 
    16951699  case 32: 
    1696 #line 171 "src/q_parser.y" 
     1700#line 227 "src/q_parser.y" 
    16971701    { (yyval.query) = get_phrase_q(qp, (yyvsp[(2) - (5)].phrase), (yyvsp[(5) - (5)].str)); } 
    16981702    break; 
    16991703 
    17001704  case 33: 
    1701 #line 172 "src/q_parser.y" 
     1705#line 228 "src/q_parser.y" 
    17021706    { (yyval.query) = NULL; } 
    17031707    break; 
    17041708 
    17051709  case 34: 
    1706 #line 173 "src/q_parser.y" 
     1710#line 229 "src/q_parser.y" 
    17071711    { (yyval.query) = NULL; (void)(yyvsp[(4) - (4)].str);} 
    17081712    break; 
    17091713 
    17101714  case 35: 
    1711 #line 175 "src/q_parser.y" 
     1715#line 231 "src/q_parser.y" 
    17121716    { (yyval.phrase) = ph_first_word((yyvsp[(1) - (1)].str)); } 
    17131717    break; 
    17141718 
    17151719  case 36: 
    1716 #line 176 "src/q_parser.y" 
     1720#line 232 "src/q_parser.y" 
    17171721    { (yyval.phrase) = ph_first_word(NULL); } 
    17181722    break; 
    17191723 
    17201724  case 37: 
    1721 #line 177 "src/q_parser.y" 
     1725#line 233 "src/q_parser.y" 
    17221726    { (yyval.phrase) = ph_add_word((yyvsp[(1) - (2)].phrase), (yyvsp[(2) - (2)].str)); } 
    17231727    break; 
    17241728 
    17251729  case 38: 
    1726 #line 178 "src/q_parser.y" 
     1730#line 234 "src/q_parser.y" 
    17271731    { (yyval.phrase) = ph_add_word((yyvsp[(1) - (3)].phrase), NULL); } 
    17281732    break; 
    17291733 
    17301734  case 39: 
    1731 #line 179 "src/q_parser.y" 
     1735#line 235 "src/q_parser.y" 
    17321736    { (yyval.phrase) = ph_add_multi_word((yyvsp[(1) - (3)].phrase), (yyvsp[(3) - (3)].str));  } 
    17331737    break; 
    17341738 
    17351739  case 40: 
    1736 #line 181 "src/q_parser.y" 
     1740#line 237 "src/q_parser.y" 
    17371741    { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str),  (yyvsp[(3) - (4)].str),  true,  true)); Y} 
    17381742    break; 
    17391743 
    17401744  case 41: 
    1741 #line 182 "src/q_parser.y" 
     1745#line 238 "src/q_parser.y" 
    17421746    { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str),  (yyvsp[(3) - (4)].str),  true,  false)); Y} 
    17431747    break; 
    17441748 
    17451749  case 42: 
    1746 #line 183 "src/q_parser.y" 
     1750#line 239 "src/q_parser.y" 
    17471751    { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str),  (yyvsp[(3) - (4)].str),  false, true)); Y} 
    17481752    break; 
    17491753 
    17501754  case 43: 
    1751 #line 184 "src/q_parser.y" 
     1755#line 240 "src/q_parser.y" 
    17521756    { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str),  (yyvsp[(3) - (4)].str),  false, false)); Y} 
    17531757    break; 
    17541758 
    17551759  case 44: 
    1756 #line 185 "src/q_parser.y" 
     1760#line 241 "src/q_parser.y" 
    17571761    { FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (3)].str),  false, false)); Y} 
    17581762    break; 
    17591763 
    17601764  case 45: 
    1761 #line 186 "src/q_parser.y" 
     1765#line 242 "src/q_parser.y" 
    17621766    { FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (3)].str),  false, true)); Y} 
    17631767    break; 
    17641768 
    17651769  case 46: 
    1766 #line 187 "src/q_parser.y" 
     1770#line 243 "src/q_parser.y" 
    17671771    { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (3)].str),  NULL,true,  false)); Y} 
    17681772    break; 
    17691773 
    17701774  case 47: 
    1771 #line 188 "src/q_parser.y" 
     1775#line 244 "src/q_parser.y" 
    17721776    { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (3)].str),  NULL,false, false)); Y} 
    17731777    break; 
    17741778 
    17751779  case 48: 
    1776 #line 189 "src/q_parser.y" 
     1780#line 245 "src/q_parser.y" 
    17771781    { FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (2)].str),  false, false)); Y} 
    17781782    break; 
    17791783 
    17801784  case 49: 
    1781 #line 190 "src/q_parser.y" 
     1785#line 246 "src/q_parser.y" 
    17821786    { FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(3) - (3)].str),  false, true)); Y} 
    17831787    break; 
    17841788 
    17851789  case 50: 
    1786 #line 191 "src/q_parser.y" 
     1790#line 247 "src/q_parser.y" 
    17871791    { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(3) - (3)].str),  NULL,true,  false)); Y} 
    17881792    break; 
    17891793 
    17901794  case 51: 
    1791 #line 192 "src/q_parser.y" 
     1795#line 248 "src/q_parser.y" 
    17921796    { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (2)].str),  NULL,false, false)); Y} 
    17931797    break; 
     
    17951799 
    17961800/* Line 1267 of yacc.c.  */ 
    1797 #line 1798 "src/q_parser.c" 
     1801#line 1802 "src/q_parser.c" 
    17981802      default: break; 
    17991803    } 
     
    20092013 
    20102014 
    2011 #line 194 "src/q_parser.y" 
     2015#line 250 "src/q_parser.y" 
    20122016 
    20132017 
     
    24082412} 
    24092413 
     2414// XXX 
    24102415static HashSet *first_field(QParser *qp, char *field) 
    24112416{ 
    2412     qp->fields = qp->fields_buf; 
    2413     hs_clear(qp->fields); 
     2417    qp_push_fields(qp, hs_new_str(NULL), true); 
    24142418    return add_field(qp, field); 
    24152419} 
     
    26222626} 
    26232627 
     2628static void qp_push_fields(QParser *self, HashSet *fields, bool destroy) 
     2629{ 
     2630    FieldStack *fs = ALLOC(FieldStack);  
     2631 
     2632    fs->next    = self->fields_top; 
     2633    fs->fields  = fields; 
     2634    fs->destroy = destroy; 
     2635 
     2636    self->fields_top = fs; 
     2637    self->fields = fields; 
     2638} 
     2639 
     2640static void qp_pop_fields(QParser *self) 
     2641{ 
     2642    FieldStack *fs = self->fields_top;  
     2643 
     2644    if (fs->destroy) { 
     2645        hs_destroy(fs->fields); 
     2646    } 
     2647    self->fields_top = fs->next; 
     2648    if (self->fields_top) { 
     2649        self->fields = self->fields_top->fields; 
     2650    } 
     2651    free(fs); 
     2652} 
     2653 
    26242654void qp_destroy(QParser *self) 
    26252655{ 
    2626     if (self->close_def_fields) { 
     2656    if (self->def_fields != self->all_fields) { 
    26272657        hs_destroy(self->def_fields); 
    26282658    } 
     
    26342664    } 
    26352665    hs_destroy(self->all_fields); 
    2636     hs_destroy(self->fields_buf); 
    2637     h_destroy(self->field_cache); 
     2666 
     2667    qp_pop_fields(self); 
     2668    assert(NULL == self->fields_top); 
     2669 
    26382670    h_destroy(self->ts_cache); 
    26392671    tk_destroy(self->non_tokenizer); 
     
    26462678{ 
    26472679    QParser *self = ALLOC(QParser); 
    2648     HashSetEntry *hse; 
    26492680    self->or_default = true; 
    26502681    self->wild_lower = true; 
     
    26562687    self->use_typed_range_query = false; 
    26572688    self->def_slop = 0; 
    2658     self->fields_buf = hs_new_str(NULL); 
    26592689    self->all_fields = all_fields; 
    26602690    self->tokenized_fields = tokenized_fields; 
     
    26672697            } 
    26682698        } 
    2669         self->close_def_fields = true; 
    26702699    } 
    26712700    else { 
    26722701        self->def_fields = all_fields; 
    2673         self->close_def_fields = false; 
    2674     } 
    2675     self->field_cache = h_new_str((free_ft)NULL, (free_ft)NULL); 
    2676     for (hse = self->all_fields->first; hse; hse = hse->next) { 
    2677         char *field = (char *)hse->elem; 
    2678         h_set(self->field_cache, field, field); 
    2679     } 
    2680     self->fields = self->def_fields; 
     2702    } 
     2703    self->fields_top = NULL; 
     2704    qp_push_fields(self, self->def_fields, false); 
     2705 
    26812706    /* make sure all_fields contains the default fields */ 
    26822707    self->analyzer = analyzer; 
     
    26982723} 
    26992724 
     2725/***************************************************************************** 
     2726 * qp_clean_str method which basically scans the query string and ensures that 
     2727 * all open and close parentheses '()' and quotes '"' are balanced. It does 
     2728 * this be inserting or appending extra parentheses or quotes which is not 
     2729 * necessarily going to be exactly what the user wanted but it will help 
     2730 * prevent the parser from failing so it's the best we can do at this stage. 
     2731 * It also checks  
     2732 *****************************************************************************/ 
    27002733char *qp_clean_str(char *str) 
    27012734{ 
  • c/src/q_parser.y

    rcafd8d rc92986  
    5757#include <ctype.h> 
    5858#include <wctype.h> 
     59#include <assert.h> 
    5960#include "except.h" 
    6061#include "search.h" 
     
    121122static Query *get_r_q(QParser *qp, char *field, char *from, char *to, 
    122123                      bool inc_lower, bool inc_upper); 
     124 
     125static void qp_push_fields(QParser *self, HashSet *fields, bool destroy); 
     126static void qp_pop_fields(QParser *self); 
    123127 
    124128#define FLDS(q, func) do {\ 
     
    212216wild_q    : WILD_STR                  { FLDS($$, get_wild_q(qp, field, $1)); Y} 
    213217          ; 
    214 field_q   : field ':' q { qp->fields = qp->def_fields; } 
     218field_q   : field ':' q { qp_pop_fields(qp); } 
    215219                                      { $$ = $3; } 
    216           | '*' { qp->fields = qp->all_fields; } ':' q {qp->fields = qp->def_fields;} 
     220          | '*' { qp_push_fields(qp, qp->all_fields, false); } ':' q { qp_pop_fields(qp); } 
    217221                                      { $$ = $4; } 
    218222          ; 
     
    642646} 
    643647 
     648// XXX 
    644649static HashSet *first_field(QParser *qp, char *field) 
    645650{ 
    646     qp->fields = qp->fields_buf; 
    647     hs_clear(qp->fields); 
     651&