code: func getNameValuePairs(nvPairs []nameValuePair, expr ast.ExprNode) []nameValuePair {
  	binOp, ok := expr.(*ast.BinaryOperationExpr)
  	if !ok {
  		return nil
  	}
  	if binOp.Op == opcode.LogicAnd {
  		nvPairs = getNameValuePairs(nvPairs, binOp.L)
  		if nvPairs == nil {
  			return nil
  		}
  		nvPairs = getNameValuePairs(nvPairs, binOp.R)
  		if nvPairs == nil {
  			return nil
  		}
  		return nvPairs
  	} else if binOp.Op == opcode.EQ {
  		var d types.Datum
  		var colName *ast.ColumnNameExpr
  		var param *driver.ParamMarkerExpr
  		var ok bool
  		if colName, ok = binOp.L.(*ast.ColumnNameExpr); ok {
  			switch x := binOp.R.(type) {
  			case *driver.ValueExpr:
  				d = x.Datum
  			case *driver.ParamMarkerExpr:
  				d = x.Datum
  				param = x
  			}
  		} else if colName, ok = binOp.R.(*ast.ColumnNameExpr); ok {
  			switch x := binOp.L.(type) {
  			case *driver.ValueExpr:
  				d = x.Datum
  			case *driver.ParamMarkerExpr:
  				d = x.Datum
  				param = x
  			}
  		} else {
  			return nil
  		}
  		if d.IsNull() {
  			return nil
  		}
  		return append(nvPairs, nameValuePair{colName: colName.Name.Name.L, value: d, param: param})
  	}
  	return nil
  }
docs: // getNameValuePairs extracts `column = constant/paramMarker` conditions from expr as name value pairs.