Re: jsonb_array_length: ERROR: 22023: cannot get array length of ascalar - Mailing list pgsql-general
From | Adrian Klaver |
---|---|
Subject | Re: jsonb_array_length: ERROR: 22023: cannot get array length of ascalar |
Date | |
Msg-id | 0b0c6908-1b0d-0f3f-4dd3-d6000326b02c@aklaver.com Whole thread Raw |
In response to | Re: jsonb_array_length: ERROR: 22023: cannot get array length of a scalar (Alexander Farber <alexander.farber@gmail.com>) |
List | pgsql-general |
On 03/02/2018 06:42 AM, Alexander Farber wrote: > Hi Adrian, I 100% agree that nobody except me should debug my huge > stored function, but if you look at my PostgreSQL 10.3 log - > Which proves what has already been proven, that at least some of the data is correct. The issue is data that is not correct as evidenced by the error message: select mid, jsonb_array_length(tiles) from words_moves where gid=609; ERROR: 22023: cannot get array length of a scalar LOCATION: jsonb_array_length, jsonfuncs.c:1579 This is not going to get solved until you identify the 'bad' tiles data. > 2018-03-02 15:30:33.646 CET [16693] LOG: duration: 0.110 ms parse > <unnamed>: SELECT out_uid AS uid, out_fcm AS fcm, out_apns AS apns, > out_adm AS adm, out_body AS body FROM words_play_game($1::int, > $2::int, $3::jsonb) > 2018-03-02 15:30:33.646 CET [16693] LOG: duration: 0.058 ms bind > <unnamed>: SELECT out_uid AS uid, out_fcm AS fcm, out_apns AS apns, > out_adm AS adm, out_body AS body FROM words_play_game($1::int, > $2::int, $3::jsonb) > 2018-03-02 15:30:33.646 CET [16693] DETAIL: parameters: $1 = '7', $2 = > '609', $3 = > '[{"col":0,"letter":"К","row":3,"value":2},{"col":0,"letter":"И","row":4,"value":1}]' > 2018-03-02 15:30:33.646 CET [16693] LOG: execute <unnamed>: SELECT > out_uid AS uid, out_fcm AS fcm, out_apns AS apns, out_adm AS adm, > out_body AS body FROM words_play_game($1::int, $2::int, $3::jsonb) > 2018-03-02 15:30:33.646 CET [16693] DETAIL: parameters: $1 = '7', $2 = > '609', $3 = > '[{"col":0,"letter":"К","row":3,"value":2},{"col":0,"letter":"И","row":4,"value":1}]' > > I just pass as the 3rd argument in_tiles to my stored function: > '[{"col":0,"letter":"К","row":3,"value":2},{"col":0,"letter":"И","row":4,"value":1}]' > > and then take the in_tiles and store it unchanged in the words_moves table: > > INSERT INTO words_moves ( > action, > gid, > uid, > played, > tiles > ) VALUES ( > 'play', > in_gid, > in_uid, > CURRENT_TIMESTAMP, > in_tiles > ) RETURNING mid INTO STRICT _mid; > > Does anybody happen to see what could I do wrong there? > > Thank you for any hints > Alex > > P.S: Here my stored fuinction: > https://gist.github.com/afarber/88a832a1b90a8940764ad69b2b761914 > Here my table: > https://gist.github.com/afarber/06cc37114ff8dd14f05077f312904361 > And here is how I call the stored function from Java: > > String SQL_PLAY_GAME = > "SELECT " + > "out_uid AS uid, " + > "out_fcm AS fcm, " + > "out_apns AS apns, " + > "out_adm AS adm, " + > "out_body AS body " + > "FROM words_play_game(?::int, ?::int, ?::jsonb)"; > > private void handlePlay(int gid, String tiles) throws SQLException, > IOException { > LOG.info("handlePlay: {} -> {} {}", mUid, gid, tiles); > try (Connection db = DriverManager.getConnection(DATABASE_URL, > DATABASE_USER, DATABASE_PASS); > PreparedStatement st = > db.prepareStatement(SQL_PLAY_GAME)) { > st.setInt(1, mUid); > st.setInt(2, gid); > st.setString(3, tiles); > runPlayerAction(st, gid); > } > } -- Adrian Klaver adrian.klaver@aklaver.com
pgsql-general by date: