Size: a a a

pgsql – PostgreSQL

2021 February 07

AT

Alexander Thesecret in pgsql – PostgreSQL
Для меня кажется логичным, что hash(1) == 1, соответственно 1 % 4 == 1
источник

AT

Alexander Thesecret in pgsql – PostgreSQL
Соответственно значения в примере выше должны были равномерно заполнить таблицы, по одному в каждую
источник

mm

miruzzy miruzzy in pgsql – PostgreSQL
А почему бы не использовать разбиение по списку ?
create table test(
id bigint primary key not null
) partition by list(id%4);
CREATE TABLE test_1 PARTITION OF test FOR VALUES in  ( 1 );

Код не рабочий, передаю смысл
источник

AT

Alexander Thesecret in pgsql – PostgreSQL
miruzzy miruzzy
А почему бы не использовать разбиение по списку ?
create table test(
id bigint primary key not null
) partition by list(id%4);
CREATE TABLE test_1 PARTITION OF test FOR VALUES in  ( 1 );

Код не рабочий, передаю смысл
Честно говоря, я думал, что по хешу будет работать именно так 🙂
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Alexander Thesecret
Для меня кажется логичным, что hash(1) == 1, соответственно 1 % 4 == 1
Эээ... нет же? Это было бы так без хеш-функции.
Какая-то из hashint8* используется, скорее всего (если хотите в исходниках поискать).
источник

mm

miruzzy miruzzy in pgsql – PostgreSQL
miruzzy miruzzy
Привет всем, подскажите, пожалуйста, как правильно сделать вставку  в поле bytea

Есть таблица
create table testtable( col bytea[5])


Так-же у меня есть 2 переменные типа smallint
 a smallint, b smallint


Я хочу вставить в таблицу данные в виде двоичного формата
Только вот даже не знаю, как правильно это сформулировать

Объясню на примере:

a = 3 (0x0003)
b = 1 (0x0001)
--  Добавляем нули впереди, чтобы видно было ограничение smallint

insert into testtable( col ) values (  <Что тут писать> ? );
Чтобы вставилось следующее:
0x00 00 03 00 01     -- отделю байты пробелами, чтобы было понятней

т.е.  в 1-0 байты записываем значение b, в 3-2 байты - a, 4 байт оставляем 0

Понимаю, что надо использовать &, но только как правильно ?
Yaroslav  не подскажешь тут?
источник

D

Dmitriy in pgsql – PostgreSQL
miruzzy miruzzy
Привет всем, подскажите, пожалуйста, как правильно сделать вставку  в поле bytea

Есть таблица
create table testtable( col bytea[5])


Так-же у меня есть 2 переменные типа smallint
 a smallint, b smallint


Я хочу вставить в таблицу данные в виде двоичного формата
Только вот даже не знаю, как правильно это сформулировать

Объясню на примере:

a = 3 (0x0003)
b = 1 (0x0001)
--  Добавляем нули впереди, чтобы видно было ограничение smallint

insert into testtable( col ) values (  <Что тут писать> ? );
Чтобы вставилось следующее:
0x00 00 03 00 01     -- отделю байты пробелами, чтобы было понятней

т.е.  в 1-0 байты записываем значение b, в 3-2 байты - a, 4 байт оставляем 0

Понимаю, что надо использовать &, но только как правильно ?
INSERT INTO testtable(col)  VALUES (decode('aaabbbfff', 'hex'))
источник

mm

miruzzy miruzzy in pgsql – PostgreSQL
Dmitriy
INSERT INTO testtable(col)  VALUES (decode('aaabbbfff', 'hex'))
так а как слить 2 переменные smallint в одну последовательность байт ?
источник

D

Dmitriy in pgsql – PostgreSQL
miruzzy miruzzy
так а как слить 2 переменные smallint в одну последовательность байт ?
А вот это не знаю)
источник

mm

miruzzy miruzzy in pgsql – PostgreSQL
ну мне именно это и надо )))
источник

mm

miruzzy miruzzy in pgsql – PostgreSQL
я могу это сделать на С, но на pl/psql не могу
источник

D

Dmitriy in pgsql – PostgreSQL
miruzzy miruzzy
ну мне именно это и надо )))
Да, неправильно вопрос понял
источник

AT

Alexander Thesecret in pgsql – PostgreSQL
Yaroslav Schekin
Эээ... нет же? Это было бы так без хеш-функции.
Какая-то из hashint8* используется, скорее всего (если хотите в исходниках поискать).
Ну почему же? Это вопрос реализации функции hash(). В Java, например, hashCode() от числа равен ему самому (до тех пор, пока само число не вылазит за integer).

Ну да ладно, проблемы здесь нет. Просто я немного не ожидал, что hash() в PostgreSQL работает хитрее и, скорее всего в результате на большом количестве размажет данные равномернее.

Спасибо за помощь!
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
miruzzy miruzzy
Привет всем, подскажите, пожалуйста, как правильно сделать вставку  в поле bytea

Есть таблица
create table testtable( col bytea[5])


Так-же у меня есть 2 переменные типа smallint
 a smallint, b smallint


Я хочу вставить в таблицу данные в виде двоичного формата
Только вот даже не знаю, как правильно это сформулировать

Объясню на примере:

a = 3 (0x0003)
b = 1 (0x0001)
--  Добавляем нули впереди, чтобы видно было ограничение smallint

insert into testtable( col ) values (  <Что тут писать> ? );
Чтобы вставилось следующее:
0x00 00 03 00 01     -- отделю байты пробелами, чтобы было понятней

т.е.  в 1-0 байты записываем значение b, в 3-2 байты - a, 4 байт оставляем 0

Понимаю, что надо использовать &, но только как правильно ?
Это не поле bytea, это массив из пяти bytea.
Что Вам на самом деле нужно?
источник

DI

Dmitry Igrishin in pgsql – PostgreSQL
Yaroslav Schekin
Это не поле bytea, это массив из пяти bytea.
Что Вам на самом деле нужно?
Уточнение: текущая реализация не ограничивает размер массивов. Поэтому 5 в  bytea[5] - это так, для документации.
источник

mm

miruzzy miruzzy in pgsql – PostgreSQL
Yaroslav Schekin
Это не поле bytea, это массив из пяти bytea.
Что Вам на самом деле нужно?
Суть вот в чём

была таблица логирования
create table .... (
a smallint,
b smallint,
c smallint);


Но все эти переменные имеют значения 0..100 )
Что в принципе может помещаться в 1 байт

Вот и мы хотим  3 2-байтовых числа запихнуть в колонку с 3-мя байтами
источник

mm

miruzzy miruzzy in pgsql – PostgreSQL
Dmitry Igrishin
Уточнение: текущая реализация не ограничивает размер массивов. Поэтому 5 в  bytea[5] - это так, для документации.
не обязательно bytea[5]

мне нужна реализация, описанная сообщением выше
источник

DI

Dmitry Igrishin in pgsql – PostgreSQL
miruzzy miruzzy
не обязательно bytea[5]

мне нужна реализация, описанная сообщением выше
Вы с клиента хотите это сделать?
источник

mm

miruzzy miruzzy in pgsql – PostgreSQL
Dmitry Igrishin
Вы с клиента хотите это сделать?
нет, именно в БД, в функциях на pl/psql
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
miruzzy miruzzy
Суть вот в чём

была таблица логирования
create table .... (
a smallint,
b smallint,
c smallint);


Но все эти переменные имеют значения 0..100 )
Что в принципе может помещаться в 1 байт

Вот и мы хотим  3 2-байтовых числа запихнуть в колонку с 3-мя байтами
Ну так, например (если я правильно понял):
SELECT set_byte('x', 0, 1) || set_byte('x', 0, 2) || set_byte('x', 0, 3);

> не обязательно bytea[5]

Это массив из пяти bytea (условно, как выше написали), каждое произвольной длины, а не bytea длины 5, ещё раз.
источник