2016-08-10 15:39 GMT+02:00 Alexander Farber <alexander.far...@gmail.com>:
> > Thank you - > > On Wed, Aug 10, 2016 at 3:18 PM, Charles Clavadetscher < > clavadetsc...@swisspug.org> wrote: > >> >> #variable_conflict [use_column|use_variable] before BEGIN: >> >> - http://dba.stackexchange.com/questions/105831/naming-conflic >> t-between-function-parameter-and-result-of-join-with-using-clause >> - https://www.postgresql.org/docs/current/static/plpgsql-imple >> mentation.html >> >> > now I have changed my last statement to: > > SELECT w.word, max(w.score) as score > FROM _words w > GROUP BY w.word; > > And get the next error: > > ERROR: query has no destination for result data > HINT: If you want to discard the results of a SELECT, use PERFORM instead. > CONTEXT: PL/pgSQL function words_check_words(integer,integer,jsonb) line > 131 at SQL statement > > However I do not want to discard my results, but return them by my custom > function... > you should to use INTO clause probably - https://www.postgresql.org/docs/current/static/plpgsql-statements.html Regards Pavel > Regards > Alex > > >> > CREATE OR REPLACE FUNCTION words_check_words( >> > IN in_uid integer, >> > IN in_gid integer, >> > IN in_tiles jsonb) >> > RETURNS TABLE(word varchar, score integer) AS $func$ DECLARE >> > _tile jsonb; >> > _letter varchar; >> > _letter2 varchar; >> > _value integer; >> > _value2 integer; >> > _col integer; >> > _col2 integer; >> > _row integer; >> > _row2 integer; >> > _letters varchar[][]; >> > _values integer[][]; >> > _mult varchar[][]; >> > _factor integer; >> > _score integer; >> > _word varchar; >> > BEGIN >> > SELECT >> > g.letters, >> > g.values, >> > b.mult >> > INTO >> > _letters, >> > _values, >> > _mult >> > FROM words_games g, words_boards b WHERE >> > g.gid = in_gid AND >> > g.bid = b.bid AND >> > g.player1 = in_uid AND >> > -- and it is first player's turn >> > (g.played1 IS NULL OR g.played1 < g.played2); >> > >> > IF NOT FOUND THEN >> > SELECT >> > g.letters, >> > g.values, >> > b.mult >> > INTO >> > _letters, >> > _values, >> > _mult >> > FROM words_games g, words_boards b WHERE >> > g.gid = in_gid AND >> > g.bid = b.bid AND >> > g.player2 = in_uid AND >> > -- and it is first player's turn >> > (g.played2 IS NULL OR g.played2 < g.played1); >> > END IF; >> > >> > IF NOT FOUND THEN >> > RAISE EXCEPTION 'Game % not found for user %', in_gid, >> in_uid; >> > END IF; >> > >> > CREATE TEMPORARY TABLE _words (word varchar, score integer) ON >> COMMIT DROP; >> > >> > FOR _tile IN SELECT * FROM JSONB_ARRAY_ELEMENTS(in_tiles) >> > LOOP >> > _letter := _tile->>'letter'; >> > _value := (_tile->>'value')::int; >> > _col := (_tile->>'col')::int + 1; >> > _row := (_tile->>'row')::int + 1; >> > >> > _letters[_col][_row] := _letter; >> > -- multiply the new letter value with premium >> > _values[_col][_row] := _value * >> words_letter_mult(_mult[_col][_row]); >> > >> > _word := _letter; >> > _score := _values[_col][_row]; >> > _factor := words_word_mult(_mult[_col][_row]); >> > >> > -- go left and prepend letters >> > FOR _col2 IN REVERSE (_col - 1)..1 LOOP >> > _letter2 := _letters[_col2][_row]; >> > EXIT WHEN _letter2 IS NULL; >> > _value2 := _values[_col2][_row]; >> > _word := _letter2 || _word; >> > _score := _score + _value2; >> > _factor := _factor * >> words_word_mult(_mult[_col2][_row]); >> > END LOOP; >> > >> > -- go right and append letters >> > FOR _col2 IN (_col + 1)..15 LOOP >> > _letter2 := _letters[_col2][_row]; >> > EXIT WHEN _letter2 IS NULL; >> > _value2 := _values[_col2][_row]; >> > _word := _word || _letter2; >> > _score := _score + _value2; >> > _factor := _factor * >> words_word_mult(_mult[_col2][_row]); >> > END LOOP; >> > >> > IF LENGTH(_word) > 1 /* AND EXISTS SELECT 1 FROM >> words_nouns */ THEN >> > INSERT INTO _words(word, score) >> > VALUES (upper(_word), _score); >> > END IF; >> > >> > _word := _letter; >> > _score := _values[_col][_row]; >> > _factor := words_word_mult(_mult[_col][_row]); >> > >> > -- go up and prepend letters >> > FOR _row2 IN REVERSE (_row - 1)..1 LOOP >> > _letter2 := _letters[_col][_row2]; >> > EXIT WHEN _letter2 IS NULL; >> > _value2 := _values[_col][_row2]; >> > _word := _letter2 || _word; >> > _score := _score + _value2; >> > _factor := _factor * >> words_word_mult(_mult[_col][_row2]); >> > END LOOP; >> > >> > -- go down and append letters >> > FOR _row2 IN (_row + 1)..15 LOOP >> > _letter2 := _letters[_col][_row2]; >> > EXIT WHEN _letter2 IS NULL; >> > _value2 := _values[_col][_row2]; >> > _word := _word || _letter2; >> > _score := _score + _value2; >> > _factor := _factor * >> words_word_mult(_mult[_col][_row2]); >> > END LOOP; >> > >> > IF LENGTH(_word) > 1 /* AND EXISTS SELECT 1 FROM >> words_nouns */ THEN >> > INSERT INTO _words(word, score) >> > VALUES (upper(_word), _score); >> > END IF; >> > END LOOP; >> > >> > RAISE NOTICE 'letters = %', _letters; >> > RAISE NOTICE 'values = %', _values; >> > RAISE NOTICE 'mult = %', _mult; >> > >> > SELECT word, max(score) as score FROM _words GROUP BY word; END >> $func$ LANGUAGE plpgsql; >> > >> >