如果select语句中包含max或min查询,直接返回WHERE_ORDERBY_MAX或WHERE_ORDERBY_MIN。如果不存在,返回0.
static u8 minMaxQuery(Select *p){ Expr *pExpr; /*声明一个表达式*/ ExprList *pEList = p->pEList;/*将SELECT的表达式列表赋值给表达式列表pEList*/ if( pEList->nExpr!=1 ) return WHERE_ORDERBY_NORMAL;/*如果表达式列表中的表达式个数不为1,返回WHERE_ORDERBY_NORMAL(默认)*/ pExpr = pEList->a[0].pExpr;/*靖表达式列中的第一个表达式赋值给pExpr*/ if( pExpr->op!=TK_AGG_FUNCTION ) return 0;/*如果表达式的操作不是TK_AGG_FUNCTION,直接返回0*/ if( NEVER(ExprHasProperty(pExpr, EP_xIsSelect)) ) return 0;/*如果表达式pExpr中含有EP_xIsSelect,返回0*/ pEList = pExpr->x.pList;/*将表达式中x的表达式列表赋值给pEList*/ if( pEList==0 || pEList->nExpr!=1 ) return 0;/*如果pEList为空或者表达式列表中表达式个数不为1,直接返回0*/ if( pEList->a[0].pExpr->op!=TK_AGG_COLUMN ) return WHERE_ORDERBY_NORMAL;/*如果表达式中操作不是TK_AGG_COLUMN,返回WHERE_ORDERBY_NORMAL(默认)*/ assert( !ExprHasProperty(pExpr, EP_IntValue) );/*插入断点,如果表达式pExpr中不含EP_xIsSelect,抛出错误信息*/ if( sqlite3StrICmp(pExpr->u.zToken,"min")==0 ){/*如果解析表达式中间字符串为min,返回WHERE_ORDERBY_MIN(最小值)*/ return WHERE_ORDERBY_MIN; }else if( sqlite3StrICmp(pExpr->u.zToken,"max")==0 ){/*如果解析表达式中间字符串为max,返回WHERE_ORDERBY_MAX(最大值)*/ return WHERE_ORDERBY_MAX; } return WHERE_ORDERBY_NORMAL;/*最后返回WHERE_ORDERBY_NORMAL(默认)*/ }