Title: Conditional DELETE from a table with a DATE column fails · Issue #4466 · googleapis/google-cloud-java · GitHub
Open Graph Title: Conditional DELETE from a table with a DATE column fails · Issue #4466 · googleapis/google-cloud-java
X Title: Conditional DELETE from a table with a DATE column fails · Issue #4466 · googleapis/google-cloud-java
Description: Thanks for stopping by to let us know something could be better! Please include as much information as possible: Environment details OS: N/A Java version: 1.8.0_162 google-cloud-java version(s): google-cloud-spanner 0.57.0-beta Steps to ...
Open Graph Description: Thanks for stopping by to let us know something could be better! Please include as much information as possible: Environment details OS: N/A Java version: 1.8.0_162 google-cloud-java version(s): go...
X Description: Thanks for stopping by to let us know something could be better! Please include as much information as possible: Environment details OS: N/A Java version: 1.8.0_162 google-cloud-java version(s): go...
Opengraph URL: https://github.com/googleapis/google-cloud-java/issues/4466
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Conditional DELETE from a table with a DATE column fails","articleBody":"Thanks for stopping by to let us know something could be better!\r\n\r\nPlease include as much information as possible:\r\n\r\n#### Environment details\r\n\r\n- OS: N/A\r\n- Java version: 1.8.0_162\r\n- google-cloud-java version(s): google-cloud-spanner 0.57.0-beta\r\n\r\n#### Steps to reproduce\r\n\r\n1. Create table with schema including a DATE column eg. \r\n```\r\nCREATE TABLE geo_views (\r\n\tcity STRING(MAX) NOT NULL,\r\n\tclient_id INT64 NOT NULL,\r\n\tdate DATE NOT NULL,\r\n\tdomain STRING(MAX) NOT NULL,\r\n\turl STRING(MAX) NOT NULL,\r\n\tpageviews INT64 NOT NULL,\r\n) PRIMARY KEY (client_id, domain, date DESC, city, url)\r\n```\r\n2. Add some records.\r\n3. Delete from the table with a `WHERE` clause eg. `DELETE FROM geo_views WHERE client_id \u003e 1000`\r\n\r\n#### Stacktrace\r\n\r\nNote this stacktrace comes from a delete when using the Olaviate Spanner JDBC driver which includes the latest Google Spanner client code as a shaded lib:\r\n\r\n```\r\njava.lang.AssertionError: Illegal key part: class nl.topicus.jdbc.shaded.com.google.cloud.Date\r\n\tat nl.topicus.jdbc.shaded.com.google.cloud.spanner.Key.toProto(Key.java:287)\r\n\tat nl.topicus.jdbc.shaded.com.google.cloud.spanner.KeySet.appendToProto(KeySet.java:204)\r\n\tat nl.topicus.jdbc.shaded.com.google.cloud.spanner.Mutation.toProto(Mutation.java:381)\r\n\tat nl.topicus.jdbc.shaded.com.google.cloud.spanner.SpannerImpl$TransactionContextImpl.commit(SpannerImpl.java:1394)\r\n\tat nl.topicus.jdbc.shaded.com.google.cloud.spanner.SpannerImpl$TransactionRunnerImpl.runInternal(SpannerImpl.java:1299)\r\n\tat nl.topicus.jdbc.shaded.com.google.cloud.spanner.SpannerImpl$TransactionRunnerImpl.run(SpannerImpl.java:1242)\r\n\tat nl.topicus.jdbc.shaded.com.google.cloud.spanner.SessionPool$PooledSession$1.run(SessionPool.java:398)\r\n\tat nl.topicus.jdbc.transaction.TransactionThread.run(TransactionThread.java:115)\r\n```\r\n\r\n#### Code snippet\r\n\r\nI believe this error is caused by lack of support for the `Date` type in the `if` statement here: https://github.com/googleapis/google-cloud-java/blob/master/google-cloud-clients/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Key.java#L285\r\n\r\n```java\r\n ListValue toProto() {\r\n ListValue.Builder builder = ListValue.newBuilder();\r\n for (Object part : parts) {\r\n if (part == null) {\r\n builder.addValues(NULL_PROTO);\r\n } else if (part instanceof Boolean) {\r\n builder.addValuesBuilder().setBoolValue((Boolean) part);\r\n } else if (part instanceof Long) {\r\n builder.addValuesBuilder().setStringValue(part.toString());\r\n } else if (part instanceof Double) {\r\n builder.addValuesBuilder().setNumberValue((Double) part);\r\n } else if (part instanceof String) {\r\n builder.addValuesBuilder().setStringValue((String) part);\r\n } else if (part instanceof ByteArray) {\r\n builder.addValuesBuilder().setStringValue(((ByteArray) part).toBase64());\r\n } else if (part instanceof Timestamp) {\r\n builder.addValuesBuilder().setStringValue(((Timestamp) part).toString());\r\n } else {\r\n throw new AssertionError(\"Illegal key part: \" + part.getClass());\r\n }\r\n }\r\n return builder.build();\r\n }\r\n```\r\n\r\n#### External references such as API reference guides used\r\n\r\nSee also: https://github.com/olavloite/spanner-jdbc/issues/134\r\n\r\n#### Any additional information below\r\n\r\nI looked in the tests for this code but there aren't any because `Key.toProto` is not public and only used by higher level code in the client package. As best I can tell only an actual delete using a key based condition will trigger its use.\r\n","author":{"url":"https://github.com/O1O1O1O","@type":"Person","name":"O1O1O1O"},"datePublished":"2019-02-07T20:10:46.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},"url":"https://github.com/4466/google-cloud-java/issues/4466"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:da4f4021-e20b-4d5a-7996-03332f6bf128 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | D98A:8709C:7A3B13:A6DDEE:6A4D69CA |
| html-safe-nonce | ef0d6b52a24b14b9a411b260bc9eec90fda99f3f63dae643ac5276b91d635daa |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJEOThBOjg3MDlDOjdBM0IxMzpBNkRERUU6NkE0RDY5Q0EiLCJ2aXNpdG9yX2lkIjoiNTYzMDY0ODQ3NDEwNzk5NjYxOCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 7742e837bf3f55c574865af8a07049eb9e5ac2e2bffe7d22df95c942bb17b631 |
| hovercard-subject-tag | issue:407877098 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/googleapis/google-cloud-java/4466/issue_layout |
| twitter:image | https://opengraph.githubassets.com/55593088a46f4474548db662ebab0e1d1710a186538864ac50eac2f49fd1d61e/googleapis/google-cloud-java/issues/4466 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/55593088a46f4474548db662ebab0e1d1710a186538864ac50eac2f49fd1d61e/googleapis/google-cloud-java/issues/4466 |
| og:image:alt | Thanks for stopping by to let us know something could be better! Please include as much information as possible: Environment details OS: N/A Java version: 1.8.0_162 google-cloud-java version(s): go... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | O1O1O1O |
| hostname | github.com |
| expected-hostname | github.com |
| None | 7db3950e3f59095e20a9789440c3dd554efc62d434882ead06ae05b5815605b9 |
| turbo-cache-control | no-preview |
| go-import | github.com/googleapis/google-cloud-java git https://github.com/googleapis/google-cloud-java.git |
| octolytics-dimension-user_id | 16785467 |
| octolytics-dimension-user_login | googleapis |
| octolytics-dimension-repository_id | 26181278 |
| octolytics-dimension-repository_nwo | googleapis/google-cloud-java |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 26181278 |
| octolytics-dimension-repository_network_root_nwo | googleapis/google-cloud-java |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | cd8f6a71db61d6012a0cbb134be844fdbe9b8a45 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width