2727 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
2828 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2929 *
30- * $PostgreSQL: pgsql/src/backend/regex/regexec.c,v 1.27 2005/10/15 02:49:24 momjian Exp $
30+ * $PostgreSQL: pgsql/src/backend/regex/regexec.c,v 1.28 2010/02/01 02:45:29 tgl Exp $
3131 *
3232 */
3333
@@ -141,6 +141,7 @@ static intdissect(struct vars *, struct subre *, chr *, chr *);
141141static int condissect (struct vars * ,struct subre * ,chr * ,chr * );
142142static int altdissect (struct vars * ,struct subre * ,chr * ,chr * );
143143static int cdissect (struct vars * ,struct subre * ,chr * ,chr * );
144+ static int ccaptdissect (struct vars * ,struct subre * ,chr * ,chr * );
144145static int ccondissect (struct vars * ,struct subre * ,chr * ,chr * );
145146static int crevdissect (struct vars * ,struct subre * ,chr * ,chr * );
146147static int cbrdissect (struct vars * ,struct subre * ,chr * ,chr * );
@@ -560,27 +561,21 @@ dissect(struct vars * v,
560561case '=' :/* terminal node */
561562assert (t -> left == NULL && t -> right == NULL );
562563return REG_OKAY ;/* no action, parent did the work */
563- break ;
564564case '|' :/* alternation */
565565assert (t -> left != NULL );
566566return altdissect (v ,t ,begin ,end );
567- break ;
568567case 'b' :/* back ref -- shouldn't be calling us! */
569568return REG_ASSERT ;
570- break ;
571569case '.' :/* concatenation */
572570assert (t -> left != NULL && t -> right != NULL );
573571return condissect (v ,t ,begin ,end );
574- break ;
575572case '(' :/* capturing */
576573assert (t -> left != NULL && t -> right == NULL );
577574assert (t -> subno > 0 );
578575subset (v ,t ,begin ,end );
579576return dissect (v ,t -> left ,begin ,end );
580- break ;
581577default :
582578return REG_ASSERT ;
583- break ;
584579}
585580}
586581
@@ -710,8 +705,6 @@ cdissect(struct vars * v,
710705chr * begin ,/* beginning of relevant substring */
711706chr * end )/* end of same */
712707{
713- int er ;
714-
715708assert (t != NULL );
716709MDEBUG (("cdissect %ld-%ld %c\n" ,LOFF (begin ),LOFF (end ),t -> op ));
717710
@@ -720,33 +713,42 @@ cdissect(struct vars * v,
720713case '=' :/* terminal node */
721714assert (t -> left == NULL && t -> right == NULL );
722715return REG_OKAY ;/* no action, parent did the work */
723- break ;
724716case '|' :/* alternation */
725717assert (t -> left != NULL );
726718return caltdissect (v ,t ,begin ,end );
727- break ;
728719case 'b' :/* back ref -- shouldn't be calling us! */
729720assert (t -> left == NULL && t -> right == NULL );
730721return cbrdissect (v ,t ,begin ,end );
731- break ;
732722case '.' :/* concatenation */
733723assert (t -> left != NULL && t -> right != NULL );
734724return ccondissect (v ,t ,begin ,end );
735- break ;
736725case '(' :/* capturing */
737726assert (t -> left != NULL && t -> right == NULL );
738- assert (t -> subno > 0 );
739- er = cdissect (v ,t -> left ,begin ,end );
740- if (er == REG_OKAY )
741- subset (v ,t ,begin ,end );
742- return er ;
743- break ;
727+ return ccaptdissect (v ,t ,begin ,end );
744728default :
745729return REG_ASSERT ;
746- break ;
747730}
748731}
749732
733+ /*
734+ * ccaptdissect - capture subexpression matches (with complications)
735+ */
736+ static int /* regexec return code */
737+ ccaptdissect (struct vars * v ,
738+ struct subre * t ,
739+ chr * begin ,/* beginning of relevant substring */
740+ chr * end )/* end of same */
741+ {
742+ int er ;
743+
744+ assert (t -> subno > 0 );
745+
746+ er = cdissect (v ,t -> left ,begin ,end );
747+ if (er == REG_OKAY )
748+ subset (v ,t ,begin ,end );
749+ return er ;
750+ }
751+
750752/*
751753 * ccondissect - concatenation subexpression matches (with complications)
752754 * The retry memory stores the offset of the trial midpoint from begin,
@@ -804,17 +806,27 @@ ccondissect(struct vars * v,
804806for (;;)
805807{
806808/* try this midpoint on for size */
807- er = cdissect (v ,t -> left ,begin ,mid );
808- if (er == REG_OKAY &&
809- longest (v ,d2 ,mid ,end , (int * )NULL )== end &&
810- (er = cdissect (v ,t -> right ,mid ,end ))==
811- REG_OKAY )
812- break ;/* NOTE BREAK OUT */
813- if (er != REG_OKAY && er != REG_NOMATCH )
809+ if (longest (v ,d2 ,mid ,end , (int * )NULL )== end )
814810{
815- freedfa (d );
816- freedfa (d2 );
817- return er ;
811+ er = cdissect (v ,t -> left ,begin ,mid );
812+ if (er == REG_OKAY )
813+ {
814+ er = cdissect (v ,t -> right ,mid ,end );
815+ if (er == REG_OKAY )
816+ {
817+ /* satisfaction */
818+ MDEBUG (("successful\n" ));
819+ freedfa (d );
820+ freedfa (d2 );
821+ return REG_OKAY ;
822+ }
823+ }
824+ if (er != REG_OKAY && er != REG_NOMATCH )
825+ {
826+ freedfa (d );
827+ freedfa (d2 );
828+ return er ;
829+ }
818830}
819831
820832/* that midpoint didn't work, find a new one */
@@ -841,11 +853,8 @@ ccondissect(struct vars * v,
841853zapmem (v ,t -> right );
842854}
843855
844- /* satisfaction */
845- MDEBUG (("successful\n" ));
846- freedfa (d );
847- freedfa (d2 );
848- return REG_OKAY ;
856+ /* can't get here */
857+ return REG_ASSERT ;
849858}
850859
851860/*
@@ -904,17 +913,27 @@ crevdissect(struct vars * v,
904913for (;;)
905914{
906915/* try this midpoint on for size */
907- er = cdissect (v ,t -> left ,begin ,mid );
908- if (er == REG_OKAY &&
909- longest (v ,d2 ,mid ,end , (int * )NULL )== end &&
910- (er = cdissect (v ,t -> right ,mid ,end ))==
911- REG_OKAY )
912- break ;/* NOTE BREAK OUT */
913- if (er != REG_OKAY && er != REG_NOMATCH )
916+ if (longest (v ,d2 ,mid ,end , (int * )NULL )== end )
914917{
915- freedfa (d );
916- freedfa (d2 );
917- return er ;
918+ er = cdissect (v ,t -> left ,begin ,mid );
919+ if (er == REG_OKAY )
920+ {
921+ er = cdissect (v ,t -> right ,mid ,end );
922+ if (er == REG_OKAY )
923+ {
924+ /* satisfaction */
925+ MDEBUG (("successful\n" ));
926+ freedfa (d );
927+ freedfa (d2 );
928+ return REG_OKAY ;
929+ }
930+ }
931+ if (er != REG_OKAY && er != REG_NOMATCH )
932+ {
933+ freedfa (d );
934+ freedfa (d2 );
935+ return er ;
936+ }
918937}
919938
920939/* that midpoint didn't work, find a new one */
@@ -941,11 +960,8 @@ crevdissect(struct vars * v,
941960zapmem (v ,t -> right );
942961}
943962
944- /* satisfaction */
945- MDEBUG (("successful\n" ));
946- freedfa (d );
947- freedfa (d2 );
948- return REG_OKAY ;
963+ /* can't get here */
964+ return REG_ASSERT ;
949965}
950966
951967/*