Ejemplo n.º 1
0
def p_select(t):
    '''select : SELECT list FROM table '''
    t[0] = node('QUERY')
    t[0].add(node('[SELECT]'))
    t[0].add(t[2])
    t[0].add(node('[FROM]'))
    t[0].add(t[4])
Ejemplo n.º 2
0
def p_select(t):
    """
    select : SELECT list FROM table WHERE lst ORDER BY list
            | SELECT list FROM table WHERE lst
            | SELECT list FROM table ORDER BY list
            | SELECT list FROM table
    """
    t[0] = node('QUERY')
    t[0].add(node('[SELECT]'))
    t[0].add(t[2])
    # print("+++++++++++")
    # print(type(t[2]))
    # print(t[2])
    # print("++++++++++++")
    t[0].add(node('[FROM]'))
    t[0].add(t[4])
    length = len(t)
    if (length == 10):
        t[0].add(node('[WHERE]'))
        t[0].add(t[6])
        t[0].add(node('[ORDER]'))
        t[0].add(node('[BY]'))
        t[0].add(t[9])
    elif (length == 7):
        t[0].add(node('WHERE'))
        t[0].add(t[6])
    elif (length == 8):
        t[0].add(node('[ORDER]'))
        t[0].add(node('[BY]'))
        t[0].add(t[7])
    else:  #length == 5
        pass
Ejemplo n.º 3
0
def p_table(t):
    """table : NAME
            | LP query RP
            | NAME AS NAME
            | table AS NAME
            | table COMMA table
    """
    length = len(t)
    t[0] = node('[TABLE]')
    if (length == 2):
        t[0].add(node(t[1]))
    else:
        if (t[1] == '('):
            t[0].add(t[2])
        else:
            if (t[2] == 'AS'):
                if (isinstance(t[1], node.__bases__)):  # NAME AS NAME
                    t[0].add(node(t[1]))
                else:
                    t[0].add(t[1])  # table AS NAME
                t[0].add(node('[AS]'))
                t[0].add(node(t[3]))
            else:  # table COMMA table
                t[0].add(t[1])
                t[0].add(node(t[2]))
                t[0].add(t[3])
Ejemplo n.º 4
0
def p_agg(t):
    """agg : SUM LP NAME RP
            | AVG LP NAME RP
            | COUNT LP NAME RP
            | MIN LP NAME RP
            | MAX LP NAME RP
            | COUNT LP '*' RP
    """
    t[0] = node('[agg]')
    if (len(t) == 2):
        t[0].add(node(t[1]))
    elif (t[1] == 'SUM'):
        t[0].add(node('[SUM]'))
    elif (t[1] == 'AVG'):
        t[0].add(node('[AVG]'))
    elif (t[1] == 'COUNT'):
        t[0].add(node('[COUNT]'))
    elif (t[1] == 'MIN'):
        t[0].add(node('[MIN]'))
    elif (t[1] == 'MAX'):
        t[0].add(node('[MAX]'))
    t[0].add(node(t[3]))
Ejemplo n.º 5
0
def p_list(t):
    ''' list : '*'
             | NAME'''

    t[0] = node('[FIELD]')
    t[0].add(node(t[1]))
Ejemplo n.º 6
0
def p_table(t):
    '''table : NAME'''
    t[0] = node('[TABLE]')
    t[0].add(node(t[1]))
Ejemplo n.º 7
0
def p_condition(t):
    """
    condition : NAME
    """
    t[0] = node('[condition]')
    t[0].add(t[1])
Ejemplo n.º 8
0
def p_list(t):
    """list : '*'
            | NAME
            | NAME DOT NAME
            | list COMMA list
            | list AND NAME
            | list OR NAME
            | agg
    """
    t[0] = node('[FIELD]')
    if (len(t) == 2):
        # t[0]的type都是sql_example1.node.node!!!!!!
        # if (t[1] == '*'):       # '*'
        #     t[0].add(node(t[1]))
        if (isinstance(t[1], node.__bases__)):  # agg
            t[0].add(node(t[1]))  # 需要写成node(t[1]),为什么???
        else:  # NAME / '*'
            t[0].add(node(t[1]))
        # print(type(t[0]))     #t[0]的type都是sql_example1.node.node!!!!!!
        # print("++++++++++")
    else:
        if (t[2] == '.'):  # 这里不能写为\. 为什么
            t[0].add(node(t[1]))
            t[0].add(node(t[2]))
            t[0].add(node(t[3]))
        elif (t[2] == ','):  # 这里不能写为\, 为什么
            t[0].add(t[1])
            t[0].add(node(t[2]))
            t[0].add(t[3])
        elif (t[2] == 'AND'):
            t[0].add(t[1])
            t[0].add(node('[AND]'))
            t[0].add(node(t[3]))
        elif (t[2] == 'OR'):
            t[0].add(t[1])
            t[0].add(node('[OR]'))
            t[0].add(node(t[3]))
Ejemplo n.º 9
0
def p_lst(t):
    """lst : condition
            | condition AND condition
            | condition OR condition
            | NAME BETWEEN NUMBER AND NUMBER
            | NAME IN LP query RP
            | NAME '<' agg
            | agg '<' NUMBER
            | NAME '>' agg
            | agg '>' NUMBER
            | NAME '=' agg
            | agg '=' NUMBER
    """
    t[0] = node('[lst]')
    if (len(t) == 2):
        t[0].add(t[1])
    elif (len(t) == 4):
        if (t[2] == 'AND'):
            t[0].add(t[1])
            t[0].add(node('[AND]'))
            t[0].add(t[3])
        elif (t[2] == 'OR'):
            t[0].add(t[1])
            t[0].add(node('[OR]'))
            t[0].add(t[3])
        elif (t[2] == '<'):
            if (isinstance(t[3], node.__bases__)):  # NAME '<' agg
                t[0].add(node(t[1]))
                t[0].add(node('<'))
                t[0].add(t[3])
            else:  # agg '<' NUMBER
                t[0].add(t[1])
                t[0].add(node('<'))
                t[0].add(node(t[3]))
        elif (t[2] == '>'):
            if (isinstance(t[3], node.__bases__)):  # NAME '>' agg
                t[0].add(node(t[1]))
                t[0].add(node('>'))
                t[0].add(t[3])
            else:  # agg '>' NUMBER
                t[0].add(t[1])
                t[0].add(node('>'))
                t[0].add(node(t[3]))
        elif (t[2] == '='):
            if (isinstance(t[3], node.__bases__)):  # NAME '=' agg
                t[0].add(node(t[1]))
                t[0].add(node('='))
                t[0].add(t[3])
            else:  # agg '=' NUMBER
                t[0].add(t[1])
                t[0].add(node('='))
                t[0].add(node(t[3]))
    elif (len(t) == 6):
        if (t[2] == 'IN'):
            t[0].add(node(t[1]))
            t[0].add(node(t[2]))
            t[0].add(t[4])
        else:
            t[0].add(node(t[1]))
            t[0].add(node(t[2]))
            t[0].add(node(t[3]))
            t[0].add(node(t[4]))
            t[0].add(node(t[5]))