Ps_contacts update issue

Hello. Asterisk version is 16.15.1
pjsip enitties are in realtime
softphone is connected success and add record to ps_contacts:

select * from asterisk.ps_contacts;
-[ RECORD 1 ]--------+--------------------------------------------------------------------------
id                   | 8001^3B@d8ecf55d261259430438629aa0c32576
uri                  | sip:8001@^3Bob^3Bx-ast-orig-host=
expiration_time      | 1625056306
qualify_frequency    | 60
outbound_proxy       | 
path                 | 
user_agent           | MicroSIP/3.20.5
qualify_timeout      | 3
reg_server           | 
authenticate_qualify | no
via_addr             |
via_port             | 64679
call_id              | ddd78192a6ee4bbbbbc7db2a436c86b9
endpoint             | 8001
prune_on_boot        | no

but approximetely in 5 minutes have issue with update of ps_contacts. and asterisk removed endpoint

[Jun 30 15:31:41] WARNING[74152]: res_config_odbc.c:540 update_odbc: Key field 'id' does not exist in table 'ps_contacts@ics-postgresql'.  Update will fail
[Jun 30 15:31:41] WARNING[74152]: res_odbc.c:538 ast_odbc_print_errors: SQL Execute returned an error: 42601: ERROR: syntax error at or near "WHERE";
Error while preparing parameters
[Jun 30 15:31:41] WARNING[74152]: res_odbc.c:433 ast_odbc_prepare_and_execute: SQL Execute error -1!
[Jun 30 15:31:41] ERROR[74152]: res_pjsip_registrar.c:842 register_aor_core: Failed to update contact 'sip:8001@;ob;x-ast-orig-host=' expiration time to 300 seconds.
[Jun 30 15:31:41]     -- Removed contact 'sip:8001@;ob;x-ast-orig-host=' from AOR '8001' due to registration failure
[Jun 30 15:31:41]   == Contact 8001/sip:8001@;ob;x-ast-orig-host= has been deleted
[Jun 30 15:31:41]   == Endpoint 8001 is now Unreachable

postgresql logs:
2021-06-30 15:31:41.029 EEST,"ics","ics",70000,"",60dc3138.11170,3008,"PARSE",2021-06-30 11:54:16 EEST,11/6988,0,ERROR,42601,"syntax error at or near ""WHERE""",,,,,,"UPDATE ps_contacts SET WHERE id=$1",25,,""

Please help to resolve this issue.

The syntax error is that the SQL doesn’t say what fields have to be set. As to why Asterisk would generate such a bad request, I don’[t know,

It should say …SET field=value… WHERE…

yes. I see that sql request is bad grammarly. but that sql is generating from asterisk source and I dont know what’s cause of that issue.