Revision 3017
Added by Aaron Marcuse-Kubitza over 12 years ago
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
sql.py: mk_insert_select(): INSERT IGNORE: Support RETURNING clause. Always return something to set the correct rowcount.