(s2aCtx *SQL2AqlContext)
| 1734 | } |
| 1735 | |
| 1736 | func (v *ASTBuilder) isValidWithOrSubQuery(s2aCtx *SQL2AqlContext) (bool, error) { |
| 1737 | var isTrue, exist bool |
| 1738 | var err error |
| 1739 | var mapKey int |
| 1740 | |
| 1741 | // check if from clause in main query(ie. qLevel = 0) mix table with subquery/withQuery |
| 1742 | if isTrue, err = v.isQueryFromMixed(s2aCtx); isTrue { |
| 1743 | return false, err |
| 1744 | } |
| 1745 | |
| 1746 | // check if all subquery/withQuery from clauses are same |
| 1747 | for i, value := range s2aCtx.MapJoinTables[0] { |
| 1748 | // exit if no subquery/withQuery |
| 1749 | if len(value.Table) > 0 { |
| 1750 | break |
| 1751 | } |
| 1752 | |
| 1753 | if len(value.Alias) == 0 { // subquery has no identifier |
| 1754 | mapKey = v.generateKey(1, typeSubQuery, i) |
| 1755 | } else { |
| 1756 | mapKey, exist = s2aCtx.queryIdentifierSet[value.Alias] |
| 1757 | if !exist { |
| 1758 | err = fmt.Errorf("cannot find withQuery identifier: %s", value.Alias) |
| 1759 | return false, err |
| 1760 | } |
| 1761 | } |
| 1762 | |
| 1763 | isTrue, err = v.isSameFromTables(s2aCtx, mapKey) |
| 1764 | if !isTrue { |
| 1765 | return false, err |
| 1766 | } |
| 1767 | |
| 1768 | isTrue, err = v.isSameGroupBy(s2aCtx, mapKey) |
| 1769 | if !isTrue { |
| 1770 | return false, err |
| 1771 | } |
| 1772 | |
| 1773 | isTrue, err = v.isSameOrderBy(s2aCtx, mapKey) |
| 1774 | if !isTrue { |
| 1775 | return false, err |
| 1776 | } |
| 1777 | } |
| 1778 | |
| 1779 | return true, nil |
| 1780 | } |
| 1781 | |
| 1782 | // AQL requires that the first level query is either from tables or from subqueries/withQuery |
| 1783 | func (v *ASTBuilder) isQueryFromMixed(s2aCtx *SQL2AqlContext) (bool, error) { |
no test coverage detected