Project

General

Profile

« Previous | Next » 

Revision 3017

sql.py: mk_insert_select(): INSERT IGNORE: Support RETURNING clause. Always return something to set the correct rowcount.

View differences:

lib/sql.py
649 649
        
650 650
        return query
651 651
    
652
    return_type = 'unknown'
653
    if returning != None: return_type = returning.to_str(db)+'%TYPE'
654
    
652 655
    lang = 'sql'
653 656
    if ignore:
657
        assert cols != None
658
        # Always return something to set the correct rowcount
659
        if returning == None: returning = sql_gen.NamedCol('NULL', None)
660
        
654 661
        embeddable = True # must use function
655 662
        lang = 'plpgsql'
656
        
657
        assert cols != None
658 663
        row = [sql_gen.Col(c.name, 'row') for c in cols]
659 664
        
660 665
        query = '''\
661 666
DECLARE
667
    returning_ '''+return_type+''';
662 668
    row '''+table.to_str(db)+'''%ROWTYPE;
663 669
    cur CURSOR FOR
664 670
'''+select_query+'''
......
681 687
                EXIT outer WHEN NOT FOUND;
682 688
                
683 689
'''+mk_insert(sql_gen.Values(row).to_str(db))+'''
690
INTO STRICT returning_
684 691
;
692
                IF FOUND THEN
693
                    RETURN NEXT returning_;
694
                END IF;
685 695
            END LOOP;
686 696
        EXCEPTION
687 697
            WHEN unique_violation THEN NULL; -- outer loop continues to next row
......
694 704
    else: query = mk_insert(select_query)
695 705
    
696 706
    if embeddable:
697
        return_type = 'void'
698
        if returning != None:
699
            return_type = 'SETOF '+returning.to_str(db)+'%TYPE'
700
        
701 707
        # Create function
702 708
        function_name = sql_gen.clean_name(first_line)
703 709
        while True:
......
706 712
                
707 713
                function_query = '''\
708 714
CREATE FUNCTION '''+function.to_str(db)+'''()
709
RETURNS '''+return_type+'''
715
RETURNS SETOF '''+return_type+'''
710 716
LANGUAGE '''+lang+'''
711 717
AS $$
712 718
'''+query+'''

Also available in: Unified diff