Changeset c929863ac8839608b81f31d8c7877cb11792961e
- Timestamp:
- 04/22/08 09:23:15 (9 months ago)
- Parents:
- cafd8d281bdf982e2ac0b84d57dfbf9fed46603c
- Children:
- 4ba05fcbd5ad0573c31ed6af7ac50f72f3d4b3e9, f6c33fd97eacd763370278addca885780e29e471
- git-committer:
- dave <dave@06fd6eb0-0002-0410-a719-e5602cce40bc> / 2008-04-21T23:23:15Z+0000
- Location:
- c
- Files:
-
- 7 modified
-
include/internal.h (modified) (1 diff)
-
include/search.h (modified) (3 diffs)
-
src/q_parser.c (modified) (18 diffs)
-
src/q_parser.y (modified) (9 diffs)
-
src/scanner.c (modified) (2 diffs)
-
src/scanner_mb.c (modified) (2 diffs)
-
test/test_q_parser.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
c/include/internal.h
r553474 rc92986 217 217 #define FieldInfos FrtFieldInfos 218 218 #define FieldInverter FrtFieldInverter 219 #define FieldStack FrtFieldStack 219 220 #define FieldsReader FrtFieldsReader 220 221 #define FieldsWriter FrtFieldsWriter -
c/include/search.h
r553474 rc92986 893 893 #define FRT_QP_CONC_WORDS 2 894 894 #define FRT_QP_MAX_CLAUSES 512 895 typedef struct FrtFieldStack { 896 FrtHashSet *fields; 897 struct FrtFieldStack *next; 898 bool destroy : 1; 899 } FrtFieldStack; 895 900 896 901 typedef struct FrtQParser … … 906 911 int buf_index; 907 912 FrtHash *field_cache; 908 FrtHashSet *fields;909 FrtHashSet *fields_buf;910 913 FrtHashSet *def_fields; 911 914 FrtHashSet *all_fields; 912 915 FrtHashSet *tokenized_fields; 916 FrtHashSet *fields; 917 FrtFieldStack *fields_top; 913 918 FrtAnalyzer *analyzer; 914 919 FrtHash *ts_cache; … … 920 925 bool handle_parse_errors : 1; 921 926 bool allow_any_fields : 1; 922 bool close_def_fields : 1;923 927 bool destruct : 1; 924 928 bool recovering : 1; -
c/src/q_parser.c
rcafd8d rc92986 99 99 100 100 /* Copy the first part of user declarations. */ 101 #line 3"src/q_parser.y"101 #line 55 "src/q_parser.y" 102 102 103 103 #include <string.h> 104 104 #include <ctype.h> 105 105 #include <wctype.h> 106 #include <assert.h> 106 107 #include "except.h" 107 108 #include "search.h" … … 149 150 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED 150 151 typedef union YYSTYPE 151 #line 31"src/q_parser.y"152 #line 84 "src/q_parser.y" 152 153 { 153 154 Query *query; … … 159 160 } 160 161 /* Line 187 of yacc.c. */ 161 #line 16 2"src/q_parser.c"162 #line 163 "src/q_parser.c" 162 163 YYSTYPE; 163 164 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ … … 169 170 170 171 /* Copy the second part of user declarations. */ 171 #line 39"src/q_parser.y"172 #line 92 "src/q_parser.y" 172 173 173 174 static int yylex(YYSTYPE *lvalp, QParser *qp); … … 202 203 static Query *get_r_q(QParser *qp, char *field, char *from, char *to, 203 204 bool inc_lower, bool inc_upper); 205 206 static void qp_push_fields(QParser *self, HashSet *fields, bool destroy); 207 static void qp_pop_fields(QParser *self); 204 208 205 209 #define FLDS(q, func) do {\ … … 246 250 247 251 /* Line 216 of yacc.c. */ 248 #line 2 49"src/q_parser.c"252 #line 253 "src/q_parser.c" 249 253 250 254 #ifdef short … … 549 553 static const yytype_uint8 yyrline[] = 550 554 { 551 0, 1 33, 133, 134, 136, 137, 138, 139, 141, 142,552 1 43, 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, 192555 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 557 561 }; 558 562 #endif … … 1213 1217 { 1214 1218 case 27: /* "bool_q" */ 1215 #line 1 28"src/q_parser.y"1219 #line 184 "src/q_parser.y" 1216 1220 { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 1217 #line 12 18"src/q_parser.c"1221 #line 1222 "src/q_parser.c" 1218 1222 break; 1219 1223 case 28: /* "bool_clss" */ 1220 #line 1 30"src/q_parser.y"1224 #line 186 "src/q_parser.y" 1221 1225 { if ((yyvaluep->bclss) && qp->destruct) bca_destroy((yyvaluep->bclss)); }; 1222 #line 122 3"src/q_parser.c"1226 #line 1227 "src/q_parser.c" 1223 1227 break; 1224 1228 case 29: /* "bool_cls" */ 1225 #line 1 29"src/q_parser.y"1229 #line 185 "src/q_parser.y" 1226 1230 { if ((yyvaluep->bcls) && qp->destruct) bc_deref((yyvaluep->bcls)); }; 1227 #line 12 28"src/q_parser.c"1231 #line 1232 "src/q_parser.c" 1228 1232 break; 1229 1233 case 30: /* "boosted_q" */ 1230 #line 1 28"src/q_parser.y"1234 #line 184 "src/q_parser.y" 1231 1235 { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 1232 #line 123 3"src/q_parser.c"1236 #line 1237 "src/q_parser.c" 1233 1237 break; 1234 1238 case 31: /* "q" */ 1235 #line 1 28"src/q_parser.y"1239 #line 184 "src/q_parser.y" 1236 1240 { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 1237 #line 12 38"src/q_parser.c"1241 #line 1242 "src/q_parser.c" 1238 1242 break; 1239 1243 case 32: /* "term_q" */ 1240 #line 1 28"src/q_parser.y"1244 #line 184 "src/q_parser.y" 1241 1245 { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 1242 #line 124 3"src/q_parser.c"1246 #line 1247 "src/q_parser.c" 1243 1247 break; 1244 1248 case 33: /* "wild_q" */ 1245 #line 1 28"src/q_parser.y"1249 #line 184 "src/q_parser.y" 1246 1250 { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 1247 #line 12 48"src/q_parser.c"1251 #line 1252 "src/q_parser.c" 1248 1252 break; 1249 1253 case 34: /* "field_q" */ 1250 #line 1 28"src/q_parser.y"1254 #line 184 "src/q_parser.y" 1251 1255 { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 1252 #line 125 3"src/q_parser.c"1256 #line 1257 "src/q_parser.c" 1253 1257 break; 1254 1258 case 39: /* "phrase_q" */ 1255 #line 1 28"src/q_parser.y"1259 #line 184 "src/q_parser.y" 1256 1260 { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 1257 #line 12 58"src/q_parser.c"1261 #line 1262 "src/q_parser.c" 1258 1262 break; 1259 1263 case 40: /* "ph_words" */ 1260 #line 1 31"src/q_parser.y"1264 #line 187 "src/q_parser.y" 1261 1265 { if ((yyvaluep->phrase) && qp->destruct) ph_destroy((yyvaluep->phrase)); }; 1262 #line 126 3"src/q_parser.c"1266 #line 1267 "src/q_parser.c" 1263 1267 break; 1264 1268 case 41: /* "range_q" */ 1265 #line 1 28"src/q_parser.y"1269 #line 184 "src/q_parser.y" 1266 1270 { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 1267 #line 12 68"src/q_parser.c"1271 #line 1272 "src/q_parser.c" 1268 1272 break; 1269 1273 … … 1574 1578 { 1575 1579 case 2: 1576 #line 1 33"src/q_parser.y"1580 #line 189 "src/q_parser.y" 1577 1581 { qp->result = (yyval.query) = NULL; } 1578 1582 break; 1579 1583 1580 1584 case 3: 1581 #line 1 34"src/q_parser.y"1585 #line 190 "src/q_parser.y" 1582 1586 { T qp->result = (yyval.query) = get_bool_q((yyvsp[(1) - (1)].bclss)); E } 1583 1587 break; 1584 1588 1585 1589 case 4: 1586 #line 1 36"src/q_parser.y"1590 #line 192 "src/q_parser.y" 1587 1591 { T (yyval.bclss) = first_cls((yyvsp[(1) - (1)].bcls)); E } 1588 1592 break; 1589 1593 1590 1594 case 5: 1591 #line 1 37"src/q_parser.y"1595 #line 193 "src/q_parser.y" 1592 1596 { T (yyval.bclss) = add_and_cls((yyvsp[(1) - (3)].bclss), (yyvsp[(3) - (3)].bcls)); E } 1593 1597 break; 1594 1598 1595 1599 case 6: 1596 #line 1 38"src/q_parser.y"1600 #line 194 "src/q_parser.y" 1597 1601 { T (yyval.bclss) = add_or_cls((yyvsp[(1) - (3)].bclss), (yyvsp[(3) - (3)].bcls)); E } 1598 1602 break; 1599 1603 1600 1604 case 7: 1601 #line 1 39"src/q_parser.y"1605 #line 195 "src/q_parser.y" 1602 1606 { T (yyval.bclss) = add_default_cls(qp, (yyvsp[(1) - (2)].bclss), (yyvsp[(2) - (2)].bcls)); E } 1603 1607 break; 1604 1608 1605 1609 case 8: 1606 #line 1 41"src/q_parser.y"1610 #line 197 "src/q_parser.y" 1607 1611 { T (yyval.bcls) = get_bool_cls((yyvsp[(2) - (2)].query), BC_MUST); E } 1608 1612 break; 1609 1613 1610 1614 case 9: 1611 #line 1 42"src/q_parser.y"1615 #line 198 "src/q_parser.y" 1612 1616 { T (yyval.bcls) = get_bool_cls((yyvsp[(2) - (2)].query), BC_MUST_NOT); E } 1613 1617 break; 1614 1618 1615 1619 case 10: 1616 #line 1 43"src/q_parser.y"1620 #line 199 "src/q_parser.y" 1617 1621 { T (yyval.bcls) = get_bool_cls((yyvsp[(1) - (1)].query), BC_SHOULD); E } 1618 1622 break; 1619 1623 1620 1624 case 12: 1621 #line 146"src/q_parser.y"1625 #line 202 "src/q_parser.y" 1622 1626 { T if ((yyvsp[(1) - (3)].query)) sscanf((yyvsp[(3) - (3)].str),"%f",&((yyvsp[(1) - (3)].query)->boost)); (yyval.query)=(yyvsp[(1) - (3)].query); E } 1623 1627 break; 1624 1628 1625 1629 case 14: 1626 #line 149"src/q_parser.y"1630 #line 205 "src/q_parser.y" 1627 1631 { T (yyval.query) = bq_new_max(true, qp->max_clauses); E } 1628 1632 break; 1629 1633 1630 1634 case 15: 1631 #line 150"src/q_parser.y"1635 #line 206 "src/q_parser.y" 1632 1636 { T (yyval.query) = get_bool_q((yyvsp[(2) - (3)].bclss)); E } 1633 1637 break; 1634 1638 1635 1639 case 20: 1636 #line 156"src/q_parser.y"1640 #line 212 "src/q_parser.y" 1637 1641 { FLDS((yyval.query), get_term_q(qp, field, (yyvsp[(1) - (1)].str))); Y} 1638 1642 break; 1639 1643 1640 1644 case 21: 1641 #line 157"src/q_parser.y"1645 #line 213 "src/q_parser.y" 1642 1646 { FLDS((yyval.query), get_fuzzy_q(qp, field, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str))); Y} 1643 1647 break; 1644 1648 1645 1649 case 22: 1646 #line 158"src/q_parser.y"1650 #line 214 "src/q_parser.y" 1647 1651 { FLDS((yyval.query), get_fuzzy_q(qp, field, (yyvsp[(1) - (2)].str), NULL)); Y} 1648 1652 break; 1649 1653 1650 1654 case 23: 1651 #line 160"src/q_parser.y"1655 #line 216 "src/q_parser.y" 1652 1656 { FLDS((yyval.query), get_wild_q(qp, field, (yyvsp[(1) - (1)].str))); Y} 1653 1657 break; 1654 1658 1655 1659 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); } 1658 1662 break; 1659 1663 1660 1664 case 25: 1661 #line 163"src/q_parser.y"1665 #line 219 "src/q_parser.y" 1662 1666 { (yyval.query) = (yyvsp[(3) - (4)].query); } 1663 1667 break; 1664 1668 1665 1669 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); } 1668 1672 break; 1669 1673 1670 1674 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); } 1673 1677 break; 1674 1678 1675 1679 case 28: 1676 #line 165"src/q_parser.y"1680 #line 221 "src/q_parser.y" 1677 1681 { (yyval.query) = (yyvsp[(4) - (5)].query); } 1678 1682 break; 1679 1683 1680 1684 case 29: 1681 #line 167"src/q_parser.y"1685 #line 223 "src/q_parser.y" 1682 1686 { (yyval.hashset) = first_field(qp, (yyvsp[(1) - (1)].str)); } 1683 1687 break; 1684 1688 1685 1689 case 30: 1686 #line 168"src/q_parser.y"1690 #line 224 "src/q_parser.y" 1687 1691 { (yyval.hashset) = add_field(qp, (yyvsp[(3) - (3)].str));} 1688 1692 break; 1689 1693 1690 1694 case 31: 1691 #line 170"src/q_parser.y"1695 #line 226 "src/q_parser.y" 1692 1696 { (yyval.query) = get_phrase_q(qp, (yyvsp[(2) - (3)].phrase), NULL); } 1693 1697 break; 1694 1698 1695 1699 case 32: 1696 #line 171"src/q_parser.y"1700 #line 227 "src/q_parser.y" 1697 1701 { (yyval.query) = get_phrase_q(qp, (yyvsp[(2) - (5)].phrase), (yyvsp[(5) - (5)].str)); } 1698 1702 break; 1699 1703 1700 1704 case 33: 1701 #line 172"src/q_parser.y"1705 #line 228 "src/q_parser.y" 1702 1706 { (yyval.query) = NULL; } 1703 1707 break; 1704 1708 1705 1709 case 34: 1706 #line 173"src/q_parser.y"1710 #line 229 "src/q_parser.y" 1707 1711 { (yyval.query) = NULL; (void)(yyvsp[(4) - (4)].str);} 1708 1712 break; 1709 1713 1710 1714 case 35: 1711 #line 175"src/q_parser.y"1715 #line 231 "src/q_parser.y" 1712 1716 { (yyval.phrase) = ph_first_word((yyvsp[(1) - (1)].str)); } 1713 1717 break; 1714 1718 1715 1719 case 36: 1716 #line 176"src/q_parser.y"1720 #line 232 "src/q_parser.y" 1717 1721 { (yyval.phrase) = ph_first_word(NULL); } 1718 1722 break; 1719 1723 1720 1724 case 37: 1721 #line 177"src/q_parser.y"1725 #line 233 "src/q_parser.y" 1722 1726 { (yyval.phrase) = ph_add_word((yyvsp[(1) - (2)].phrase), (yyvsp[(2) - (2)].str)); } 1723 1727 break; 1724 1728 1725 1729 case 38: 1726 #line 178"src/q_parser.y"1730 #line 234 "src/q_parser.y" 1727 1731 { (yyval.phrase) = ph_add_word((yyvsp[(1) - (3)].phrase), NULL); } 1728 1732 break; 1729 1733 1730 1734 case 39: 1731 #line 179"src/q_parser.y"1735 #line 235 "src/q_parser.y" 1732 1736 { (yyval.phrase) = ph_add_multi_word((yyvsp[(1) - (3)].phrase), (yyvsp[(3) - (3)].str)); } 1733 1737 break; 1734 1738 1735 1739 case 40: 1736 #line 181"src/q_parser.y"1740 #line 237 "src/q_parser.y" 1737 1741 { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), true, true)); Y} 1738 1742 break; 1739 1743 1740 1744 case 41: 1741 #line 182"src/q_parser.y"1745 #line 238 "src/q_parser.y" 1742 1746 { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), true, false)); Y} 1743 1747 break; 1744 1748 1745 1749 case 42: 1746 #line 183"src/q_parser.y"1750 #line 239 "src/q_parser.y" 1747 1751 { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), false, true)); Y} 1748 1752 break; 1749 1753 1750 1754 case 43: 1751 #line 184"src/q_parser.y"1755 #line 240 "src/q_parser.y" 1752 1756 { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), false, false)); Y} 1753 1757 break; 1754 1758 1755 1759 case 44: 1756 #line 185"src/q_parser.y"1760 #line 241 "src/q_parser.y" 1757 1761 { FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (3)].str), false, false)); Y} 1758 1762 break; 1759 1763 1760 1764 case 45: 1761 #line 186"src/q_parser.y"1765 #line 242 "src/q_parser.y" 1762 1766 { FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (3)].str), false, true)); Y} 1763 1767 break; 1764 1768 1765 1769 case 46: 1766 #line 187"src/q_parser.y"1770 #line 243 "src/q_parser.y" 1767 1771 { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (3)].str), NULL,true, false)); Y} 1768 1772 break; 1769 1773 1770 1774 case 47: 1771 #line 188"src/q_parser.y"1775 #line 244 "src/q_parser.y" 1772 1776 { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (3)].str), NULL,false, false)); Y} 1773 1777 break; 1774 1778 1775 1779 case 48: 1776 #line 189"src/q_parser.y"1780 #line 245 "src/q_parser.y" 1777 1781 { FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (2)].str), false, false)); Y} 1778 1782 break; 1779 1783 1780 1784 case 49: 1781 #line 190"src/q_parser.y"1785 #line 246 "src/q_parser.y" 1782 1786 { FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(3) - (3)].str), false, true)); Y} 1783 1787 break; 1784 1788 1785 1789 case 50: 1786 #line 191"src/q_parser.y"1790 #line 247 "src/q_parser.y" 1787 1791 { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(3) - (3)].str), NULL,true, false)); Y} 1788 1792 break; 1789 1793 1790 1794 case 51: 1791 #line 192"src/q_parser.y"1795 #line 248 "src/q_parser.y" 1792 1796 { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (2)].str), NULL,false, false)); Y} 1793 1797 break; … … 1795 1799 1796 1800 /* Line 1267 of yacc.c. */ 1797 #line 1 798"src/q_parser.c"1801 #line 1802 "src/q_parser.c" 1798 1802 default: break; 1799 1803 } … … 2009 2013 2010 2014 2011 #line 194"src/q_parser.y"2015 #line 250 "src/q_parser.y" 2012 2016 2013 2017 … … 2408 2412 } 2409 2413 2414 // XXX 2410 2415 static HashSet *first_field(QParser *qp, char *field) 2411 2416 { 2412 qp->fields = qp->fields_buf; 2413 hs_clear(qp->fields); 2417 qp_push_fields(qp, hs_new_str(NULL), true); 2414 2418 return add_field(qp, field); 2415 2419 } … … 2622 2626 } 2623 2627 2628 static 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 2640 static 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 2624 2654 void qp_destroy(QParser *self) 2625 2655 { 2626 if (self-> close_def_fields) {2656 if (self->def_fields != self->all_fields) { 2627 2657 hs_destroy(self->def_fields); 2628 2658 } … … 2634 2664 } 2635 2665 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 2638 2670 h_destroy(self->ts_cache); 2639 2671 tk_destroy(self->non_tokenizer); … … 2646 2678 { 2647 2679 QParser *self = ALLOC(QParser); 2648 HashSetEntry *hse;2649 2680 self->or_default = true; 2650 2681 self->wild_lower = true; … … 2656 2687 self->use_typed_range_query = false; 2657 2688 self->def_slop = 0; 2658 self->fields_buf = hs_new_str(NULL);2659 2689 self->all_fields = all_fields; 2660 2690 self->tokenized_fields = tokenized_fields; … … 2667 2697 } 2668 2698 } 2669 self->close_def_fields = true;2670 2699 } 2671 2700 else { 2672 2701 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 2681 2706 /* make sure all_fields contains the default fields */ 2682 2707 self->analyzer = analyzer; … … 2698 2723 } 2699 2724 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 *****************************************************************************/ 2700 2733 char *qp_clean_str(char *str) 2701 2734 { -
c/src/q_parser.y
rcafd8d rc92986 57 57 #include <ctype.h> 58 58 #include <wctype.h> 59 #include <assert.h> 59 60 #include "except.h" 60 61 #include "search.h" … … 121 122 static Query *get_r_q(QParser *qp, char *field, char *from, char *to, 122 123 bool inc_lower, bool inc_upper); 124 125 static void qp_push_fields(QParser *self, HashSet *fields, bool destroy); 126 static void qp_pop_fields(QParser *self); 123 127 124 128 #define FLDS(q, func) do {\ … … 212 216 wild_q : WILD_STR { FLDS($$, get_wild_q(qp, field, $1)); Y} 213 217 ; 214 field_q : field ':' q { qp ->fields = qp->def_fields; }218 field_q : field ':' q { qp_pop_fields(qp); } 215 219 { $$ = $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); } 217 221 { $$ = $4; } 218 222 ; … … 642 646 } 643 647 648 // XXX 644 649 static HashSet *first_field(QParser *qp, char *field) 645 650 { 646 qp->fields = qp->fields_buf; 647 hs_clear(qp->fields); 651 &
